Простейшие программаторы для прошивки 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). В этом случае есть два варианта:
- переставить оба желтых джампера. Плата в этом случае загрузится у вас сразу во внутренний бутлоадер
- можно сделать так называемый 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
Вот как это выглядит, картинку можно увеличить кликнув по ней.
Ну и главное, для чего задумывалась эта статья, в качестве отладчика использую китайский jlink , распиновка его коннектора стандартная и её легко можно найти в интернете, но это не мешает мне постоянно забывать какие выводы куда подключать, поэтому оставлю здесь фотку, какие пины на коннекторе jlik предназначены для SWD .