Простейшие программаторы для прошивки stm32. Прошивка внешнего контроллера при помощи stm32 discovery - SWD. Приступаем к работе

Собственно можно сказать: "А на кой он мне нужен, когда есть Discovery". С какой-то стороны да... Но. Первый камень в огород. Собирал схему на Discovery1 для работы с параллельной ОЗУ на 1 Мб. 40 проводков. Отлаживал, отлаживал и бац, нужно залить другой контроллер. Ё-ё-ё мое. Все разбери, после перепрошивки собери. Благо есть еще Discovery4. Но та же проблема. Второй камень. Discovery голая плата. Как-то ваяя очередной шедевр в 60 проводков я где-то на что-то наехал и бум. Коротнул Discover-ку напрочь. Начал разбираться. Короче коротыш попал на входное питание от USB. Слава богу или скорее инженеру ST за то что он поставил диод. Тот принял все на себя и порт не сгорел. Все бы хорошо, да вот надпись 60 на диоде мне ничего не говорила. Полез на сайт ST, нашел телефон поддержки, звоню. Але говорю, нужон наминал диёда. А мне в ответ, не волнуйтесь, давайте ка вашу почту. Даю адрес и бац мне скидывают документацию на Discovery. Схемы, платы, описание. Ну просто сказка. Я тут же нашел диод, впаял и о чудо, все заработало. После этого случая дабы не повторить содеянное я решил прикупить программатор от ST. Я думаю все его видели, такое белое яйцо с эмблемкой. Но так и не купил. Цена, какая цена. За такую цену можно купить 3 Discovery и иметь сразу три программатора. Немного подумав я вспомнил про схему которую мне скинули. Там же есть та самая... Открыл файл, заценил. Хмы, а в первой платке-то ST-LINK и усе, а интересно что в Discovery4. Взял плату и вижу надпись на ней. www.st.com/stm32f4-discovery. Так... Зашел по ссылке, куча файлов и о чудо, архив с документацией и схемой. С надеждой решил зайти на страничку родного программатора. Ага. Ща... Так вам и дали схему. В общем решил довольствоваться схемой от Discovery4.
Вот она.

Изучил сей манускрипт и понял что тут чего-то не хватат. Полез в ейнтернет и вижу что на всех просторах есть только две схемы. Одна ну ооочень замороченная, другая слишком простая (тока SWD). Не думаю, надо их скрестить. Посидел, покумекал, порисовал и радил вот такое чудо.

На проводок не обращайте внимания. Это я не запаял перемычку, а узрел после впайки разъема. Так как перемычка оказалась под разъемом и подлезть к ней не удалось, я припаял проводок. Если пропаять перемычку, то провод не нужен. После сборки его нужно прошить. Ха. Вот тут затык. Где взять прошивку для МК. Полазив в интернете я нарыл какую-то кривую прошивку, которая не работает, но имеет одну важную вещь. С этой прошивкой программатор цепляется к родному ST-шному драйверу и отдается на обновление прошивкой от ST. То есть после прошивки обнавляемся и все. И так к делу. Если вы еще не собрали плату, то дальше читать нет смысла. Для тех кто спаял, смотрим на свое изваяние. Если посмотреть на светодиоды, то рядом с красным можно увидеть два пина. Перед подачей питания на него нужно надеть джампер.

Далее справа от основного разъема есть еще три пина, это Rx, Tx и GND. К ним нужно подключить COM-порт. Эта к стати еще один плюс, данный программатор лишен проблемы курицы и яйца. Для программирования его МК нужен только COM-порт. Какой вы будете использовать, решать вам. Я использовал физический с переходником на TTL. Питание нужно подать 3,3в на 1 пин основного разъема. Если программатор положить светодиодами кверху, то на основном разъеме этот пин будет в левом нижнем углу. Лично я не стал замарачиватся и запитал от USB. У меня есть USB-хаб с возможностью подключить внешнее питание, вот через него я и запитал. То есть питание от USB пришло, а пины для данных не активны.

После того как подключили питание, если все спаяно нормально и без ошибок, МК должен быть готов к прошиванию. Далее запускаем программу Да кстати вот архив со всем что нужно. Распаковать в корень диска.

Жмем Next. Видим как идет общение с МК.

Когда все успокоится снова жмем Next.

В этом окне нужно указать загружаемый файл. Выбираем из архива файл STLinkV2.J16.S4 и жмем Next. После загрузки окно будет выглядеть так.

Теперь снимаем джампер и отключаем COM-порт. Следующим шагом устанавливаем драйвер st-link_v2_usbdriver . На момент написания статьи драйвер самый последний. Если время прошло много, то можно более свежий драйвер скачать на сайте ST. После установки драйвера подключаем программатор к USB. Если все до этого момента было сделано правильно, windows увидит девайс и установит для него драйвер.

Если все установилось удачно, то запускаем программу ST-LinkUpgrade с бабочкой. Появится окно с тетенькой у которой взгляд "Не скажу куда гляжу". Интересно кто такую нашел. Все же это лицо компании. Ну дело не в этом.

Жмем Device Connect. Если программа увидит программатор, а это должно произойти, то активируется кнопка.

Жмем на кнопку Yes >>>> и ждем пока не появится уведомление о удачном обновлении.

Собственно все. Программатор работает. Осталась выпилить отверстия в корпусе и напечатать этикетку. Вот что у меня получилось.

Некоторые из микроконтроллеров stm32 поддерживают USB DFU протокол (их список можно посмотреть в app note AN3156), в такие МК прошивку можно заливать через обычный USB, используя например DFuSe demo от ST, либо опенсурсный dfu-util. С этим вариантом все понятно и описывать его я не буду.

Для тех же МК (в частности и того, который используется в плате BluePill — STM32F103C8T6), которые обделены поддержкой DFU, так или иначе нужен программатор, например ST-Link V2 Mini

Распиновка устройства:

Подключается к плате просто:

ST-Link STM32F103C8T6 3.3V --- 3.3V GND --- GND SWDIO --- DIO SWCLK --- DCLK

Также нужна утилита ST-Link Utility, скачать ее можно с официального сайта st.com — ссылка . При первом подключении неплохо было бы обновить firmware самого программатора. Выбираем ST-LINK -> firmware update, если доступна более свежая firmware, то будет что-то подобное:

Выбираем Yes >>>>, прошивка обновляется.

Далее открываем собственно файл с прошивкой, и выбираем Target -> Connect. В окне состояния утилиты появится информация и вашем МК — это значит, что программатор подключен корректно и утилита может контактировать с МК. Пример:

Затем нужно сделать полную очистку чипа, выбираем Target -> Erase Chip

В случае, если например, моя прошивка из поста контроллере педалей и кнопок уже была залита и ее нужно обновить или перезалить, то программатор не сможет так просто подключиться к плате (потому что я использую пины SWD как обычные GPIO). В этом случае есть два варианта:

  1. переставить оба желтых джампера. Плата в этом случае загрузится у вас сразу во внутренний бутлоадер
  2. можно сделать так называемый Connect under Reset. Для него последовательность будет такая:
  • в ST-Link Utility выбираем Target -> Settings
  • в Reset Mode выбираем Hardware Reset
  • нажимаем и держим кнопку Reset на плате
  • нажимаем OK в ST-Link Utility
  • отпускаем кнопку Reset на плате

PS. Если у вас есть плата для разработчиков SMT32F4Discovery, то она уже имеет в себе программатор и его также можно использовать для прошивки другой платы. В данном случае нужно использовать разъем SWD у STM32F4Discovery и убрать обе перемычки CN3. Разъем SWD имеет следующую распиновку:

Для создания минимального проекта нам понадобится: контроллер stm32 (у меня stm32f103), жменя проводов, светодиод (для проверки).
Мы не будем вешать даже кварц, чтобы не усложнять процесс.
Очень удобно использовать вот такую плату-переходник с LQFP:

Стоит она в районе 1$. Зато не надо травить крохотные дорожки.
Собираем вот такую схему (для stm32f103 48ног):

Разъём SWD содержит 6 пинов, т.к. на STM32F4 discovery (которой я и пользуюсь) именно 6, хоть и 6ой не используется.
Вешаем все земли (GND) на земли, а питание (VDD) на питание (я скрутил всё в кучу). Фильтры вешать не будем, всё равно без кварца ни о какой точности речи идти не может.
Распиновка stm32f103 выглядит так:

Питание на платну нужно подать отдельно (3,3В). Питание с SWD (1В) будет маловато.

В принципе всё. Вставляем разьём в плату, предварительно убрав перемычки на плате.
Запускаем st-util и видим:

$ st-util 2012-09-10T15:14:05 INFO src/stlink-usb.c: -- exit_dfu_mode 2012-09-10T15:14:05 INFO src/stlink-common.c: Loading device parameters.... 2012-09-10T15:14:05 INFO src/stlink-common.c: Device connected is: F1 Medium-density device, id 0x20036410 2012-09-10T15:14:05 INFO src/stlink-common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x10000 bytes (64 KiB) in pages of 1024 bytes Chip ID is 00000410, Core ID is 1ba01477. KARL - should read back as 0x03, not 60 02 00 00 init watchpoints Listening at *:4242...

Можно шить.

Вот вам проект - моргалка диодом для eclipse. Скачать .
Если используете IAR или еще что то телодвижения с st-util не нужны.

Данная статья, которая является еще одним "быстрым стартом" в освоении ARM-контроллеров, возможно поможет сделать первые шаги в освоении 32-битных контроллеров ARM на базе ядра Cortex-M3 - STM32F1xxx серии. Возможно данная статья (которых на эту тему появляется как грибов после дождя) станет для кого-то полезной.

Введение

Почему ARM?
1. Есть из чего выбрать (разными производителями сегодня выпускается более 240 ARM-контроллеров)
2. Низкая цена (например за 1$ можно получить 37хI / O, 16K Flash, 4K RAM, 2xUART, 10x12bitADC, 6x16bitPWM).

А начнем нашу работу с контроллеров фирмы ST Microelectronics. Контроллеры на основе ядра ARM Cortex-M3 характеризуются широким набором периферии, высоким уровнем рабочих характеристик, низкой цене
P.S. В самом начале создается впечатление, что ARM"ы это какие-то страшные (в пайке, разводке, программировании) существа. Но это только на первый взгляд:) и вы в этом сами убедитесь.

Итак, изучать ARMы будем на примере контроллеров STM32F1. Одновременно эта серия имеет несколько линеек:

  • Value line STM32F100 - 24 МГц CPU, motor control, CEC.
  • Access line STM32F101 - 36 МГц CPU, до 1 Mб Flash
  • USB access line STM32F102 - 48 МГц CPU with USB FS
  • Performance line STM32F103 - 72 МГц, до 1 Mб Flash, motor control, USB, CAN
  • Connectivity line STM32F105/107 - 72 МГц CPU, Ethernet MAC, CAN, USB 2.0 OTG

Также существует следующая классификация:

Контроллеры STM32 можно заставить загружаться с 3-х областей памяти (в зависимости от состояния ножек BOOT0 и BOOT1 при старте контроллера или после его сброса). Записать программу в память контроллера можно следующими способами:

1 способ:
Используя загрузчик (он уже записан в системную память) и USART1 (USART2 remaped): использует внутренний тактовый сигнал 8 МГц. Чтобы запустить встроенный загрузчик, зашитый в контроллер производителем, достаточно просто бросить на лапки контроллера TX1, RX1 сигнал с преобразователя RS232-3.3В (например на базе FT232RL) и выставить перед этим BOOT0 = 1 и BOOT1 = 0 жмем RESET и можем шить программу в контроллер. А зашивается она в программе Flash Loader Demonstartor от STM (для Windows).

PS. Если вы сидите под LINUX и не имеете отладочной платы типа дискавери, можно заливать прошивку в контроллер через всеми любимый rs-232 (собственно - через преобразователь rs-232-3,3В). Для этого нужно использовать python-скрипт (Ivan A-R) (для LINUX или MACOSX).
Для начала у вас должен быть установлен Python 2.6 версии и библиотека для работы с последовательным портом - PySerial library.
Теперь, чтобы запустить скрипт stmloader.py (из терминала, разумеется) нужно его немного подправить под свой компьютер: откроем его в текстовом редакторе.
Набираем в командной строке
~$ dmesg | grep tty
чтобы увидеть все последовательные порты ПК.
и после набора...
~$ setserial -g /dev/ttyS
мы узнаем путь к нашему 232-му порту. Если система ругается на setserial, установим его
~$ sudo apt-get install setserial
мы узнаем путь к нашему физическому порту (например, у меня - /dev/ttyS0). Теперь нужно записать этот путь в файл скрипта stm32loader.py вместо дефолтного «/dev/tty.usbserial-...». Набираем в терминале
~$ python stm32loader.py -h
...для вызова справки и заливаем прошивку в наш контроллер.

2 способ:
Через USB OTG, используя DFU-режим, требует внешнего кварца на 8 МГц, 14.7456 МГц или 25 МГц (этот загрузчик есть не у всех контроллерах с USB OTG надо внимательно смотреть на маркировку вашего контроллера)

3 способ:
JTAG/SWD. Ну и для тех, кто имеет демоплату типа Discovery или самопальный JTAG/SWD программатор, можно заливать код и уже отлаживать свой микроконтроллер этим способом. Для JTAG в микроконтроллере отведено 6 лапок (TRST, TDI, TMS, TCK, TDO, RST) + 2 на питание. SWD использует 4 сигнала (SWDIO, SWCLK SWO, RESET) и 2 на питание.

PS. В среде EAGLE я набросал несколько схем-заготовок для 48-ми, 64-х и 100-ногих контроллеров (папка eagle), а stm32loader содержит скрипт stm32loader.py

У STM32 есть очень удобный интерфейс для отладки и прошивки МК - Serial Wire Debug, сокращено SWD . Его удобство заключается в том, что для отладки надо подключить всего два информационных вывода и два вывода питания. Схема подключения выглядит следующим образом.

После того как выводы подключены, надо разрешить отладку по SWD в среде программирования, в KEIL это делается так.


Также у SWD есть вывод SWO , его подключать необязательно, но если его подключить(подтянув к питанию через 10K), то можно будет выводить сообщения в режиме реального времени. То есть в процессе исполнения кода, МК может слать нам отладочную информацию, например, какой участок кода сейчас выполняется, получается что-то типа usart c терминалом.
Разрешить отправлять отладочную информация по выводу SWO можно во вкладке trace: разрешив трассировку, указав частоту на которой работает МК и порт.


Ниже пример, который позволяет выводить сообщения с помощью SWO , в специальное окошко, само окошко можно открыть так: view->Serial windows->debug (printf) viewer.
#include "stm32f10x.h" #include #define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n))) #define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n))) #define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n))) #define DEMCR (*((volatile unsigned long *)(0xE000EDFC))) #define TRCENA 0x01000000 struct __FILE { int handle; /* Add whatever you need here */ }; FILE __stdout; FILE __stdin; int fputc(int ch, FILE *f) { if (DEMCR & TRCENA) { while (ITM_Port32(0) == 0); ITM_Port8(0) = ch; } return(ch); } int main(void) { while(1) { printf("Hello from stm32 printf!\r\n"); } }
Вот как это выглядит, картинку можно увеличить кликнув по ней.

Ну и главное, для чего задумывалась эта статья, в качестве отладчика использую китайский jlink , распиновка его коннектора стандартная и её легко можно найти в интернете, но это не мешает мне постоянно забывать какие выводы куда подключать, поэтому оставлю здесь фотку, какие пины на коннекторе jlik предназначены для SWD .