ST-LINK/V2 [СN Version], Внутрисхемный программатор/отладчик JTAG для мк STM8 и STM32
Описание
ST-LINK/V2 – внутрисхемный программатор/отладчик для микроконтроллеров серии STM8 и STM32 производства фирмы STMicroelectronics. Отладчик подключается к отладочным платам посредством стандартного JTAG/SWD интерфейса (микроконтроллеры на базе ядра STM32) или посредством SWIM-интерфейса (для микроконтроллеров семейства STM8).
Особенности JTAG-программатора:
• программирование Flash-микроконтроллеров серий STM8 и STM32;
• использование стандартного ARM-совместимого JTAG-разъема для STM32;
• поддержка JTAG интерфейсом целевого напряжения 1,65 – 3,6 В;
• поддержка всех возможностей SWIM интерфейса: режимы пониженной и повышенной скорости, подключение по стандарту ERNI, штыревой разъем с шагом 2,54 мм, поддержка целевого напряжения от 1,65 В до 5,5 В;
• для внутрисхемной отладки микроконтроллеров семейства STM8 используется ST Visual Develop – STVD (версии 4.1.0 или более поздней);
• для внутрисхемного программирования микроконтроллеров семейства STM8 используется ST Visual Program – STVP (версии 3.1.0 или более поздней);
• для программирования и отладки микроконтроллеров семейства STM32 ST-LINK/V2 может использовать следующие приложения: Atollic toolset TrueSTUDIO (не ниже версии 1.0), IAR toolset EWARM (не ниже версии 5.30), Keil toolset ARM-MDK (не ниже версии 3.3) и TASKING;
• поддержка режима самообновления (DFU);
• USB Full Speed 2.0 интерфейс для подключения к ПК;
• отсутствие необходимости во внешнем питании эмулятора – питание от USB-порта;
• напряжение питания +5В.
Комплектация:
1. отладчик ST-LINK/V2;
2. USB, JTAG и SWIM кабели.
Stm32 stlink driver windows 10
рекомендуется к прочтению
Архитектуру STM32 можно мысленно разделить на две части. Первая часть, это ядро Cortex-M3, которое спроектировали в ARM и которое примерно одинаковое для всех. «Примерно», потому что, содержит опциональные модули которые могут быть у одного производителя и отсутствовать у другого. Вторая часть, это периферия знакомая по STM8, с тем отличием, что был добавлен USB2.0 интерфейс, хотя точнее было бы сказать, что этот интерфейс был «откручен» от STM8(такая у STM политика: хочешь аппаратный USB, используй STM32).
- Справочники и руководства которые нужны для работы c STM32F103x8/STM32F103xB:
- Справочное руководство по 32-битным микроконтроллерам серий STM32F10x Reference Manual. STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced ARM®-based 32-bit MCUs или RM 0008
- Руководство на чипы STM32F103x8/STM32F103xB STM32F103x8 STM32F103xB Medium-density performance line ARM®-based 32-bit MCU with 64 or 128 KB Flash, USB, CAN, 7 timers, 2 ADCs, 9 com. interfaces
- Ядро Cortex — МЗ компании ARM. Полное руководство. Книга не обязательная, но на мой взгляд очень полезная.
- Небльшой ликбез по ARM и Cortex-M3 в частности:
- Cortex-M3 основан на архитектуре ARMv7 и является усеченным вариантом архитектуры ARMv7 специально для микроконтроллеров. По сравнению с полноценным ЦПУ Cortex-A, здесь отсутствует кеш и 32-битный альтернативный набор команд ARM. Также могут отсутствовать некоторые модули, такие как модуль зашиты памяти — MPU (Memory Protect Unit).
- Cortex-M3 включает в себя 16-битный набор команд, оптимизированный для систем с малым объемом памяти, Thumb и 32-битный дополнительный набор Thumb-2. Здесь 16-битная команда означает, что ее двоичное представление будет занимать в памяти 16-бит, т.е. она более компактная. Программный код может состоять из произвольного набора 16-битных команд Thumb и 32-битных Thumb 2.
- В Cortex-M3 имеется аппаратное деление и умножение. Урезанная, удешевленная версия Cortex-M0 базируется на архитектуре ARMv6 и таких инструкций не имеет. ARMv6 отличается от ARMv7 отсутствием набора инструкций Thumb-2. Cortex-M4, напротив, дополнен DSP модулем, а Cortex-M4F также включает в себя FPU модуль, т.е. он аппаратно поддерживает числа с плавающей запятой.
- Номера процессоров ARM никак не согласованы с версиями архитектур. Процессоры ARM11 имеют архитектуру ARMv6, а ARM9 имели архитектуру ARMv4.
- Cortex-M3 имеет единую адресную 32-битную шину, которая может адресовать 4Гб памяти. Процессор построен по гарвардской архитектуре и имеет отдельные шины для памяти данных SRAM и памяти программ Flash. Программа может быть запущена из SRAM, тогда будет задействована только одна шина и код будет выполняться медленнее.
- Cortex-M3 имеет шестнадцать 32-битных РОН (регистров общего назначения) R0-R15. Команды из набора инструкций Thumb могут обращаться только к регистрам R0-R7. Команды из набора Thumb-2 могут обращаться ко всем регистрам. При этом, регистр r13 — это указатель стека, r14 — регистр связи(хранит адрес возврата из подпрограммы), r15 — счетчик команд.
Немного о STM32:
Выпускаемые линейки микроконтроллеров изображены на следующей картинке:
Это не полный перечень, но представление давать должен. Кроме линеек, микроконтроллеры делятся по размерам flash-памяти. Чем больше flash-пямять, тем больше остальной периферии. Для 103-й линейки это выглядит так:
Блок-схема устройства STM32F103 представлена на картинке ниже:
Во всем этом хозяйстве нас будет больше всего интересовать периферия подключенная к периферийным шинам APB1 и APB2. Также полезно будет запомнить внутреннюю шину AHB.
Имеющаяся в чипах периферия перечислена в следующей табличке:
Выбор «железа»
Чип который у меня оказался под рукой — STM32F103CBT6 запаянный в плату Maple Mini:
Заказав его год назад на Али, я ради интереса загрузил в него несколько скетчей, и набалововшись бросил на полку. За этот год проект Leaf Maple накрылся медным тазом, сайт поменял содержимое, а поддержку железа передали на следующий форум: STM32 for Arduino. Я особо не расстроился, т.к. не питал особых надежд на этот проект, и планировал плату использовать для Си-программирования.
Кстати, на упомянутом выше сайте есть хороший классификатор с образчиками результатов работы китайской промышленности, содержащих чипы STM32F103, очень рекомендую ознакомится: STM32F103 boards
Если у кого-то имеется под рукой «Blue Pill», то это не беда, там установлен чип STM32F103C8T6 который от STM32F103CBT6 отличается только уменьшенным до 64кБ размером flash-памяти. Еще там светодиод подключен на PC13, в то время как на MapleMini он на PB1, и кроме этого у Maple Mini имеется кнопка на PB8.
Зато на «Blue Pill» имеется штыревой разъем для подключения программатора ST-LINK, в то время как Maple Mini нужно устанавливать в макетку что бы прошить по SWD. Прозвонкой чипа было выяснено, что на Mapple Mini SWDIO контакт «висит» на 22-pin, а SWCLK на 21-м. Но заставить работать ST-LINK с Maple Mini оказалось не просто.
Прошивка чипов через программатор ST-LINK v2
STM32 можно прошить либо через UART встроенным загрузчиком, либо через SWD-интерфейс программатором ST-LINK. Меня интересовал второй вариант, т.к. был скромным владельцем клона ST-LINK v2.
В Windows прошить STM32 через ST-LINK можно воспользовавшись фирменной утилитой «STM32 ST-LINK Utility», или непосредственно из среды разработки IAR for ARM. В Linux можно воспользоваться консольной утилитой sy-flash.
Если у вас «Blue Pill» или еще какая-либо плата отличная от Leaf Maple, то никаких проблем не будет, их можно сразу прошивать. Моя же Maple Mini никак не хотела видеться программатором, пока я не догадался во время загрузки программы из IAR в чип, несколько раз нажать на кнопку Reset на плате. После чего Maple Mini начала свободно прошиваться, но родной USB-загрузчик был на этом этапе потерт. Но это мелочи.
Ок. Посмотрим как чипы прошиваются в Windows. Войдя на сайт http://my.st.com и залогинившись, введем в строку поиска «st-link». На выходе получим такую табличку:
Щелкнув мышкой по второй строчке и промотав открывшуюся страницу книзу, увидим список предлагаемого ПО для программатора:
STSW-LINK004 — это утилита для прошивки STM32 чипов. STSW-LINK007 утилита для обновления прошивки программатора, STSW-LINK009 — драйвера для различных версий Windows. Немного выше предлагаются свежие прошивки для самого программатора. ST-LINK v2.
Как установить драйвер для ST-LINK v2 я рассказывал здесь: STM8 + IAR + ST-LINK2: программирование, прошивка и отладка из под Windows, поэтому далее будем считать, что драйвер уже установлен.
После установки и запуска «STM32 ST-LINK Utility» следует подключить ST-LINK v2 к компьютеру или виртуальной машине(мой случай), а к ST-LINK в свою очередь, должен быть подключен чип который следует прошить:
После чего следует пройти по меню: «меню-> Target — > Settings. » и должно появится такое окно:
Во-первых, сам программатор ST-LINK V2 должен быть опознан программой, показана версия его прошивки. Во-вторых должен быть опознан чип подключенный к программатору. В третьих, рабочий протокол должен быть установлен как SWD, а не JTAG.
Когда я впервые воткнул ST-LINK полученный год назад с Али, мне вместо номера прошивки показывало что-то вроде «Old firmware», поэтому мне пришлось воспользоваться утилитой обновления прошивки ST-LINK, что бы флешеры нормально работали с моим клоном ST-LINK. К сожалению у меня не сохранились скрины.
Здесь у меня изначальная версия прошивки(цифра после буквы J) была то ли 20, то ли 21. В итоге меня обновили то текущей версии. Кстати, из под виртуальной машины обновляется прошивка без проблем.
Вернемся к STM32 ST-LINK Utility. После нажатия кнопки «Ок» в окне «Settings», появится рабочее окно программы:
Следует запомнить, что стартовый адрес флеш-памяти начинается с 0x08000000. Встроенная оперативка начинается c 0x20000000. Чтобы программа стартовала с оперативки, контакты boot0 и boot1 должны быть сконфигурированы специальным образом.
Щелкнув по вкладке «binary file» можно выбрать файл с прошивкой, затем пройдя по «меню->Target->Program. » эту прошивку можно прошить в микроконтроллер:
Наряду со знакомым форматом прошивок HEX, в stm32 широко используется бинарный raw-формат «*.bin».
Через меню «File->Save As» можно сохранить прошивку чипа в файл:
Если честно, слить пошивку с чипа и потом залить ее обратно так, чтобы она работала, мне не удалось. Нужно будет разбираться.
Еше интересной штукой являются Option Bytes знакомые по STM8:
Пока не будем их трогать.
Теперь, что касается st-flash для Linux, то там с одной стороны все проще, а с другой — сложнее. Сложнее, потому что глючит. Может к этим глюкам как-то можно привыкнуть, но я пока не сумел.
Пока я обнаружил такую закономерность, команда очистки флеш-памяти «st-flash erase» помогает избавиться от глюков:
Программирование STM32 с помощью IAR и SPL в Windows
Если на сайте http://my.st.com ввести в строку поиска «stm32f10x standard peripheral library» то нам предложат скачать SPL для чипов STM32F10x:
В отличии от SPL для STM8, библиотека разделена на CMSIS и саму SPL. CMSIS (Cortex® Microcontroller Software Interface Standard) — это стандарт описания периферии микроконтроллера, то что в STM8 размещалось в файлах stm8s.h/stm8l.h
Подключить SPL к IAR достаточно просто, в сети множество видео и пошаговых инструкций. Я лично делал по этому видео: STM32 Discovery IAR and StdPeriph Lib настройка и загрузка проекта
Проект компилируется и заливается в чип, после чего успешно работает. Наверное больше и не надо, но я предлагаю забрать результирующий объектный файл с расширением *.out и перенести его в Linux, для внимательного изучения:
Программирование STM32 с помощью Eclipse и SPL в Linux
В Linux попробуем посмотреть, что за файл генерирует на выходе IAR:
Как видим, это обыкновенный эльф. Смотрим дальше:
Из «эльфа» мы всегда можем получить файл прошивки в HEX формате:
или бинарный файл:
Также можно посмотреть ассемблерный код:
Даже можно попытаться загрузить на чип в режиме отладки. Для этого понадобиться сервер st-util который входит в набор утилит st-flash и сам отладчик gdb.
Подключаемся к ранее запущенному серверу:
Ставим точку останова и запускаем на исполнение:
Но при попытке распечатать исходный листинг программы выдаст сообщение об ошибке:
кое-что сделать конечно можно
На этом этапе думаю лучше оставить прошивку с IAR в сторону, и попытаться скомпилировать нормальный объектный файл в Linux.
некоторые не ищут легких путей.
Проблема в том, что нельзя вот так просто взять компилятор, исходный текст и скомпилировать прошивку для stm32. Почему? Потому что в опциях gcc компилятора можно указать только тип архитектуры «cortex-m3», а чипов на этой архитектуре выпускаются различными фирмами — тьма тьмущая. И у всех них разные карты памяти и периферия. Как минимум понадобиться скрипт линкера для вашего чипа.
О масштабах проблемы можно почитать например тут: ARM-ы для самых маленьких: тонкости компиляции и компоновщик. Более-менее толковый самопальный Makefile который мне удалось найти можно взять тут: Еще один шаблон проекта под STM32 на gcc.
После некоторых размышлений я решил взять в качестве основы сборочные файлы из какого-нибудь IDE. Традиционным IDE для ARM в Linux стал Eclipse, который ненавидят наверно все linux-пользователи за глючность и тормознутость. Справедливости ради, должен упомянуть, что генерации проектов существует специальная фирменная утилита STM32CubeMX. Но может ли она генерировать проекты для gcc или нет, я не знаю.
Поддержка ARM в Eclipse ставится через плагин: GNU ARM Eclipse
На странице установки предлагается несколько способов установки ARM плагина. Но, например, на LinuxMint мне этот плагин установить не удалось. В репозитории какая-то древняя версия Eclipse 3.8, это версия от 2012(!) года. И установка плагина заканчивается фейлом:
Поэтому пришлось вспомнить про старую добрую Slackware GNU/Linux. В этом году вышла новая версия 14.2.
Для начала нужно будет скачать ARM toolchain c сайта ARM:
Скачанный архив я распаковал в /usr/local
Теперь чтобы скачать Eclipse, зайдем в репозиторий и введем в строку поиска «eclipse-cpp»:
После чего попадаем на страницу с пакетом:
Т.к. уменя Слакваръ 64-битная, то для установки выполняем следующие манипуляции:
Поставив Eclipse мы сделали полдела. Еще нужно поставить jdk. C 6-й и 8-й версии JDK Eclipse отказывался работать и вылетал. С 7-й тоже глючит, но кое-как работает. В гугл вбиваем «java jdk 7 download» попадем на страницу: Java SE Development Kit 7 Downloads
Теперь можно запускать Eclipse:
Жмем OK, это будет рабочий каталог проектов:
Далее открываем Marketplace:
В строку поиска вводим ARM:
и щелкаем по «install»
Перед установкой нужно будет принять условия лицензии:
Если погода на Марсе будет солнечной, то в конце установки предложат перезагрузить Eclipse:
После перезапуска Eclipse создаем новый проект:
В открывшийся форме нужно будет заполнить имя нового проекта и выбрать его тип:
В следующей форме необходимо выбрать параметры чипа. Замечу, что по дефолту(поле Content) предлагается не пустой проект, а проект с blink’ом:
Следующую форму можно оставить как есть:
Здесь нужно указать путь к папке toolchain’ом:
Осталось закрыть окно «Welcome»
И перед нами открывается окно проекта:
Это совсем не тот простенький Blink который был в IAR. Здесь задержки формируются по таймеру и кроме этого используется модуль трассировки. Задать номер pin’а к которому подключен светодиод, можно в файле Blinky.h
Чтобы задать светодиод на PB1 нужно константы BLINK_PORT_NUMBER и BLINK_PIN_NUMBER установить в единицы. После чего можно скомпилировать проект:
Если все прошло удачно, то можно закрыть проект и перейти в консоли в папку проекта:
Там будет объектный файл прошивки. Получаем бинарный файл:
Если, опять же все нормально, то светодиод начнет мигать с интервалом в одну секунду. Заливать прошивку можно и из Eclipse, но эта IDE меня интересует только как генератор проектов.
Попробуем взглянуть на makefile файл который лежит в этой же папке:
некоторые вещи бывает сложно объяснить
Пробуем еще раз загрузить полученный файл в отлдачик. Запускаем сервер:
подключаемся к серверу:
ставим точку останова:
Запускаем на выполнение:
Выполнение программы приостонавливается на точке останова. Смотрим листинг:
В этот раз все в прорядке. Однако если мы еще раз дадим команду continue, то будет возможно, неожиданный эффект:
Программа останавливается по сигналу SIGTRAP и дальше ни в какую не идет.
Проблема кроется в отладочном интерфейсе semihosting, которого как понимаю, в чипе просто нет, но который позволяет выводить отладочные сообщения через функцию trace_printf().
Чтобы решить эту проблему, нужно в Eclipce через меню->project->proporties, открыть вкладку Settings в «C/C++ Build»:
В настройке препроцессора следует удалить макроопределение OS_USE_TRACE_SEMIHOSTING_DEBUG. После чего пересобрать проект. и полученный объектный файл заново загрузить в отладчик:
Посмотрим что нам пытаются вывести:
здесь вроде все нормально
Посмотрим значение переменной seconds:
Почему то у меня после blink_on() светодиод гаснет, а после blink_off() наоборот загорается