IAR и STM32 CORTEX M0. Часть 0x03, Программируем без программатора

В предыдущих сериях…
Итак, мы условились, что работать будем с микроконтроллером STM32F030F4P6, настроили под него IAR и даже спаяли полигоны для испытаний (попутно курнув мануалы). Предположу также, что у вас уже есть UART-шнурочек для компьютера. Если нет, то советую спаять, потому что без него ничего не получится — тут вам помогут статьи на нашем сайте, а также max232 [1] (для com-порта), FT232RL [2] (для usb) или CP2102 [3] (тоже usb, но гораздо дешевле). Готово? Идем дальше!

1. Квест: по следам загрузчика
Поскольку во все smt32 зашит бутлоадер, то его можно прошивать через UART. Что для этого нужно? Идем в даташит, в разделе 3.3 Boot modes (стр. 12) нам честно говорят:

The boot loader is located in System Memory. It is used to reprogram the Flash memory by using USART on pins PA14/PA15 or PA9/PA10.

Ну, то есть, программировать можно, заюзав порты PA14/PA15, либо PA9/PA10. Мы выбираем второй вариант. Почему? Думаю, что отсутствие порта PA15 — достаточно веская причина 🙂

Открываем теперь RM. Там так же ищем раздел, связанный с загрузчиком (Boot). Ага, вот он: раздел 2.5 Boot configuration (стр. 52). Пролистываем чуть ниже и находим заветный «Embedded boot loader». Там пишут, что можно прошивать через UART (это мы уже знаем) и… посылают нас к следующему мануалу: AN2606. Ну, раз посылают, придется идти. Этот аппнот можно скачать в конце статьи, а впрочем, вы уже знаете, где его брать [4].

Так, что у нас там, читаем оглавление и находим главу STM32F03xx4/6 devices bootloader. Не успеваем открыть страницу 29, как нам предлагают вернуться в начало:

The STM32F03xx4/6 bootloader is activated by applying pattern2 (described in Table 2: Bootloader activation patterns).

Ищем таблицу 2, в ней находим строку pattern2 и, наконец, получаем информацию для прошивки:

Boot0(pin) = 1 and nBoot1(bit) = 1

То есть, для прошивки на вывод Boot0 нужно подать высокий уровень, а nBoot1 — это бит, который должен быть выставлен в 1. Как выставить nBoot1 в единицу? Для начала неплохо бы проверить, а какое у него значение по умолчанию. Открываем снова RM, после недолгих поисков находим таблицу 12 (стр. 77):

Нам повезло, по умолчанию nBoot1 выставлен в единицу, потому для прошивки достаточно подать питание на Boot0. Начинаем прошивку!

2. Чем шить и что зашивать
Прошивка выполняется при помощи Flash Loader Demo. Ранее эта прога очень глючно работала с Cortex M0, так что советую скачать последнюю версию (в конце статьи или на официальном сайте st,com [5]). Софт бесплатный, установка стандартная. Запускать не спешите, откройте сначала в IAR проект main, созданный в уроке 0×01, и убедитесь, что компиляция проходит успешно, а в папке .DebugExe (в корне проекта) появляется после этого файл main.bin. Получилось?

Теперь подключаем переходник UART к компьютеру, далее RX-провод цепляем на PA9 (TX), провод TX — на PA10 (RX) и землю — на VSS. Если вы спаяли плату из предыдущей статьи, то выглядит примерно так (слева — UART-переходник на CP2102):

Нажимаем на переключатели BOOT0 и ON/OFF. Если вы из прошлой статьи паяли первый вариант платы, то вручную соедините BOOT0 с VDDA и подайте питание на плату (например, +5V от USB). Теперь все готово к прошивке, запускаем Flash Loader Demo:

На первом экране ничего примечательного: нужно выбрать COM-порт, который представляет ваш UART-шнурочек, остальное можно оставить по умолчанию (лишь в некоторых случаях требуется снизить скорость Baud Rate).

Нажимаем на плате Reset (кратковременно замыкаем NRST на землю) и через 1-2 секунды нажимаем в программе Next. Не взлетело? Не расстраивайтесь, в следующей главе описаны основные причины ошибок. Если же все сделано правильно, то вам зеленый свет:

Жмем ещё раз Next, тип микроконтроллера определится автоматически:

Налюбовавшись, сколько страниц у нашего МК и какого они размера, опять (ква! снова!) нажимаем Next. Мы почти у финиша — перед нами окно загрузки прошивки:

Нажмите Download to device и загрузите файл main.bin. Также в этом окне можно слить прошивку (если она не защищена). Полезно ещё поставить галочку «Verify after download» — проверка, что прошивка прошла без ошибок. Имеются и другие опции, будем их рассматривать по мере надобности. А пока жмем все тот же Next и наслаждаемся прошивкой:

3. Troubleshooting
Что делать, если программа в упор не видит вашу плату? Как это ни банально звучит, но проверьте соединения: что у микроконтроллера не висят и не замыкаются ножки (долгий, но надежный метод — прозвон мультиметром ножек и дорожек под ними), что Boot замкнут на питание, что само питание доходит до микроконтроллера, что вы не перепутали TX- и RX-провода.

Если все это в порядке, то вот вам ещё список типичных ошибок:

  • Общая земля. Моя любимая ошибка. К примеру, вы спаяли UART-шнурочек, от него идет два провода: TX и RX. Вы их подсоединяете к своей схеме, которая питается от батарейки, и… ничего не работает. Почему? Да потому что вы поленились вывести с UART-шнурка провод GND. Решение: соединить GND шнурка с GND вашей платы.
  • Ещё одна причина ошибок — нестабильное питание микросхемы. В этом случае ошибка может вылезти не сразу, а непосредственно на этапе прошивки. Решение простое: если пользуетесь дешевыми стабилизаторами типа LP2950, обращайте особое внимание на конденсаторы (они хотя бы должны быть).
  • Ошибка «…….. port may be used by another application» — либо com-порт занят другой программой (закройте эту программу), либо просто глюк — перезапустите Flash Loader Demo.
  • Слишком быстро нажимаете Next после резета. Решение: после нажатия на кнопку Reset, надо подождать 2-3 секунды и лишь потом жать Next.
  • Слишком высокая скорость Baud Rate. Решение: снизить ее.
  • Глючный UART-шнурочек. Этим грешит, например, USB-переходник на CP2102. Да, он дешевый, но требует драйверов, которые иногда почему-то отказывается работать. Решение: замкнуть RX/TX на переходнике и проверить любой терминальной программой [6]. Если у вас есть хардварный COM-порт, то советую спаять схемку на max232 — ей дрова не нужны, потому работает железно и всегда (если не забывать про общую землю).
  • Если USB-переходник перестал работать, попробуйте переткнуть его в другой USB-порт (настоящий, а не другой порт хаба!). Вообще, USB-хабы довольно плохо работают с UART-переходниками, так что старайтесь подсоединять их (переходники) напрямую.
  • Не хватает питания — если плата работает от батарейки. Решение (вы не поверите!): заменить батарейку.
  • Выбран не тот com-порт — такое тоже бывает 🙂

Список открытый, в комментариях прошу добавить свои варианты. Ну и напоследок…

4. Елочка, гори Диодик, мигай!
Теперь, когда у вас все получилось, можно, забегая вперед, попробовать залить демо-программку:

#include «stm32f0xx.h»

void delay (int a);

void main(void)
{

/* GPIOC Periph clock enable */
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;

GPIOA->MODER |= (GPIO_MODER_MODER3_0 | GPIO_MODER_MODER4_0) ;
/* Configure PC3 and PC4 in output mode */

GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_3 | GPIO_OTYPER_OT_4) ;
// push pull mode

while (1) {
GPIOA->BSRR |= GPIO_ODR_3;
GPIOA->BRR |= GPIO_ODR_4;
delay(500000);
GPIOA->BRR |= GPIO_ODR_3;
GPIOA->BSRR |= GPIO_ODR_4;
delay(500000);
}

}

void delay (int a){
int i,j;
for (i=0 ; i < a ; i++){
j++;
}
return;
}

 

Компилируем, заливаем, после заливки отключаем Boot0. Теперь подключите два светодиода: к PA3 и к PA4. Нажмите Reset. Лампочки должны мигать по очереди. Как-то так:

О том, что за магия тут происходит, читайте в следующей статье… Хотя… Нет, сначала добавим ещё автоматизации.

1. http://easyelectronics.ru/svyaz-mikrokontrollera-s-kompyuterom-cherez-rs232.html
2. http://easyelectronics.ru/preobrazovatel-usb-uart-na-ftdi-ft232rl.html
3. http://we.easyelectronics.ru/electro-and-pc/cp2102-preobrazovatel-usb-uart-za-45-rubley.html
4. http://www.st.com/en/microcontrollers/stm32f030f4.html?s_searchtype=partnumber#tabHeader-2
5. http://www.st.com/en/development-tools/flasher-stm32.html
6. http://easyelectronics.ru/terminalnye-programmy.html

Добавить комментарий

Ваш адрес email не будет опубликован.