Flash loader demonstrator как пользоваться
Перейти к содержимому

Flash loader demonstrator как пользоваться

  • автор:

Попытка подружиться с STM32

В прошлый раз я издевался над микроконтроллерами ATtiny 85, сопрягая бедные восьминогие чипы с Arduino IDE. А потом мне захотелось посмотреть, что же за чудо такое — STM32, поклонники которых смотрят на программистов AVR (не говоря уж об ардуинщиках) с некоторым неодобрением. В процессе беглого гугления выяснилось, что STM32 «для идиотов» существует — есть проект Leaf Maple, в рамках которого — две платы на STM32F103 и среда разработки, являющая собой клон Arduino IDE.

Решающим фактором стала стоимость. Китайская версия Leaf Maple Mini продается за 4$ — это немногим дороже Arduino Nano. Заказав три штуки, я принялся ждать.

Пожалуй, со ставкой на Maple я немного поторопился — проект скорее мертв, чем жив. IDE не развивается, драйверов без бубна под Windows 8 нет, библиотеки в зачаточном состоянии, полное уныние и запустение. Ради интереса я поморгал светодиодом, запустив Maple IDE под OS X (заработало из коробки), а затем стал думать, с какой стороны подходить к плате для дальнейшего изучения.

Для начала, выяснил я вот что. В микроконтроллер STM32F103CBT6 (названия у ST, замечу, суровые) на плате Leaf Maple Mini зашит загрузчик, работающий через USB с Maple IDE. Находится он во флеш-памяти. А как программировать «голый» STM32? По-хорошему, надо использовать ST-Link, ведь он позволяет не только «заливать» прошивку, но и производить отладку. А без этой железяки что делать? Использовать «системный» загрузчик STM32, работающий по UART. Мини-плата на чипе CP2102 в закромах имеется, можно начинать чудить.

IDE, которые используются для программирования STM32, вгоняют меня в тоску. Дело в том, что я программистом не являюсь, и множественные окошки со вкладками и кучей страшных букв вызывают потаенное нежелание во всем этом копаться. Но, похоже, надо. Наименее замороченной из троицы (Keil, IAR, Coocox) мне показалась последняя.

Итак, последовательность действий. Ставим Coocox, к нему — компилятор GCC для ARM. Пишем шедевральный проект — Blink. Затем на монтажной «доске» собираем конструкцию из Maple Mini и CP2102. Выясняем, что для заливки прошивки нужно что-то еще, ибо «кокос» хочет ST-Link. Напрямую скомпилированный код легко прошивается по UART с помощью утилиты от ST — Flash Loader Demonstrator. Теперь подробнее.

Кокос с граблями

Без граблей у меня никак. Первая же «засада» — текущая версия IDE (2.0) — это нечто странное, внезапно не поддерживающее STM32F1xx. Удаляем, ставим версию 1.7.7, теперь можем создать проект. К проекту подключаем GPIO, берем из этого модуля пример с нужным нам Blink и немного его переделываем, чтобы задействовать светодиод Maple Mini (PORT B PIN 1). Инициализация портов тут — целая песня (понятная, но более сложная, чем на AVR). То есть, нужно не просто сказать, мол, этот порт — выход. Этот порт — его надо включить и тактировать, и будет он выходом с бантиком и плюшечкой, а не с закорючкой и гвоздиком…

Сборка железа

Тут все просто — берем модуль на CP2102 и соединяем с STM32.

RX1 — TX
TX1 — RX
GND — GND
Vin — VCC

Хитрость одна — как заставить STM32F103 запускаться в режиме загрузчика UART. Процесс неплохо описан на сайте Leaf Labs в разделе «Что делать, если вы запороли USB загрузчик». Подключаем ножку BOOT1 к земле, нажимаем RESET и вторую кнопку, отпускаем RESET, отпускаем вторую кнопку. Привет, загрузчик!

Осталось запустить Flash Loader Demonstrator и «скормить» ему bin-файл, болтающийся после компиляции где-то в недрах проекта. Любопытно, как называются операции в этой утилите. Download — это В чип. А Upload — это ИЗ чипа. Мое восприятие бунтует, но, может быть, тут так принято.

Нельзя просто так взять и поморгать светодиодом на STM32. Сделать это двумя щелчками мыши (как в Arduino) или парой команд avr-gcc и avrdude тут не выйдет. Попытка (Maple IDE) была, но сдулась. Поэтому, придется реально садиться и разбираться, как тут чего работает.

Прошивка stm32 через UART

Любой микроконтроллер stm32 можно прошивать через USART_1 и другие интерфейсы, подробно смотрите в AN2606. Для этого в МК есть специальный системный загрузчик, который зашивается в System memory (спец. область памяти) на этапе производства, его нельзя удалить или изменить. Это загрузчик инициализируется путём «подтягивания» пина BOOT_0 к «плюсу», после чего он ожидает поступления прошивки.

Через USART можно загружать любые .bin или .hex файлы.

Описание сделано на примере платы Blue Pill, однако всё сказанное справедливо для любого stm32.

Фирменные платы типа Discovery и Nucleo тоже можно прошивать через USART.

Для работы потребуется USB to UART конвертер…

Если такой штуковины нет, то есть два варианта превращения ардуины в конвертер…

1. Замкнуть RESET на GND (может не прокатить).
2. Загрузить в неё вот такой незамысловатый скетч:

Чтобы проверить работает ли ардуина в качестве конвертера, замкните RX и TX, откройте и отправьте какие-нибудь символы. Если они вернулись, значит всё работает.

Перед прошивкой необходимо подтянуть пин BOOT0 к «плюсу», это переведёт МК в режим «системного бутлоадера». На описываемой плате это осуществляется перестановкой джампера…

На фирменных платах (Discovery, Nucleo) тоже нужно подтянуть пин BOOT0 к плюсу, но просто так это сделать не получится. Возьмите схему вашей платы и найдите там соответствующие перемычки…

Искать надо что-то вроде этого:

Не помню от какой платы эта схема, но суть такая: в данном случае пин BOOT_0 подтянут к «минусу» через резистор R16 и перемычку SB16. Если убрать перемычку SB16, то пин подтянется к «плюсу» через резистор R17 и можно прошивать. После прошивки надо вернуть всё на место.

Перемычка может выглядеть как резистор.

Bootloader (загрузчик) – это обычная программа, которая в момент старта МК решает, что должно происходить дальше.

Обычный режим, BOOT_0 подтянут к минусу. Как только подаётся питание на плату, сразу же стартует прошитая программа (если она есть конечно).

Режим «системного bootloader’а», BOOT_0 подтянут к плюсу. Системный bootloader ожидает прошивку — можно загружать в МК всё что угодно через USART_1 или через SWD (ST-Link). В более продвинутых камнях можно прошивать и через другие интерфейсы. См. мануал на свой микроконтроллер.

Системный bootloader зашивается в System memory на этапе производства, его нельзя удалить или изменить.

В этом режиме, с помощью программатора, можно заливать прошивку в оперативную память. Это продлевает жизнь Flash-памяти при отладке программ. После обесточивания программа естественно исчезает.

Соединяем конвертер и STM следующим образом…

Конвертер RX <-> PA9 STM
Конвертер TX <-> PA10 STM
Конвертер GND <-> GND STM

… и подключаем конвертер и STM к компьютеру.

Инструкция по прошивке для

Скачайте архив и распакуйте куда-нибудь. Если хотите, можете взять с сайта ST (в самом низу страницы).

Нажмите Reset на плате. Бывает что на описываемой плате, плохо работает кнопочка, поэтому если МК не сбрасывается (не прошивается), тогда кратковременно замкните пин Reset на «землю».

Перейдите в папку Flash Loader Demonstrator и запустите Flash Loader Demonstrator.exe


Выбираем СОМ-порт конвертера и жмем Next.

… означает, что плата, залочена. Ничего страшного нет, просто снимите защиту кнопкой Remove protection и следом нажмите ОК.

Если выдаёт ещё какие-то ошибки, то либо не нажали Reset, либо что-то с конвертером.


Если светофор даёт зеленый свет, то смело жмите Next.


Жмем Next.


В пункте Download to device указываем путь к нужному .bin или .hex файлу и жмем Next.

Всё готово, верните джампер в исходное положение и нажмите Reset.

Инструкция по прошивке для

Скачайте архив и распакуйте куда-нибудь.

Из папки соответствующей вашей ОС скопируйте файл stm32flash в домашнюю папку.

Эта утилита есть в репах ubuntu, в других дистрах не знаю, поэтому выкладываю.

Перед прошивкой всегда нажимайте Reset на плате.

В терминале дайте команду:

Название и путь к файлу у вас будет свой. HEX-файлы тоже можно прошивать этой утилитой.

Если будет ругаться на права, тогда дайте команду…

… или запускайте утилиту через sudo .

Защита от записи

Если появилось вот такое сообщение…

… тогда дайте по очереди две команды:

Первая снимает защиту от записи, вторая от чтения.

Если у Вас стоял ардуиновский загрузчик, то он будет затёрт, чтоб его востановить просто залейте описанным выше способом этот файлик. И не забудьте вот про это.

П.С. Все описанные действия можно проделать с помощью фирменной утилиты — STM32CubeProgrammer (Windows®, Linux®, macOS®)

На этом наверно всё.

Всем спасибо

Статья о том, как из платы Blue Pill сделать программатор.

Урок 3. Установка программного обеспечения. Первый опыт в конфигурации микроконтроллера, создании проекта, компиляции, прошивке.

Уроки STM32

В уроке установим программное обеспечение, необходимое для дальнейшей работы. Проверим в комплексе его работу с отладочным модулем.

Один из самых важных вопросов при освоении сложных микроконтроллеров подобно STM32 – выбор среды разработки (IDE).

Существует большое количество интегрированных средств разработки для микроконтроллеров STM32.

Мы живем в реальном мире, поэтому, прежде всего, я разделил бы их на платные и бесплатные. Логично предположить, что платные обеспечивают больше функций, работают стабильнее, лучше поддерживаются, генерируют компактный код и т.п.

Но вряд ли кто-то из моих читателей согласится выложить 8000 евро за среду разработки. Хотя в платных IDE, как правило, есть бесплатные варианты с ограничением по размеру кода. Но не хочется подобно Дамоклу ждать, когда оборвется волос, на котором подвешен меч над твоей головой. Т.е. в самый неподходящий момент получить сообщение, о том, что остальная часть памяти недоступна.

Но есть приятное исключение. Платная интегрированная среда Atollic TrueStudio с прошлого года стала бесплатной. Производитель STM32 компания STMicroelectronics в 2018 году купила фирму Atollic и сделала эту IDE бесплатной.

От добра добра не ищут. Я выбрал в качестве среды разработки IDE Atollic TrueStudio. Она:

  • бесплатная;
  • нет ограничений;
  • разработчик поддерживает ее и обещает поддерживать в будущем;
  • устанавливается ”из коробки”;
  • прекрасно работает.

Итак. Нам необходимо установить следующее программное обеспечение:

  • Интегрированная среда разработки Atollic TrueStudio.
  • Пакет STM32CubeMX – программа создания проекта, визуальной конфигурации микроконтроллера.
  • Flash Loader Demonstrator — программа для прошивки микроконтроллеров через системный загрузчик.
  • Программа – терминал COM-порта компьютера, аналог Монитора последовательного порта Arduino IDE. Необходима для отладки программной и аппаратной частей системы. Я выбрал CoolTerm, но подобных программ очень много. Если не нравится мой выбор, используйте другую.

Давайте все это последовательно установим.

Atollic TrueStudio.

Установка Atollic TrueStudio

Выбираем ОС. Заполняем поля.

Установка Atollic TrueStudio

Загружаем последнюю версию по ссылке.

Установка Atollic TrueStudio

Запускаем полученный файл-инсталлятор:
Atollic_TrueSTUDIO_for_STM32_windows_x86_v9.2.0_20181203-0921.exe

Дальше следуем подсказкам инсталлятора.

Установка Atollic TrueStudio

STM32CubeMX

Регистрируемся, подтверждаем регистрацию по электронной почте.

В самом низу страницы загружаем архивный файл по ссылке Get Software.

STM32CubeMX

Разархивируем скачанный файл во временную папку. Запускаем файл SetupSTM32CubeMX-5.0.1.exe.

STM32CubeMX

Возможно, потребуется установка Java. Ссылка для установки откроется сама.

STM32CubeMX

После загрузки и установки Java надо опять запустить SetupSTM32CubeMX-5.0.1.exe и довести установку до конца.

Flash Loader Demonstrator

Ссылка для самой загрузки (Get Software ) внизу страницы.

Flash Loader Demonstrator

Разархивируем во временную папку, запускаем flash_loader_demo_v2.8.0.exe.

Следуем подсказкам инсталлятора

Flash Loader Demonstrator

CoolTerm.

Устанавливать не надо. Разархивировать в рабочую папку. Запускается исполняемый файл CoolTerm.exe.

Терминал CoolTerm

В итоге у нас 4 программы – 4 ярлыка на рабочем столе.

Программы для работы с STM32

Проверка работы программного обеспечения в комплексе с отладочной платой.

Программное обеспечение мы установили. В прошлом уроке к отладочной плате STM32103C8T6 добавили компоненты, позволяющие загружать программу во FLASH микроконтроллера.

Прошивка STM32

Давайте проверим, как это все работает. Не будем особенно вдумываться, разбираться, что делаем. Просто формально выполним определенные действия.

Хотя работа с конфигуратором STM32CubeMX настолько проста и интуитивно понятна, что мы сразу научимся работать с его интерфейсом, а в регистрах и схемах микроконтроллера будем разбираться потом.

Цель – проверить, что:

  • STM32CubeMX создает проект и задает правильную конфигурацию ресурсов микроконтроллера.
  • IDE Atollic TrueStudio открывает проект, позволяет его редактировать и создает загрузочный файл.
  • Flash Loader Demonstrator – загружает программу в микроконтроллер.
  • Мы правильно припаяли к отладочной плате преобразователь интерфейсов и кнопки.
  • Работает сама отладочная плата.

Разработаем и проверим программу, которая мигает светодиодом платы на 13 выводе с частотой 2 раза в секунду.

Конфигурация и создание проекта.

Создаем папку для наших проектов. У меня это d:\STM32\Projects\Lessons\Lesson3.

Работа с STM32CubeMX

Ниже надписи New Project выбираем ACCESS TO MCU SELECTOR, что означает выбор типа контроллера.

При первом запуске программа загрузит необходимые файлы из Интернета и откроется окно выбора микроконтроллера.

Работа с STM32CubeMX

В верхней части страницы появится информация о выбранном микроконтроллере, можно будет загрузить техническую документацию.

Нажимаем кнопку Start Project в правом верхнем углу.

Появляется окно конфигуратора.

Работа с STM32CubeMX

Все интуитивно понятно. Справа изображение микроконтроллера с интерактивными выводами. Слева – регистры микроконтроллера, состояние которых мы собственно и хотим установить.

Желтым цветом показаны выводы питания, остальные пока серые. Зеленеть они будут по мере конфигурации портов.

Настраиваем систему тактирования микроконтроллера.

Открываем закладку System Core. Выбираем RCC.

Работа с STM32CubeMX

Источником тактирования задаем высокоскоростной генератор на кварцевом резонаторе High Speed Clock (HSE) -> Crystal/Ceramic Resonator .

Работа с STM32CubeMX

Два вывода на микросхеме стали зелеными. Мы их заняли под выводы для кварцевого резонатора.

Выбираем в верхнем горизонтальном меню Clock Configuration (Конфигурация тактирования).

Работа с STM32CubeMX

Здесь интерактивная схема системы тактирования, в которой можно управлять коммутаторами, задавать делители частоты. При этом нет необходимости искать в технической документации назначение регистров, их форматы и т.п.

Коммутаторы PLL Source Mux и System Clock Mux устанавливаем на нижние входы.

Умножитель *PLL Mul задаем равным 9.

Работа с STM32CubeMX

В результате на схеме видно, что основная частота тактирования 72 мГц (окошко HCLK).

С такой же частотой работает ядро микроконтроллера (окно FCLK).

Красным цветом отмечено, что какое-то устройство (APB1 Prescaler) работает на недопустимо высокой частоте. Есть предупреждение, что максимальная частота 36 мГц.

Давайте выберем для него делитель равный 2, и предупреждение исчезнет.

Работа с STM32CubeMX

Остается настроить режим порта для вывода 13. К нему подключен светодиод, которым мы собираемся мигать.

Возвращаемся в Pinout & Configuration. Справа появляется изображение микроконтроллера.

Правой кнопкой мыши нажимаем на вывод 13, назначаем его на выход (GPIO_Output).

Работа с STM32CubeMX

Вывод стал зеленым.

В закладках слева выбираем GPIO (порты общего назначения).

Правее появляется строчка с режимом вывода 13.

Работа с STM32CubeMX

Выбираем ее правой кнопкой мыши. В нижней строчке режимов вывода User Label пишем LED13. Это мы задали имя переменной для вывода. Через него в программе будет происходить обращение к выводу 13.

Работа с STM32CubeMX

На этом конфигурация закончена. Не заглядывая в техническую документацию, мы за минуту выставили нужные нам режимы тактирования и вывода порта.

Заполняем данные для сохранения проекта. В верхнем меню выбираем Project Manager.

  • Имя проекта.
  • Папку сохранения проекта.
  • Обязательно выбираем TrueSTUDIO в поле Toolchain IDE.

Проект STM32

Нажимаем GENERATE CODE.

При первом запуске STM32CubeMX загружает из Интернета необходимые файлы. Разрешаем загрузку.

Проект STM32

Создание проекта STM32

В указанной папке появился проект Lesson3_1.

Проект STM32

Разработка программы, компиляция.

Запускаем Atollic TrueStudio. Везде пустые поля.

Открываем наш проект File -> Open Projects from File System…

Указываем путь к проекту.

Atollic TrueStudio

В поле Project Explorer появился наш проект.

 Atollic TrueStudio

Atollic TrueStudio

Файлы с которыми мы будем сейчас работать в папке Scr.

Два раза кликаем правой кнопкой мыши по main.c и наш основной файл с исходным текстом появляется в среднем окне IDE.

Atollic TrueStudio

Попробуем компилировать проект.

Нажимаем Project -> Build Project или молоточек в панели инструментов.

Панель инструментов Atollic TrueStudio

Смотрим на поле Problems (Проблемы) внизу экрана.

Проблемы Atollic TrueStudio

У меня сообщений об ошибках нет, значит, проект компилировался нормально.

Исходный текст программы.

В отличие от Ардуино структура программы STM32 типичная для языка C. Всегда есть функция main() – функция, которая вызывается при запуске программы. Часто внутри этой функции расположена вся программа, за исключением тел других функций.

#include «main.h» – заголовочный файл.

void SystemClock_Config(void);
static void MX_GPIO_Init(void);

Прототипы функций. В отличие от Ардуино в классическом я зыке C каждая функция, в том числе, которую объявляет программист, должна иметь прототип. Т.е. должна быть объявлена, как переменная. Прототип содержит имя функции, возвращаемое значение и аргументы. Должен быть объявлен до первого вызова функции.

Функция main — начало выполнения программы.

Функции инициализации регистров микроконтроллера. В них трансформировались наши действия по заданию конфигурации в программе STM32CubeMX.

И дальше нам в проекте конфигуратор подставил бесконечный цикл — аналог функции loop() в системе Ардуино.

В него мы и вставим команды управления светодиодом.

Текст программы изобилует блоками комментариев подобно этому.

/* USER CODE BEGIN WHILE */

/* USER CODE END WHILE */

Дело в том, что исходный текст создала программа STM32CubeMX. Если захочется что-либо изменить в конфигурации микроконтроллера с помощью STM32CubeMX, то конфигуратор может испортить текст, внесенный программистом на этапе разработки. Поэтому STM32CubeMX выделяет блоки, которые он не будет изменять при повторных конфигурациях. Эти блоки он отмечает строками комментариев:

Свой текст надо размещать только в таких блоках.

Сейчас нас интересует блок:

/* USER CODE END WHILE */

Вставляем инверсию светодиода с задержкой четверть секунды. Добавляем вызовы двух функций: инверсии состояния вывода и временной задержки.

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
<
HAL_GPIO_TogglePin(LED13_GPIO_Port,LED13_Pin);
HAL_Delay(250);

/* USER CODE END WHILE */

Заметьте, что мы указали при конфигурации название вывода для светодиода LED13. Теперь в программе мы обращаемся к нему через имена LED13_GPIO_Port, LED13_Pin.

Компиляция проекта Atollic TrueStudio

Можно закрыть проект.

Скачать архив проекта можно по ссылке:

Теперь надо загрузить исполняемый код во FLASH микроконтроллера.

Прошивка FLASH микроконтроллера.

Результат компиляции оказался в HEX-файле в папке Debug. В моем случае:

Загрузочный HEX-файл STM32

Именно этот файл будем прошивать в микроконтроллер.

Подключаем к компьютеру мост USB-UART. Перед этим должен быть установлен драйвер моста. Как это сделать, можно посмотреть по ссылкам PL2303 и CH340.

Преобразователь интерфейсов обязательно должен быть подключен к компьютеру до запуска программы загрузки FLASH, иначе программа не увидит виртуальный порт.

Запускаем Flash loader demonstrator.

Программатор Flash loader demonstrator

Устанавливаем номер порта.

Нажимаем и удерживаем кнопку ПРОШИВКА.

Кратковременно нажимаем кнопку СБРОС.

Программатор для STM32 Flash loader demonstrator

Если на светофоре горит зеленый — еще раз Next.

Flash loader demonstrator

Можно посмотреть информацию о микроконтроллере и размере его FLASH.

Опять давим Next.

Выбираем Download to device.

Задаем путь к нашему HEX-файлу.

Flash loader demonstrator

Происходит загрузка FLASH микроконтроллера. Выводится сообщение о результате.

Программатор Flash loader demonstrator

Теперь можно отпустить кнопку ПРОШИВКА, и закрыть программу.

Остается нажать кнопку СБРОС и светодиод на отладочной плате начинает мигать с частотой 2 раза в секунду.

Если так, то все было сделано правильно.

В следующем уроке научимся работать с регистрами микроконтроллера, узнаем о библиотеках CMSIS и HAL.

Автор публикации

Эдуард

94 комментария на « Урок 3. Установка программного обеспечения. Первый опыт в конфигурации микроконтроллера, создании проекта, компиляции, прошивке. »

Эдуард спасибо.
Но по сравнению с Ардуино — это день и ночь. Все слишком сложно и геморно.
Для себя открыл Teensy контроллеры от PJRC.com
Такие же удобные и простые как Ардиуновские.
Есть 8 ми битные и 32 битные.

Дело не в контроллерах а в среде программирования. STM32 тоже можно ардуинить особенно легко это делать в Platformio. Там же есть и фреймворк STM32 CUBE и MBED. Можно пользоваться каким душе угодно.

Teensy — обычные контроллеры по конским ценам.
8-битные на атмел можно взять гораздо дешевле. stm32f103 — есть поддержка в ардуино. А уж если на крутизну тянет — возьмите плату на STM32F407VGT6, стоит в пределах 700р.
https://www.ebay.com/itm/STM32F407VGT6-STM32F103C8T6-F407VET6-STM32-ARM-Minisystem-Development-CoreBoard/112987363710?hash=item1a4e92597e:m:meoMyQF8fiJYDIDnPMYBVcA

Здравствуйте всем . очень рад что сразу всё заработало. перед этим 2 месяца изучал работу с регистрами и фьюзами. тема скажу честно очень трудная. пришлось попотеть. но зато теперь смогу собирать и программировать абсолютно всё начиная от капельного орошения и инкубаторов и заканчивая беспилотниками , умным домом с видеотрансляцией по интернету для клиента и платами скажем для холодильных компрессоров с регулировкой скорости оборотов двигателя. спасибо за информацию о Teensy контроллерах и о среде программирования Platformio. изучу обязательно. полученные от дражайшего Эдуарда знания применил на практике собрал и запрограммировал капельное орошение саженцев чтобы не бегать со шлангом и вёдрами по саду а также автомойку самообслуживания с передачей смс хозяину о поступивших суммах денег. пришлось исправлять и переделывать программы работы с платами GSM. так как у нас другой протокол сообщений чем за границей, в общем переделал обработку строк. в общем огромный + за уроки. теперь я могу создавать абсолютно всё без исключения и очень этим доволен. главное для счетчиков выставляйте условие чтобы он при <0(отрицательном значении) приравнивался нулю или указывайте его как unsigned . иначе программа будет зависать на час или больше пока счетчик будет выбираться из минуса куда он попадает после переполнения. всем желаю успехов в этом деле шаг за шагом.

Привет. После Arduino и Си, откровенно завис на HAL, непривычно и непонятно. Что такое микроконтроллер знаю. Работал на i8080, ST6, MSP430 на Assembler, AVR на С. Как удалось себя перебороть?

Спасибо большое! Жду с нетерпением новых уроков, хороший курс, не бросайте его, очень понятный, современный. Хотелось бы урок по загрузки прошивки через st-link.

Спасибо за отзыв. Бросать не собираюсь, я только начал писать на эту тему.

А если я прошил контроллер ст-линком
а потом попробовал аналогично прошить в него хекс из урока
и теперь ст-линк отказывается коннектиться к контроллеру
(может всвязи с настройками кварца?)
его можно как-нибудь оживить?

Здравствуйте!
Внутренний бутлоадер испортить невозможно. Вы что-то не так делаете.

Это бывает, например, если прошивка использует ножки, которые нужны для swd. Тогда можно прошить через st-link утилиту, если установить режим «коннектиться при перезагрузке». Потом нажимаем кнопочку коннект в утилите и быстро делаем ресет кнопкой на плате. Плата перезагрузится (прошивка в этот момент не работает и swd свободен) и должно подключиться. Если не вышло с первого раза, пробуйте ещё

Во-первых, когда генерите код в CUBE, то надо установить в PINOUT CONFIGURATION —> System Core —> SYS —> Debug —> Serial Wire. Иначе по инструкции как в этом уроке сгенеренная прошивка не дает доступ к дальнейшим перепрошиваниям через ST-LINK V2 («китайский свисток»). Во-вторых, если удалось заблокировать микроконтроллер, то действуйте через прогу от производителя ST Link Utility, зажимаете RESET и жмёте законнесктиться в утилите и отпускаете RESET. Утилита получает доступ к памяти МК и теперь можете делать, что хотите. Я бы стёр эту неудачную прошивку ��
Проверено на опыте, ибо сам заблокировал таким образом свой CSK32F103C8T6. Автору просьба добавить этот пункт про SWD, а то люди могут забросить играться в микроконтроллером ибо он больше «не работает».

Именно, так и есть). Спасибо, автору внимательнее нужно подходить к урокам, блин).

Проблема на одном из STM32 blue-pill.
В CUBEIDE (и в Atolic Studio) при дебаге возникает ошибка «Error in initializing ST-LINK device.
Reason: ST-LINK: Could not verify ST device! Abort connection.»
В st-link соединение проходит, hex файл пишется. Но встроенная лампочка PC13 не моргает (проект как в теме выше). На другом контакте (PB12) все работает.
Где копать?

Может светодиод сгорел на 13 ножке

спасибо, но
проблема в том что это самое не так
абсолютно тоже самое что ранее работало

контроллер работает, даже мигает, как и договаривались
вот только ст-линк к нему не коннектится

это не может быть связано с тем что мы там частоты настраивали(множители?)

вот лог ст-линк утилити

20:18:24 : ST-LINK SN : 57FF67064884525035382387
20:18:24 : V2J17S4
20:18:24 : Connected via SWD.
20:18:24 : Connection mode : Normal.
20:18:24 : Debug in Low Power mode enabled.
20:18:24 : Device ID:0x410
20:18:24 : Device flash Size : 64KBytes
20:18:24 : Device family :STM32F10xx Medium-density
20:19:22 : Flash memory erased.
20:20:45 : [Example_GPIO.bin] opened successfully.
20:20:45 : [Example_GPIO.bin] checksum : 0x00010870
20:21:21 : Memory programmed in 0s and 936ms.
20:21:21 : Verification…OK
20:21:21 : Programmed memory Checksum: 0x00010870
21:43:33 : [Lesson3_1.hex] opened successfully.
21:43:33 : [Lesson3_1.hex] checksum : 0x00046B51
21:43:55 : Memory programmed in 1s and 264ms.
21:43:55 : Verification…OK
21:43:55 : Programmed memory Checksum: 0x00046B51
21:43:56 : Disconnected from device.
21:43:56 : Connection to device is lost: check power supply and debug connection.
21:43:56 : If the target is in low power mode, please enable «Debug in Low Power mode» option from Target->settings menu.
21:44:45 : [Example_GPIO.bin] opened successfully.
21:44:45 : [Example_GPIO.bin] checksum : 0x00010870
21:44:50 : Can not connect to target!
Please select «Connect Under Reset» mode from Target->Settings menu and try again.
If you’re trying to connect to a low frequency application , please select a lower SWD Frequency mode from Target->Settings menu.
21:44:53 : No target connected

Посмотрите на форумах. Кто-то пишет, что надо укоротить кабель USB, исключить все потенциальные наводки. Пишут, что необходимо соединить выводы 1 и 19 разъема STLink.

По умолчанию в Cube SWD отключен
https://bravikov.wordpress.com/2016/11/13/stm32cubemx-%D0%BF%D0%BE-%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E-%D0%BE%D1%82%D0%BA%D0%BB%D1%8E%D1%87%D0%B0%D0%B5%D1%82-swd-%D0%B4%D0%BB%D1%8F-f1/

помогла попытка перепрошить меняя BOOT1 и сбрасывая как полагается для usb-uart
простите если замусорил комментарии
могу за собой убрать)

Как прошить чип STM32

В своей недавней статье я подробно разобрал каким образом можно прошивать программным кодом чипы семейства AVR. Сегодня же я рассмотрю способы, которыми можно прошить чипы семейства STM32. Но, я не буду приводить примеры того, как можно «залить» прошивку в микроконтроллер при помощи шнура от утюга или же варианты сопряжения CentOS установленного на Chromebook и программатора от STMicroelectronics. Пойдем по пути наименьшего сопротивления и используем современный ПК с установленной на него Windows 10 64-х битной редакции. В качестве подопытной, которую будем прошивать, возьмем фирменную плату NUCLEO-F103RB. Плата относится к серии Nucleo-64, хотя сами микроконтроллеры 32-х битные. Вероятно, что цифра 64 используется по количеству выводов чипа микроконтроллера, так как для плат серии Nucleo-64 обычно используются LQFP64 корпуса микросхем.

деревья, лес, жуть

Тот самый случай, когда за деревьями не видно леса

В платы Nucleo производитель заботливо уместил средство подключения, программирования и отладки, ST-Link. Плата просто подключается USB-кабелем к компьютеру, и если установлены драйвера, то ее можно прошивать новой прошивкой, связаться по последовательному порту и протоколу, а также начать процедуру отладки. И все по одному кабелю. Однако, ST-Link, вместе с USB-портом, выполнены на куске платы, который можно с легкостью удалить, попросту его отломав. Именно так и поступим, дабы приблизить ситуацию к наиболее распространенной, когда у нас нет встроенного программатора. Ведь нам с вами так или иначе приходится сталкиваться с чипами STM32 без каких- либо дополнительных интегрированных инструментов вообще. Но прежде, чем переходить к практике по прошивке необходимо разобраться в теории, точнее в теории управлением чипами семейства STM32.

Итак, согласно спецификации, чип STM32F103RB обладает целыми тремя коммуникационными протоколами, посредством которых можно взаимодействовать с внутренней памятью с целью внедрения в нее прошивки:

  • Интерфейсом USART.
  • Интерфейсом JTAG.
  • Интерфейсом ST-LINK.

Начнем по порядку.

Universal Synchronous and Asynchronous Receiver-Transmitter (USART)

Данный коммуникационный протокол позволяет подключаться к чипу даже обычным терминалом. В минимальной конфигурации для подключения к устройству нужен всего один провод. В этом случае данные будут отправляться только в одном направлении. Либо на устройство, либо с устройства. Но все же рекомендуется применять как минимум трехпроводную схему подключения: GND, TX, RX. Для подключения с целью прошивки необходимо использовать только USART1.

На чипе STM32F103RB USART1 располагается на следующих выводах:

  • CK (Clock) – PA8
  • TX – PA9
  • RX – PA10
  • CTS (Clear To Send) – PA11
  • RTS (Request To Send) – PA12

При подключении к USART следует помнить, что чипы семейства STM32 работают на напряжении 3.3 В и не стоит подключаться к ним переходниками с напряжением в 5 вольт.

Joint Test Action Group (JTAG)

JTAG — весьма популярный интерфейс, ставший промышленным стандартом. Интерфейс применяется для подключения к сложным интегральным схемам с целью тестирования и отладки. В том числе, при помощи данного интерфейса можно осуществлять заливку прошивок в чипы STM32.

На чипе STM32F103RB JTAG-интерфейс выведен на следующие позиции:

  • JTMS (JTAG Test Mode Select) – PA13
  • JTCK (JTAG Test Clock) – PA14
  • JTDI (JTAG Test Data Input) – PA15
  • JTDO (JTAG Test Data Output) – PB3
  • JNTRST (JTAG Test nReset) – PB4

Для функционирования коммуникации с чипом достаточно подключить только четыре первых позиции, но для большей гибкости, особенно в сложных случаях рекомендуется так же использование JNTRST.

Single Wire Interface Module (SWIM), Serial Wire Debugging (SWD) и ST-LINK

Фирма ST весьма крупная, на начало 2020 в ней работало более 40 тысяч человек. Это очень много и управлять такой махиной без бюрократического подхода просто невозможно. Поэтому в недрах ST периодически рождаются и формируются различные экосистемы. Экосистема STM32 не стала исключением. Она росла, развивалась до того момента, пока разобраться в нагромождении аббревиатур, названий, интерфейсов, их групп и прочего стало очень не просто. Но возможно. Аббревиатурой SWIM, как правило именуют сразу три сущности: кабель, технологию подключения по одному проводу и аппаратный модуль, обеспечивающий подобное подключение. SWD — означает технологию отладки при использовании последовательного подключения. При чтении литературы и форумов по STM32 можно так же натолкнуться на сокращения типа SWO вкупе с SWV.

SWO это Single wire output, т.е. технология позволяющая по одному проводу выдавать из чипа какую-то информацию. Как правило она используется для отладки, когда разработчики не желают использовать обычные UART для ее вывода, что весьма полезно, так как в любой момент можно подключиться к работающему устройству и начать получать отладочную информацию. Получать и просматривать информацию можно посредством Serial Wire Viewer (SWV). По сути, обычным терминалом с дополнительными функциями. Выдача информации осуществляется только при использовании режима SWD и доступна на микропроцессорах начиная с Cortex-M3.

И подбираясь к самому интересному, хочется отметить, что под наименованием ST-LINK кроется не только комплекс технологий, объединяющих SWIM, SWD, SWO и тому подобное, но еще и программное обеспечение, которое реализует весь набор практик и интерфейсов.

Для подключения ST-LINK на STM32F103RB задействованы следующие выводы:

  • SWDIO (Serial Wire Data Input/Output) – PA13
  • SWCLK (Serial Wire Clock) – PA14
  • TRACESWO (Trace of Serial Wire Output, та самая SWO) – PB3

Для работы через SWIM/SWD нужно-то всего два проводка, не забываем про обязательное соединение земли по всем подключенным устройствам. TRACESWO можно не подключать, особенно если данной функцией вы не пользуетесь, да и для отладки она, а не для загрузки прошивки.

Аппаратное обеспечение

Для работы с STM32 разработано и выпущено в свет великое множество различных аппаратных модулей, вот лишь самые популярные из них:

  • ST-Link;
  • J-Link;
  • Black Magic Probe.

К сожалению, у меня нет на руках ни J-Link, ни тем более Black Magic Probe, поэтому в качестве аппаратных устройств рассмотрим только USART и ST-Link.

ST-Link великий и ужасный

Когда кто-то упоминает устройство ST-Link, то скорее всего имеет ввиду китайский аналог под кодовым названием ST-Link V2 Mini. Небольшой USB-свисточек в цветастом корпусе с десятипиновым разъемом IDC. Именно такой и будем рассматривать далее. Стоят подобные устройства более, чем доступно, работают отменно, подключаются и к семейству STM8, и к семейству STM32. Но прежде пробежимся по версиям ST-Link, ведь ST-Link V2 означает вторую версию устройства.

На начало 2020 актуальны следующие аппаратные версии ST-Link:

  • ST-Link – первая версия устройства, сейчас уже не актуальна. Поддерживается подключение по USB.
  • ST-Link/V2 – вторая версия устройства. Работает с STM8 и STM32. Поддерживается улучшенное подключение по USB.
  • ST-Link/V2.1 – обновленная вторая версия устройства. Работает с STM32 (поддержки SWIM для STM8 нет). Изначально предполагалось использовать ее как встраиваемую часть системы. Поддерживает подключение по USB с технологией виртуального COM-порта, а заодно и как сменный накопитель. В таких системах нет необходимости отдельно подключать USART, достаточно только устройства ST-Link/V2.1. Именно ST-Link/V2.1 интегрирован в отладочную плату NUCLEO-F103RB, поэтому при подключении ее к ПК, подключается и COM-порт и протокол SWIM. А прошивки можно загружать, просто записывая их на чип как на флешку. Удобно, но такие программаторы в виде отдельных устройств в продаже отсутствуют.
  • ST-Link/V3 – третья версия устройства. Бывает в виде версии E (встраивается как часть системы) и S (Set или Standalone, включая SET, MINI и MODS). Работает только с STM32.

Производят ST-Link V2 Mini в массовом порядке все, кому не лень. А не лень в первую очередь нашим китайским друзьям. Вот и поставляют они универсальные отладчики-программаторы в невероятных количествах на мировой рынок. И это хорошо, ведь благодаря массовому выпуску и конкуренции есть возможность приобрести программатор за очень небольшие средства. Да, он не самой последней версии, но работать с ним можно. Нужно только разобраться как.

stlink, st-link, v2, mini, программатор, без крышки, проводки, клетка, пурпурный

Типичные представители китайских ST-Link V2 Mini

На свои устройства, заботливые производители из далекой и большой страны, предусмотрительно наносят распиновку выходов. И делают они это совершенно верно, так как никакой инструкции к устройству не прилагается. Однако, если покопаться в сети, то можно обнаружить, что существует несколько вариантов реализации вывода на китайских ST-Link V2 Mini, поэтому стоит обратить внимание на выводы, при подключении нового устройства.

При первом знакомстве с ST-Link V2 Mini у меня возникло затруднение в плане определение выводов на программаторе. Да, они подписаны и пронумерованы на корпусе, но на самом разъеме кроме ключа нет ничего. Поэтому пришлось повозиться с определением, где первый «шпынек», а где второй и все последующие.

st-link v2 mini, stlink, mini, jtag, прошивка, stm32, stm8, клетчатый, разъем, IDC, IDC10, pin, pins, пины, SWIM, SWDIO

Распиновка у моего ST-Link v2 Mini

Если подключить ST-Link V2 Mini к ПК под управлением Windows 10, то система автоматически найдет драйвер и произведет его установку. Если же драйвер не установился, либо используется версия операционной системы отличная от Win10, то можно поступить двумя путями: а) скачать драйвер с сайта производителя, б) скачать программную оболочку (о них ниже) от STMicroelectronics в поставке которой уже есть драйвер. Хочется сразу предупредить, что скачка любого программного обеспечения от ST возможна только зарегистрированным пользователям. Так компания накапливается данные о своих существующих или потенциальных клиентах.

Чем грозит отсутствие RST на STM32?

У китайских V2 Mini есть еще одна особенность. Поскольку программаторы предназначены как для работы с STM8, так и с STM32, то они содержат сразу выводы и для тех, и для других. Причем выводы на левой части разъема, около ключа, предназначены для подключения STM8 (там задействованы RST и SWIM), а на правой для STM32 (там SWCLK и SWDIO). Поэтому при работе с STM32, даже если подключить на плату вывод с RST, функция аппаратного сброса работать не будет, так как она используется только для семейства чипов STM8, для STM32 применяется другой вывод микрочипа, который не выведен на колодку разъема. Ту же учесть постиг вывод SWO. Увы, за дешевизну и многофункциональность приходится платить. Хотя, некоторые умельцы отключают вывод RST и SWIM и подключают туда верные выводы с нужных ножек микрочипа в программаторе.

В принципе, который так же подтверждается практикой, вполне можно не подключать выход сброса на микроконтроллере к программатору. Чипы STM32 весьма стабильны и если в вашей программе нет переназначений выводов, которые используются для SWD, то переход в режим программирования возможен без аппаратного сброса. Однако, если вы что-то напутали и назначили выводам (в случае STM32F103RB это PA13 и PA14) какие-то функции, то просто так запустить программатор не выйдет.

В чем проблема? Дело в том, что по умолчанию, STM32 сразу же запускает на выполнение программный код пользователя. А поскольку чип работает очень быстро, то программным способом не удается поймать момент между запуском чипа и инициализацией выводов SWD. В этом случае необходимо «нажимать» на сброс собственноручно. Ножку Reset микроконтроллера необходимо соединять с землей, запускать подключение SWD, отпускать Reset. Если наловчиться, то таким образом можно добиться срабатывания 8 или даже 9 раз из 10.

В режиме ручного сброса есть нюанс. А именно нештатный загрузчик (bootloader). Его наличие может несколько облегчить работу по подключению неподключаемого чипа, так как обычно загрузчик ждет некоторое время сигнала через UART о начале загрузки прошивки. Однако, насколько мне известно, свой загрузчик устанавливает только Arduino с ядром Maple. Но данный фреймворк уже не актуален в виду окончания его развития и поддержки.

USART/UART

Для подключения по последовательному протоколу к чипу потребуется обыкновенный конвертер USB2COM (USB2TTL, USB2UART или под любым другим наименованием). Я уже рассматривал несколько вариантов, включая кабели с чипами, для подключения по UART к AVR. Смысл подключения к STM32 ровно такой же. Только в качестве преобразователя интерфейсов под STM32 я приобрел платы от Waveshare на чипе PL2303. Платы простейшие, оборудованные всего четырьмя выводами.

При подключении к ПК, автоматически устанавливаются драйвера и устройство определяется в системе как COM-порт. При подключении адаптера к микроконтроллеру стоит обратить внимание на установленную перемычку. Плата от Waveshare способна работать с двумя напряжениями: 3.3 и 5 вольт. С чипами STM32 необходимо работать только в режиме 3.3 вольта.

usb2ttl, usb2uart, usb2com, адаптеры, waveshare

Типичные китайские USB2COM свистки

Подключение адаптера к плате примитивное. Соединяем GND, соединяем выводы адаптера и микроконтроллера Rx и Tx перекрестно (Rx одного идет на Tx другого и наоборот). Все, теперь можно работать.

Стоит ли подключать Vcc?

На ST-Link, как и на USB2TTL есть выводы Vcc/Vdd/V+. На них подается постоянное напряжение в 3.3 вольта, родное для большинства чипов STM32. Стоит ли соединять эти выводы между платой микропроцессора и адаптером? В каких-то случаях да, в каких-то случаях нет.

Если вы планируете прошивать (или проводить отладку) платы без подключения внешнего питания, то подключение Vcc от внешнего адаптера (ST-Link или USB2COM) позволит работать с платой в штатном режиме ее микропроцессора. Он будет думать, что все работает так как надо, а вот возможные силовые элементы, например, реле, отвечать на управляющие запросы уже не смогут. Подключать Vcc сразу от ST-Link и от USB2TTL можно только в том случае, если оба устройства подключены к одному ПК.

Если же программируемое устройство работает со своим питанием, то нужды в подключении дополнительного Vcc от ST-Link или же от USB2UART излишне, а в некоторых случаях может приводить и к выходу из строя адаптеров.

Из этого правила есть исключение. Если используется не китайский аналог аппаратного программатора ST-Link, а «родное» устройство, а на плате или у микроконтроллера используется нестандартное питание, то подключение сенсора напряжения с программатора ST-Link желательно. В этом случае будет происходить согласование уровней интерфейса, а плату микроконтроллера придется запитывать от внешнего устройства.

Соединять GND (землю) между всему устройствами — обязательно.

BOOT0/BOOT1

ST позаботились об отказоустойчивости своих чипов. Даже в случае, если нет возможности подключиться к чипу по SWD, у пользователя все еще остается возможность добраться до микроконтроллера и закачать в него обновленную прошивку или стереть всю память. Процедура осуществляется через встроенный загрузчик (bootloader), который вызывается только при особой конфигурации выводов.

Что интересно, загрузить прошивку через загрузчик можно не только через USART (как все обычно привыкли), но и через CAN-шину, USB-DFU (Direct Firmware Upgrade), I2C и SPI протоколы. Другими словами, хоть через что-то, а загрузиться можно. Но таким многообразием способов загрузки оснащены только старшие модели микроконтроллеров семейства STM32, в младших доступен только USART.

Согласно спецификации, получить доступ к загрузчику можно аж 12 различными способами. Но, далеко не все из них доступны на каждом из чипов семейства STM32, да и обычно используется только способ под номером 1. При загрузке микроконтроллера, необходимо на вывод Boot0 микроконтроллера подать высокий уровень (3.3 В), а на вывод Boot1 низкий (0 В, соединить с землей). При выполнении этих двух условий микроконтроллер запустит прошитый на заводе в чип загрузчик.

У чипа STM32F103RB Boot0 выведен на отдельный вывод, а Boot1 совмещен с выводом PB2. Поэтому, по сути, если ничего не подключать к PB2, то можно оперировать только Boot0 (хотя позже мы увидим, что это не совсем так). Подаем на него высокий сигнал при загрузке чипа (по питанию или по сбросу), и попадаем в загрузчик.

На плате Nucleo-F103RB Boot0 выведен на пин с номером 7 morpho-коннектора. Закоротить на 3.3 вольта его можно при помощи перемычки (на плате есть две запасные перемычки на выводах с нижней стороны) установленной на пины 5-7 (пин 5 это Vdd).

Программное обеспечение

Для загрузки прошивки в чипы STM32 и платы на их основе существует необъятное множество программных продуктов, даже сама ST рекомендует набор из пяти бесплатных утилит для загрузки:

  • STM32CubeProg
  • STLink-Utility
  • STVP (STM32)
  • Flasher-STM32 – для загрузки через UART
  • DfuSe – для загрузки через USB

Пробежимся по ним.

STM32CubeProg

Фирменный программатор от ST, скачивается с официального сайта (не забываем про обязательную регистрацию). STM32CubeProg позиционируется как универсальное средство, содержащее в себе всё необходимое, да еще и под несколько платформ (Windows, Linux, MacOS) сразу. STM32CubeProg можно использовать как в виде графической оболочки, так и в виде консольной версии для любителей клавиатуры и черного экрана терминала. Такая неприхотливость и неразборчивость объяснятся просто — оболочка написана на Java, поэтому может портироваться куда угодно (необходимо только изменять небольшое платформозависимое ядро). ST даже не стали разбивать поставку по операционным системам, просто включили все дистрибутивы в один архив, а пользователь сам разберется, что ему нужно. Удобство неимоверное.

При первом подключении ST-Link V2 программатор может определить, что версия прошивки на ST-Link V2 устарела и предложит ее обновить. При желании можно обновить, на китайских устройствах проблем без или после обновления версии прошивки не обнаружено.

st-link v2 mini плата Nucleo подключение

Огрызок Nucleo-64 с подключенным St-Link V2 MIni

При подключении ST-Link к плате Nucleo с отломанным ST-Link V2.1 подключаем выходы с китайского ST-Link V2 к коннекторам ST morpho CN7 (гребенка с левой стороны) следующим образом:

  • 3.3 V -> Pin5
  • GND -> Pin19
  • SWCLK -> Pin15 (PA14)
  • SWDIO -> Pin13 (PA13)

После физического подключения на плате Nucleo включается светодиод питания (красный) и начинает выполняться прошивка (если туда зашит блинкер, то будет мигать зеленый светодиод). На ST-Link V2 загорается синий светодиод. После нажатия на кнопку Connect в STM32CubeProgrammer микроконтроллер переводится в режим остановки, считывается некоторый объем памяти и устройство готово к программированию или любым другим операциям. ST-Link V2 в этот момент сигнализирует о режиме остановки попеременным миганием синего и красного светодиодов.

stm32cube, connected, stm32

Программатор подключившийся к плате посредством интерфейса ST-Link

Cube Programmer, помимо просто прошивки позволяет выполнять следующие операции:

  • Читать и сохранять Flash-память микроконтроллера, если она не защищена от чтения.
  • Очищать как Flash-память, так и внешнюю память микроконтроллера. Причем очищать можно как поблочно, так и все целиком. Под внешней памятью тут подразумевается память, подключенная посредством SPI, FMC, FSMC, QSPI, OCTOSPI и другими интерфейсами, но работать с ней можно только при помощи внешнего загрузчика (в комплекте уже идет набор из внешних загрузчиков под наиболее популярные платы).
  • Устанавливать или снимать флаги запрета чтения Flash иначе чем из программного кода, выполняемого микроконтроллером, снимать или устанавливать флаги запрета записи в конкретные сектора на Flash, и некоторые другие функции.

CubeProg помимо ST-Link может подключаться по UART, USB и OTA (обновление по воздуху). Для начала рассмотрим наиболее интересующий нас вариант подключения посредством ST-Link. При подключении ST-Link V2 к компьютеру и выборе варианта загрузки через ST-Link в окне ST-LINK Configuration отображаются некоторые настройки, которые могут повлиять на способность подключения. Дам пояснения всем им:

  • Serial number — серийный номер микроконтроллера установленного в ST-Link. У всех чипов STM32 есть свой собственный, уникальный серийный номер, а в ST-Link V2 установлен именно чип семейства STM32.
  • Port — подключение посредством SWD или JTAG. Поскольку мы используем ST-Link V2 от безымянного китайского производителя, то в нашем случае функциональным будет только SWD.
  • Frequency (kHz) — частота на которой работает интерфейс SWD или JTAG. Чем больше значение, тем быстрее все будет прошиваться и считываться, но при длинном кабеле могут возникать ошибки. Если все работает, то оставляем в значении по умолчанию.
  • Mode — режим подключения ST-Link к чипу, может принимать три значения. Normal — стандартный вариант подключения: производится сброс, затем перевод устройства в режим остановки. Вариант сброса выбирается в следующем пункте. Connect Under Reset — подключение и остановка выполнения программы в микроконтроллере при сбросе. Тот самый случай, когда выводы ответственные за SWD/JTAG на микроконтроллеры переназначены на другие функции. При этом варианте программатор старается отловить момент, когда происходит сброс (пользователь отпускает кнопку Reset). Hot Plug — подключение без сброса и остановки, применяется для «горячего» изменения регистров или памяти.
  • Reset Mode — выбор варианта сброса, может принимать несколько значений. Software reset — вариант по умолчанию, происходит полный сбор микроконтроллера программным способом за исключением подсистемы отладки. Hardware reset — сброс через вывод Reset микроконтроллера. Физический программатор при этом должен быть подключен к выводу Reset своим управляющим выводом Reset. На китайском варианте ST-Link V2 Mini данная функция неработоспособна. Core reset — сброс ядра микроконтроллера.
  • Access port — на большинстве устройств STM32 всего один порт доступа по SWD/JTAG, поэтому оставляем значение по умолчанию.
  • Shared — позволяет эксклюзивно (Disabled) захватывать подключение к микроконтроллеру, если же функция включена (Enabled) то можно запустить несколько STM32CubeProg или других программных оболочек к одному физическому устройству ST-Link.

Итак, если есть какие-то сложности при подключении программатора к микроконтроллеру, то начинаем играться с настройками. В большинстве случаев помогает переключение в режим Connect Under Reset. А если же проблем нет, то переходим непосредственно к программированию.

STM32CubeProg, st-link, cube prog, firmware update

Процесс обновления прошивки ST-Link в STM32CubeProg

В качестве программы-примера для прошивки я буду использовать обычный Blink («мигатель») написанной на языке MBED (активно продвигается ST для своих плат). Код программы примитивен, но вполне рабочий (и компилируется всего в 50 Кб):

#include «mbed.h»
DigitalOut myled ( LED1 ); int main () <
while ( 1 ) <
myled = 1 ;
wait ( 1 );
myled = 0 ;
wait ( 1 );
>
>

Итак, программа откомпилирована под мой чип (STM32F103RB), Flash-память контроллера предварительно стерта (дабы убедиться, что новая программа работает, а не старая). Мой компилятор подготовил для меня сразу два файла:

  • Файл с расширением elf — промежуточный формат, содержит откомпилированную микропрограмму, но она требует линковки в соответствии с конкретным чипом.
  • Файл с расширением bin — конечный формат для загрузки в конкретный микрочип.

На главной странице CubeProg нажимаем плюсик и выбираем файл с расширением bin для загрузки. Если с файлом все в порядке, то его содержимое (в одном из форматов разрядности) открывается в окне просмотра. Теперь можно подключится к чипу, если чип уже не подключен, и нажимаем Download (тут странно, ведь в нашей культуре загрузка прошивки в чип была бы выгрузкой, Upload). Отключаем программный программатор (Disconnect) и перезагружаем плату. После перезагрузки встроенный светодиод начинает мигать.

cube prog, stm32, загрузчик

Альтернативный способ загрузки прошивки в Cube Prog

Загрузить прошивку в микроконтроллер можно и на вкладке Erasing & Programming. В этом случае есть возможность настроить параметры загрузки. В данном примере я включил галочки проверки загруженного после прошивки, а так же запуск программы на исполнение после завершения загрузки. При этом ST-Link не выходит из режима подключения к плате, а все так же остается подключенным.

Подключаемся через заводской загрузчик и с использованием STM32 Cube Programmer

Как правило, при подключении через ST-Link проблем не возникает. А вот с UART придется совершить больше действий. Для начала следует убедиться, что в системе есть драйвера под USB2COM адаптер. Под чип PL2303 в Win10 обыкновенно все уже имеется сразу, либо скачивается с серверов обновления Microsoft. Но все равно, следует открыть диспетчер оборудования (Device Manager) и убедиться, что устройство работоспособно и ему назначен соответствующий номер порта. В моем случае устройство подключилось на COM4.

Вторым шагом необходимо провести соответствующую коммутация проводников. Подключить Tx на USB2TTL к выводу PA9, Rx к выводу PA10 (при чтении спецификации не лишним будет обратить внимание на то, что USART1 может быть альтернативно переназначен на другую пару выводов, в случае с F103RB это PB6 и PB7). Затем необходимо подключить вывод PB2 (сюда заведен вывод BOOT1 микрочипа) к любому выводу земли. Подключаем вывод BOOT0 к любому выводу 3.3 V, а также не забываем про соединение GND USB-адаптера и платы. Если плата не питается от чего-то еще, то подключаем так же питание 3.3 V с USB-адаптера на, например, Vdd пин Nucleo (кстати, на Nucleo присутствует перемычка, определяющая откуда на микропроцессор будет подавать питание, с Vdd или от USB встроенного ST-Link, при отломанном ST-Link питание в любом случае будет браться с Vdd).

stm32, usart, st-link, подключение, плата, провода, USB

К Nucleo-64 подключены свистки UART и ST-Link

Таким образом мы подключили USB2UART адаптер к USART1 (именно к USART1 подключается загрузчик) платы Nucleo, подали на нее с того же самого адаптера питание и активировали Схему 1 вызова заводского загрузчика (BOOT0 +3,3V; BOOT1 GND). После нажатия на сброс, если все было подключено верно, вместо выполнения кода мигателя (он остался от предыдущих экспериментов с ST-Link) будет исполнен заводской загрузчик. Небольшое замечание: несмотря на то, что по умолчанию BOOT1 (PB2 в случае Nucleo-F103RB) инициализируется на землю, его все равно рекомендуется жестко соединить с GND, в противном случае возможно срабатывание загрузчика «через раз» (при этом пользовательская прошивка так же не будет вызываться, так как BOOT0 не будет передавать ей управление).

stm32cubeprog, stm32, cube, prog, programmer, uart, usart, загрузчик, бутлоадер, bootloader

STM32 Cube Prog подключенный к плате через заводской загрузчик

Для подключения через USART в CubeProg необходимо выбрать тип подключения UART и выбрать соответствующий COM-порт. В отношении остальных параметров вопрос остается открытым. Дело в том, что заводской загрузчик от ST обладает возможностью автоподстройки под параметры подключения по UART, с другой стороны, на конкретных параметрах и из-за особенностей аппаратного обеспечения может не произойти подключение к загрузчику программатора. Поэтому, если подключение не происходит необходимо в первую очередь поиграться со скоростью подключения, затем с четностью. Если же ничего не помогает, то необходимо еще раз перепроверить все подключения.

После установления связи программатора с платой посредством UART можно пользоваться CubeProgrammer точно так же, как и при подключении через ST-Link. Более того, можно не отключать от платы и сам адаптер ST-Link, на работоспособность его присутствие не влияет. А вот следует ли отключать 3.3 V от BOOT0? Высокий уровень на BOOT0 требуется для инициализации заводского загрузчика. После подключения программатора к чипу, можно отключить BOOT0 от напряжения, тогда при следующей перезагрузке платы управление будет передано пользовательской прошивке, загруженной в чип.

ST-Link Utility

ST-Link Utility, пожалуй, основная и наиболее популярная утилита для загрузки прошивок в STM32 посредством ST-LINK, которой все пользуются. Загружается программный продукт с сайта ST за регистрацию. По набору возможностей и функций ST-Link Utility практически полностью повторяет STM32CubeProg за исключением двух моментов. Utility работает под Windows, Utility может подключаться к платам только посредством SWD или JTAG. Все остальное, начиная от настройки Option Bytes и заканчивая внешними загрузчиками с командной строкой повторяет CubeProg. Да, интерфейс немного отличается, он проще, зато нет никакой Java и в помине.

st-link utility, программатор, stm32

Место где кроются настройки в ST-Link Utility

Настройки подключения (те самые Connect under reset) скрываются в меню Target, там же кроются пункты про прошивке.

st-link itility, stm32, программатор

Все готово к заливке прошивки в ST-Link Utility

Итак, пробуем прошить нашу плату через ST-Link V2 и с применением ST-Link Utility. Подключаемся к устройству, очищаем Flash-память, выбираем наш файл firmware.bin и жмем Start. Секунда ожидания и зеленый индикатор на плате замигал. Прошивка проведена удачно.

Несмотря на то, что ST-Link Utility полностью повторяет часть функций CubeProg, многие разработчики используют именно ее, так как считают, что этот продукт более надежен и прост в использовании.

STVP (STM32)

Утилита STVP (ST Visual Programmer) можно скачать с официального сайта ST. Она работает под управлением Windows и поддерживает не только STM32, но и чипы семейства STM8 (если они кому до сих пор интересны). STVP является часть ST MCU Toolset, который помимо самого программатора включает еще среду разработки STVD и ассемблерный линкер.

stvp, stm32, программирование, контроллер, прошивка, firmware

Вид STVP с подключение к чипу

STVP заточен на ассемблер, на настоящих хардкорщиков, тех кто способен писать программы для микроконтроллеров обращаясь напрямую к регистрам и памяти микроконтроллера. Поэтому он может работать только с файлами hex и s19. Подобного компилятора у меня под рукой не нашлось, поэтому процедуру прошивки пришлось пропустить, тем не менее программатор подключился через китайский ST-Link V2 к моей плате, считал ее память и отобразил все на экране. При наличии желания – связка работоспособная, тем более, что STVP работает не только с ST-Link, но и с RLink, STICE и прочими аппаратными системами ориентированными в основном на семейство STM8.

Flasher-STM32

Flasher-STM32 в девичестве назывался STM32 Flash loader demonstrator и использовался для загрузки демонстрационного мигателя с первыми платами. Загружает прошивки только через UART (он же COM-порт) и присутствует исключительно под Windows. Заполучить прошивальщик можно все там же, с сайта ST.

STM32, Flash Loader, FlashLoader, Flash Demonstrator, программатор, ST

Основные экраны STM32 Flash Loader

Пользоваться загрузчиком очень просто, так как интерфейс скуден и все сложное убрано далеко от глаз. В принципе, все, что в нем есть, это очистка бита защиты flash-памяти чипа от чтения (в микроконтроллерах STM32 есть такая штатная функция, как защита от чтения), управление защитой записи и чтения секторов встроенной flash -памяти, возможность загрузки и выгрузки прошивки и содержимого flash-памяти чипа, редактирование Option Bytes (настроек микроконтроллера).

DfuSe

Наименование DfuSe происходит от Device Firmware Upgrade STMicroelectronics Extension. Методика DFU была придумана для еще более простого обновления прошивок на разработческих платах с портом USB. Программа работает только через подключение по USB. Доступны библиотеки для написания собственных приложений по загрузке прошивок в микроконтроллеры.

dfu, stm32, dfuse, программатор

Основной и единственный экран DfuSe

DfuSe принимает на борт прошивки только в формате DFU. Формат содержит не только саму прошивку как таковую, но еще и манифест или матаданные о том, как эту прошивку применять (или иначе — информацию о плате). И если подключенная плата не является поддерживаемой, то никакой прошивки не произойдет. Тем самым существенно упрощается вся процедура прошивки и уменьшается риск порчи платы при прошивке, но нужна поддержка режима DFU на самой плате, что несколько сокращает популярность программатора.

dfu, dfumanager, manager, stm32, программатор

Интерфейс DfuSe Manager для работы с DFU-файлами

Создаются файлы DFU при помощи комплектной утилиты DFU File Manager. Она может не только запаковать прошивку в файл, но и произвести обратный процесс.

К слову сказать, но мне так и не удалось подключить Nucleo-F103RB к DfuSe, так как USB на плате подключается к ST-Link V2.1, а не напрямую к микроконтроллеру. Для работы же DFU требуется прямое подключение микроконтроллера к USB (с согласованием уровней, разумеется). В таком случае, при наличии соответствующих драйверов (и с задействованием схемы с запуском загрузчика) в операционной системе можно загружать прошивку по обычному USB.

Можно ли использовать плату ST-Link V2.1 от плат Nucleo?

В процессе изысканий способов заливки прошивок разными способами в плату на основе чипа STM32 от платы донора Nucleo-64 была успешно отломана часть с программатором ST-Link версии 2.1 с портом USB. И сразу же возникает вопрос, а нельзя ли эту плату в дальнейшем использовать как удобный программатор? Ведь иметь одно устройство, сочетающее в себе сразу три (ST-Link, Virtual COM и USB Mass Storage) ой как удобно.

st-link v2.1, nucleo-64, подключение, плата, провода, шпыньки, пины

Nucleo-64 с подключенным SWD ST-Link V2.1

Давайте попробуем, в качестве бонуса, подключить программатор ST-Link от платы Nucleo обратно к плате Nucleo посредством проводков, словно мы используем произвольный чип STM32 с программатором ST-Link V2.1.

На «огрызке» имеется несколько разъемов и перемычек для подключения чего-либо, вот они:

  • CN2 – выбор режима работы ST-Link через коннектор SWD или же через дорожки на печатной плате.
  • CN3 – выход на UART (пины Tx, Rx).
  • CN4 – коннектор SWD.
  • CN12 и CN11 – на некоторых платах используется как выход для пинов вместо внешнего осцилятора. При поставке закрыты на землю с обратной стороны.
  • JP1 – применяется для ограничения потребления платой через порт USB. Если перемычка снята, то максимальное потребление платой и всей ее обвязкой должно быть не более 300 мА. Если перемычка установлена, то максимальное потребление не должно превышать 100 мА, при этом питание платы Nucleo должно осуществляться через E5V или VIN пины. Однако, если плата подключена по USB не к порту компьютера, а к USB-блоку питания или USB-хабу со своим питанием, то Nucleo-64 можно запитывать и через USB при большом потреблении, но тогда нужно установить перемычку. Ограничения внесены на тот случай, если плата перестает стабильно работать/определяться при перегрузке по питанию порта USB, по большей части относится к портам USB1/USB2.

Итак, для целей использования ST-Link от Nucleo как отдельного программатора ST-Link V2.1 следует:

  • Снять перемычки с CN2, таким образом мы активируем коннектор SWD.
  • Подключить выводы с коннектора CN4, первый пин верхний и обозначен точкой, подключаем сразу к «огрызку» Nucleo-64:
  1. VDD_Target – сенсор питания платы, через него нельзя запитать что-либо, он действует наоборот. При подключении к платам со стандартным питанием его можно не подключать.
  2. SWCLK – подключаем к PA14
  3. GND
  4. SWDIO – подключаем к PA13.
  5. NRST – сброс
  6. SWO – порт по отладочной информации.
  • Также подключаем пины Tx (сверху) и Rx (снизу) к PA10 и PA9 соответственно.
  • Берем питание еще откуда-либо, например, с левого пина JP1, там 3.3 вольта.

Соответственно, если все подключено верно, то появляется сразу три возможности:

  1. При подключении ST-Link V2.1 к ПК по USB подключается папка с несколькими файлами, включая инструкцию. Эта папка – внутренняя Flash-память ST-Link (он так же построен на чипе STM32, поэтому в нем все есть). Если в эту папку скопировать файлик с прошивкой, то он автоматически запишется в подключенную плату. Однако, следует учитывать, что объем «флешки» программатора всего 156 Кб, и очень объемную прошивку залить таким образом может не получиться.
  2. Подключаться по SWD (ST-Link) программаторами и осуществлять все предусмотренные операции. При этом корректно отрабатывает Reset.
  3. Подключаться к USART1 (или любому другому доступному к которому были подключены выводы) терминальной программой. При этом в операционной системе COM-порт определяется как STLink Virtual COM Port. А при наличии правильной конфигурации BOOT01/BOOT1 можно так же обращаться и к заводскому загрузчику.

Вместо заключения

Разработчики STM32 проделали огромную работу, как в плане разработки своих чипов, так и программного обеспечения. Несомненно, что чипы STM32 современны и весьма удобны в работе. Вокруг них собрана невероятная инфраструктура, написаны сотни и тысячи спецификаций, разработаны десятки программных и аппаратных комплексов для работы с микроконтроллерами STM32. Но все это многообразие может вызвать реакцию отторжения у новичка, который может быть просто ошеломлен объемом информации, которую следует переварить, дабы хоть как-то начать ориентироваться в мире STM32. И надеюсь, что мое кратенькое погружение в запутанный мир современной микроэлектроники позволит хоть немного облегчить труд познания.

Казалось бы, что тема прошивки чипов STM32 исчерпана, но приведенные методики хоть и являются массовыми, но сами по себе всего лишь верхушка айсберга, вершина огромного пласта информации. И соответственно присутствует огромное, непаханое поле для творчества.

Опубликовано 31.01.2020 автором kvv213 в следующих категориях:
Soft железо статья

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *