Прошивка stm32. Прошивка stm32 через UART. Программное обеспечение для прошивки

Как вы уже догадались, в этой статье пойдет речь о последнем способе. Я считаю его не самым лучшим вариантом для постоянного использования, однако в некоторых случаях он очень даже хорош. Вот допустим устройство уже готово и работает у пользователя, и вдруг ВНЕЗАПНО возникает потребность в перепрошивке. Конечно, можно разобрать девайс и подпаяться к отладочному интерфейсу, но это относительно сложно + нужен отладчик. А что если устройство уже соединено с компом через UART ? В этом случае гораздо проще использовать этот интерфейс для загрузки прошивки. Вот тут-то загрузчик будет очень кстати. Пользователю достаточно нажать одну кнопку и девайс входит в режим прошивки. Пару нажатий мышки и прошивка обновлена. Теперь попробуем разобраться более детально как все это работает. Для начала нам нужно подключить наш контроллер к компьютеру через интерфейс USART1.

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

BOOT1 BOOT0 Что запускается
Х 0 Программа прошитая во FLASH
0 1 Загрузчик
1 1 Программа из SRAM

Как вы помните из , загрузчик сидит в области памяти под названием Sytem Memory. Каким либо образом изменить его нельзя. Это делает контроллер не убиваемым в плане софта, даже если перепрошивку неожиданно прервут — девайсу ничего не грозит. Всегда можно будет начать прошивку заново. С другими пунктами таблицы все просто: первая комбинация означает, что контроллер будет запускать прошивку которую в него прошили, а последняя комбинация — означает, что контроллер будет выполнять код из ОЗУ который еще как-то туда надо поместить. Пока не совсем понимаю для чего это нужно, разве что программа выполняется быстрей (если верить интернетам). Вернемся к загрузчику. Чтоб ввести наш контроллер в режим прошивки, удерживаем кнопку BOOT и жмем RESET. После этого кнопку можно отпустить. Для прошивки используется специальный софт который называется Flash Loader Demonstrator. Вы можете скачать его на сайте ST или у меня . Процедура прошивки проста до безобразия: Достаточно лишь следовать указаниям мастера. На первом шаге нас попросят выбрать номер ком порта к которому подключен контроллер и указать настройки соединения. Что примечательно у загрузчика есть автодетект скорости. Это значит что можно свободно выбрать любую скорость из списка и оно заработает. Лишь бы ваш адаптер RS232 — UART (или USB-UART) её поддерживал. Мой преобразователь на CP2102 о котором я вкратце , отлично работает на всех скоростях. Однако, нужно иметь в виду, что загрузчик настраивает контроллер на тактирование от внутреннего генератора. А его частота сильно плавает в зависимости от напряжения питания и температуры. Следовательно если у вас проблемы со стабильностью этих двух параметров, то лучше выбирать маленькую скорость.

Если соединение с контроллером установлено, то программа нарисует нам окно в котором покажет сколько памяти у программирования контроллера и включена ли защита памяти от чтения. Если контроллер защищен от считывания прошивки, то вы можете снять защиту, но при этом содержимое флеш памяти будет уничтожено. Это делается кнопкой «Remove protection» которая у меня не доступна т.к. защита памяти не включена.

Следующий шаг мастера показывает какие страницы flash памяти защищены от записи/чтения. Нужно не забыть выбрать объем памяти которым обладает программируемый контроллер. Кажется там есть автодетект который сам сделает правильный выбор, но я не уверен. У моего контроллера есть 128 кБайт памяти, что я и выбрал:

Самый интересный шаг мастера. На нем мы можем выбрать то, что хотим сделать с контроллером. Можем очистить память контроллера. Как всю, так и некоторые страницы. Само собой можно прошить контроллер. Программировать и очищать память можно только если это не было запрещено. Есть возможность проверить содержимое памяти после прошивки. Или можно сразу начать выполнение прошитой программы. Чтение памяти возможно опять таки если это не запрещено. Снять или установить защиту от записи/чтения можно в этом же окне. Еще можно редактировать «Option bytes». Что это такое я пока особо не разбирался, поэтому ничего вразумительного сказать не могу.
. Если остались вопросы касаемо загрузчика — спрашивайте, попробую ответить.

Этот клон Ардуино предлагает специальный бутлоадер, который позволяет заливать прошивку через USB, без использования внешних компонентов типа ST-Link или USB-UART переходника.

Сегодня мне понадобилось поработать с голым контроллером из-под CooCox и без stm32duino. Но вот в чем проблема. Даже простая моргалка лампочкой влитая через этот бутлоадер не работает.

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

Я ничего не имею против ST-Link и других отладчиков. Но в моем готовом устройстве его не будет, но точно будет USB. Почему бы сразу не заложить возможность обновлять прошивку через USB? Лично я нахожу этот способ удобным. тем более что все равно у меня уже подключен шнурок по которому идет питание и USB Serial.

Давайте посмотрим как работает бутлоадер. Для начала на примере контроллеров AVR. Почему я о нем вспомнил? Я переходил с Arduino и подсознательно ожидал такого же поведения. Но в STM32 оказалось все по другому. Потому хочу рассказать о разнице этих двух микроконтроллеров.

Итак. В микроконтроллерах AVR ATMega под бутлоадер можно зарезервировать некоторое количество памяти ближе к концу флеша. С помощью fuse битов можно регулировать с какого адреса будет стартовать программа. Если бутлоадера нет - программа стартует с адреса 0x0000. Если бутлоадер есть - он запускается с некоторого другого адреса (скажем, в ATMega32 с 0x3C00, если размер бутлоадера выбран 2к).

Когда бутлоадер сделал свои дела он передает управление основной программе с адреса 0x0000. Т.е. программа всегда стартует с адреса 0x0000. Компилятор и линковщик работают с учетом того, что код будет находится в начале адресного пространства.

В микроконтроллерах STM32 все не так. Все программы стартуют с адреса 0x0800000. Бутлоадер не является чем-то таким особенным. Это такая же программа, которая стартует с того же самого начального адреса. В процессе работы бутлоадер может принять прошивку (через USB или UART, считать с флешки, принять со спутника, достать из подпространства, whatever...) и записать ее по адресам выше чем находится сам загрузчик. Ну и, конечно же, в конце своей работы передать управление основной программе.


Так вот при компиляции прошивки нужно знать куда же бутлоадер запишет прошивку и соответствующим образом скорректировать адреса.

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

Есть, правда, некоторые ограничения по схемотехнике. Тут я, к сожалению, не силен. ЯТП нужен подтягивающий резистор 1.5к для порта PA12 (он же USB D+). Это позволяет загрузчику в нужные моменты времени подключаться и отключаться от USB.

  • Теперь микроконтроллер готов ппрошиваться через USB загрузчик. Но ведь еще нужно саму прошивку подправить. А сделать нужно 2 вещи:
    • Указать линкеру стартовый адрес. В CooCox это делается в настройках проекта, вкладка Link, раздел Memory Areas, Адрес IROM1 Start Address. Бутлоадер занимает первые 8 килобайт, значит стартовый адрес прошивки будет 0x0800000 + 0x2000 = 0x08002000. Поле Size, наверное, тоже стоит уменьшить на 8к.
    • Где нибудь вначале программы перед инициализацией периферии сделать вызов

      NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);

      UPDATE 17.05.2018: В современной версии STM32Cube функции NVIC_SetVectorTable() нет. Вместо этого можно в файле system_stm32f1xx.c (или аналогичного для другого микроконтроллера) исправить дефайн VECT_TAB_OFFSET

  • Заливатор прошивки можно взять из проекта stm32duino . В директории tools ищите скрипт под называнием maple_upload. Я пользовал только виндовую версию - maple_upload.bat.
  • Запускать так:

    "maple_upload.bat" COM20 2 1EAF:0003 "Path\To\Firmware.bin"
    Вместо COM20 нужно подставить свой порт куда прицепился микроконтроллер.

    Заливатор штука очень нежная, относительных путей не любит. так что путь к прошивке нужно указывать полностью.

    1EAF:0003 - это VID и PID

    2 - это параметр AltID, который указывает что прошивку нужно заливать по адресу 0x08002000 (читать ).

  • Еще чуток нюансов. Перед тем как заливать прошивку нужно запустить бутлоадер. Самый простой способ - нажать кнопку ресет. После этого запустится загрузчик и несколько секунд будет ждать прошивку. Если в этот момент никто не запустил maple_upload, загрузчик передаст управление основной прошивке.

    Из-за этого может возникнуть неудобство. Если микроконтроллер заглючил и повис, то он уже не слушает порт. Следовательно он не может услышать ключевую последовательность и перегрузиться в бутлоадер. Тогда только ресет в помощь.

    На этом все. Надеюсь моя статья прольет свет на то, как работает загрузчик в STM32 и как можно загружать прошивку через USB порт. К сожалению порог вхождения по прежнему высок, но вдруг кому-то моя статья поможет его преодолеть.

    Опубліковано 09.08.2016

    Микроконтроллеры STM32 приобретают все большую популярность благодаря своей мощности, достаточно разнородной периферии, и своей гибкости. Мы начнем изучать , используя бюджетную тестовую плату, стоимость которой не превышает 2 $ (у китайцев). Еще нам понадобится ST-Link программатор, стоимость которого около 2.5 $ (у китайцев). Такие суммы расходов доступны и студентам и школьникам, поэтому именно с такого бюджетного варианта я и предлагаю начать.


    Этот микроконтроллер не является самым мощным среди STM32 , но и не самый слабый. Существуют различные платы с STM32 , в томе числе Discovery которые по цене стоят около 20 $. На таких платах почти все то же, что и на нашей плате, плюс программатор. В нашем случае мы будем использовать программатор отдельно.

    Микроконтроллер STM32F103C8. Характеристики

    • Ядро ARM 32-bit Cortex-M3
    • Максимальная частота 72МГц
    • 64Кб Флеш память для программ
    • 20Кб SRAM памяти
    • Питание 2.0 … 3.3В
    • 2 x 12-біт АЦП (0 … 3.6В)
    • DMA контролер
    • 37 входов / выходов толерантных к 5В
    • 4 16-розрядних таймера
    • 2 watchdog таймера
    • I2C – 2 шины
    • USART – 3 шины
    • SPI – 2 шины
    • USB 2.0 full-speed interface
    • RTC – встроенные часы

    На плате STM32F103C8 доступны

    • Выводи портов A0-A12 , B0-B1 , B3-B15 , C13-C15
    • Micro-USB через который можно питать плату. На плате присутствует стабилизатор напряжения на 3.3В. Питание 3.3В или 5В можно подавать на соответствующие выводы на плате.
    • Кнопка Reset
    • Две перемычки BOOT0 и BOOT1 . Будем использовать во время прошивки через UART .
    • Два кварца 8Мгц и 32768 Гц. У микроконтроллера есть множитель частоты, поэтому на кварце 8 МГц мы сможем достичь максимальной частоты контроллера 72Мгц.
    • Два светодиода. PWR – сигнализирует о подачи питания. PC13 – подключен к выходу C13 .
    • Коннектор для программатора ST-Link .

    Итак, начнем с того, что попробуем прошить микроконтроллер. Это можно сделать с помощью через USART, или с помощью программатора ST-Link .

    Скачать тестовый файл для прошивки можно . Программа мигает светодиодом на плате.

    Прошивка STM32 с помощью USB-Uart переходника под Windows

    В системной памяти STM32 есть Bootloader . Bootloader записан на этапе производстве и любой микроконтроллер STM32 можно запрограммировать через интерфейс USART с помощью USART-USB переходника. Такие переходники чаще всего изготавливают на базе популярной микросхем FT232RL . Прежде всего подключим переходник к компьютеру и установим драйвера (если требуется). Скачать драйвера можно с сайта производителя FT232RL – ftdichip.com . Надо качать драйвера VCP (virtual com port). После установки драйверов в компьютере должен появиться виртуальный последовательный порт.


    Подключаем RX и TX выходы к соответствующим выводам USART1 микроконтроллера. RX переходника подключаем к TX микроконтроллера (A9). TX переходника подключаем к RX микроконтроллера (A10). Поскольку USART-USB имеет выходы питания 3.3В подадим питания на плату от него.

    Чтобы перевести микроконтроллер в режим программирования, надо установить выводы BOOT0 и BOOT1 в нужное состояние и перезагрузить его кнопкой Reset или выключить и включить питание микроконтроллера. Для этого у нас есть перемычки. Различные комбинации загоняют микроконтроллер в различные режимы. Нас интересует только один режим. Для этого у микроконтроллера на выводе BOOT0 должно быть логическая единица, а на выводе BOOT1 – логический ноль. На плате это следующее положение перемычек:

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

    Программное обеспечение для прошивки

    Если используем USB-UART переходник, имя порта буде примерно такое /dev/ttyUSB0

    Получить информацию о чипе

    Результат:

    Читаем с чипа в файл dump.bin

    sudo stm32flash -r dump.bin /dev/ttyUSB0

    Пишем в чип

    sudo stm32flash -w dump.bin -v -g 0x0 /dev/ttyUSB0

    Результат:

    Stm32flash 0.4 http://stm32flash.googlecode.com/ Using Parser: Raw BINARY Interface serial_posix: 57600 8E1 Version: 0x22 Option 1: 0x00 Option 2: 0x00 Device ID: 0x0410 (Medium-density) - RAM: 20KiB (512b reserved by bootloader) - Flash: 128KiB (sector size: 4x1024) - Option RAM: 16b - System RAM: 2KiB Write to memory Erasing memory Wrote and verified address 0x08012900 (100.00%) Done. Starting execution at address 0x08000000... done.

    Прошивка STM32 с помощью ST-Link программатора под Windows

    При использовании программатора ST-Link выводы BOOT0 и BOOT1 не используются и должны стоять в стандартном положении для нормальной работы контроллера.

    (Книжка на русском языке)

    Маркировка STM32

    Device family Product type Device subfamily Pin count Flash memory size Package Temperature range
    STM32 =
    ARM-based 32-bit microcontroller
    F = General-purpose
    L = Ultra-low-power
    TS = TouchScreen
    W = wireless system-on-chip
    60 = multitouch resistive
    103 = performance line
    F = 20 pins
    G = 28 pins
    K = 32 pins
    T = 36 pins
    H = 40 pins
    C = 48/49 pins
    R = 64 pins
    O = 90 pins
    V = 100 pins
    Z = 144 pins
    I = 176 pins
    B = 208 pins
    N = 216 pins
    4 = 16 Kbytes of Flash memory
    6 = 32 Kbytes of Flash memory
    8 = 64 Kbytes of Flash memory
    B = 128 Kbytes of Flash memory
    Z = 192 Kbytes of Flash memory
    C = 256 Kbytes of Flash memory
    D = 384 Kbytes of Flash memory
    E = 512 Kbytes of Flash memory
    F = 768 Kbytes of Flash memory
    G = 1024 Kbytes of Flash memory
    I = 2048 Kbytes of Flash memory
    H = UFBGA
    N = TFBGA
    P = TSSOP
    T = LQFP
    U = V/UFQFPN
    Y = WLCSP
    6 = Industrial temperature range, –40…+85 °C.
    7 = Industrial temperature range, -40…+ 105 °C.
    STM32 F 103 C 8 T 6

    Как снять защиту от записи / чтения?

    Если вы получили плату с STM32F103, а программатор ее не видит, это означает, что китайцы защитили Флеш память микроконтроллера. Вопрос “зачем?” оставим без внимания. Чтобы снять блокировку, подключим UART переходник, будем программировать через него. Выставляем перемычки для программирования и поехали:

    Я это буду делать из под Ubuntu с помощью утилиты stm32flash.

    1. Проверяем видно ли микроконтроллер:

    Sudo stm32flash /dev/ttyUSB0

    Должны получить что-то такое:

    Stm32flash 0.4 http://stm32flash.googlecode.com/ Interface serial_posix: 57600 8E1 Version: 0x22 Option 1: 0x00 Option 2: 0x00 Device ID: 0x0410 (Medium-density) - RAM: 20KiB (512b reserved by bootloader) - Flash: 128KiB (sector size: 4x1024) - Option RAM: 16b - System RAM: 2KiB

    2. Снимаем защиту от чтения а затем от записи:

    Sudo stm32flash -k /dev/ttyUSB0 stm32flash 0.4 http://stm32flash.googlecode.com/ Interface serial_posix: 57600 8E1 Version: 0x22 Option 1: 0x00 Option 2: 0x00 Device ID: 0x0410 (Medium-density) - RAM: 20KiB (512b reserved by bootloader) - Flash: 128KiB (sector size: 4x1024) - Option RAM: 16b - System RAM: 2KiB Read-UnProtecting flash Done. sudo stm32flash -u /dev/ttyUSB0 stm32flash 0.4 http://stm32flash.googlecode.com/ Interface serial_posix: 57600 8E1 Version: 0x22 Option 1: 0x00 Option 2: 0x00 Device ID: 0x0410 (Medium-density) - RAM: 20KiB (512b reserved by bootloader) - Flash: 128KiB (sector size: 4x1024) - Option RAM: 16b - System RAM: 2KiB Write-unprotecting flash Done.

    Теперь можно нормально работать с микроконтроллером.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    превращение

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

    Void setup() { pinMode(0, INPUT); pinMode(1, INPUT); } void loop() {}

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

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

    Если плата фирменная

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

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

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

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

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

    картинка

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

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

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

    Если хотите, можете взять с сайта ST (в самом низу страницы).

    Нажмите Reset на плате.

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

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

    WARNING Remove Protection (защита от записи)

    Такое сообщение…

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

    Защита снята.


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

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

    Жмем Next ...

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

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

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

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

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

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

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

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

    ./stm32flash -w /home/dima/myfile.bin -v -g 0x0 /dev/ttyUSB0
    Название и путь к файлу у вас будет свой. HEX-файлы тоже можно прошивать этой утилитой.

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

    Sudo chmod 777 /dev/ttyUSB0

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

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

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

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

    ./stm32flash -u /dev/ttyUSB0 ./stm32flash -k /dev/ttyUSB0

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

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