В предыдущих сериях…
Итак, мы условились, что работать будем с микроконтроллером 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