1. STM32. Программирование STM32F103. Тестовая плата. Прошивка через последовательный порт и через ST-Link
(на русском языке)
Мікроконтролери STM32 здобувають все більшу популярність завдяки своїй потужності, досить різнорідної периферії, та своєї гнучкості. Ми почнемо вивчати STM32F103C8T6, використовуючи бюджетну тестову плату, вартість якої не перевищує 2$ (у китайців). Ще нам знадобиться ST-Link програматор, вартість якого близько 2.5$ (у китайців). Такі суми витрат доступні і студентам і школярам, тому саме з такого бюджетного варіанту я і пропоную почати.
Цей мікроконтролер не є найпотужнішим серед STM32, але і не самий слабкий. Такий собі середнячок. Існують різні тестові плати, у томі числі Discovery які за ціною коштують близько 20$. На таких платах є майже те саме, що і на нашій платі, плюс програматор. В нашому випадку ми будемо використовувати програматор окремо.
Отже почнемо з того, що спробуємо прошити мікроконтролер. Це можна зробити за допомогою USB-Uart перехідника на базі мікросхеми FT232 через USART, або за допомогою програматора ST-Link.
Скачати тестовий файл для прошивки можна тут. Програма блимає світлодіодом на платі.
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 або відключення і підключення живлення, мікроконтролер має перейти у режим програмування.
Качаємо з сайту st.com програму Flash Loader Demonstrator для STM32. Flash Loader Demonstrator – програма для прошивки STM32 через послідовний інтерфейс.
Після включення схеми з правильно виставленими перемичками контролер готовий до роботи з Flash Loader Demonstrator.
Запускаємо Flash Loader Demonstrator и обираємо порт з яким будемо працювати, та встановлюємо параметри порта.
Після вибору параметрів порта натискаємо Next і маємо побачити «світлофор» і інформацію що до об’єму пам’яті. Якщо цього не відбувається тоді дивимось чи коректно обрані параметри зв’язку та чи мікроконтролер дійсно введений у режим програмування.
Тиснемо Next,
На цій сторінці обираємо файл для завантаження у мікроконтролер. Файл може бути у форматі bin або hex.
Тиснемо Next і чекаємо.
Щоб вивести контролер з режиму програмування, повертаємо перемички у початковий стан і натискаємо кнопку Reset. Програма у мікроконтролері має запрацювати.
Скачати DEB файл можна тут: http://launchpadlibrarian.net/188294676/stm32flash_0.4-2_i386.deb
Докладніше про stm32flash читаємо тут: https://launchpad.net/ubuntu/wily/i386/stm32flash/0.4-2
Якщо використовуємо USB-UART перехідник буде порт на кшталт цього /dev/ttyUSB0
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
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.
При використанні програматора ST-Link піни BOOT0 и BOOT1 не використовуються і мають стояти у стандартному положенні для звичайної роботи контролера.
Качаємо з сайту st.com Утиліту STM32 ST-LINK Utility. Встановлюємо її. З нею має бути встановлений і драйвер для ST-Link. Якщо ні, качаємо і встановлюємо драйвери ST-Link: http://www.st.com/content/st_com/en/products/embedded-software/development-tool-software/stsw-link009.html Підключаємо ST-Link у USB- коннектор, а відповідні виводи програматора підключаємо до виводів тестової плати згідно маркування.
Запускаємо програму STM32 ST-LINK Utility
Виконуємо пункт меню Target -> Connect
Виконуємо пункт меню Target -> Erase Chip
Виконуємо пункт меню File -> Open file…
Обираємо файл для завантаження у мікроконтролер.
Виконуємо пункт меню Target -> Programm & Verify…
Після завершення прошивки і перевірки завантажена програма мікроконтролера автоматично запуститься.
mkdir ~/stlink cd ~/stlink sudo apt-get install git libusb-dev
Довелося ще ставити autoconf та libusb-1.0:
sudo apt-get install autoconf sudo apt-get install libusb-1.0
git clone git://github.com/texane/stlink.git cd stlink ./autogen.sh ./configure make sudo mkdir /opt/texane sudo cp gdbserver/st-util /opt/texane sudo cp ./etc/udev/rules.d/49-stlinkv1.rules /etc/udev/rules.d sudo cp ./etc/udev/rules.d/49-stlinkv2.rules /etc/udev/rules.d sudo udevadm control --reload-rules
sudo ./st-info --probe
Результат:
Found 1 stlink programmers serial: openocd: "" flash: 65536 (pagesize: 1024) sram: 20480 chipid: 0x0410 descr: F1 Medium-density device
sudo ./st-flash read dump.bin 0x8000000
sudo ./st-flash --reset write dump.bin 0x8000000
Для того щоб не копирсатися у документації кожного разу щодо виводів мікроконтролера на платі я зробив таку пам’ятку, яка нам знадобиться у подальшому.
Всю потрібну документацію до мікроконтролера STM32F103C8T6 можна скачати з сайту виробника:
http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f1-series/stm32f103/stm32f103c8.html
The Iinsider’s Guide To The 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 |
UPD:
Якщо ви отримали плату с 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.
Тепер можна нормально працювати з мікроконтролером.
Бажаю успіхів!
Дивись також:
www.avislab.com
Option bytes настраиваются разработчиком прошивки в зависимости от потребностей. Это несколько байт, в разных контроллеров их количество разное, с помощью которых можно установить некоторые настройки и защитить Flash от записи и чтения. Защитив нужные страницы Flash от записи, можно избежать ошибочного повреждения программы во время работы. Установка защиты от считывания делает невозможным считывание и копирование прошивки
Подробно о том, как организованы Option bytes, можно прочитать в Programming manual en.CD00233952.pdf
Option bytes доступные для нашего контроллера STM32F103:
Для настройки Option bytes с помощью ST-LINK Utility надо выполнить Target -> Connect, после чего зайти в Target -> Option bytes … и установить нужные Option bytes. Обращаю Ваше внимание, после установки Read Out Protection, считывание из памяти контроллера и отладка по SWD станут невозможны. Для продолжения работы с контроллером, SWD позволяет снять READ OUT PROTECTION.
Для настройки Option bytes с помощью Flash Loader Demonstartor надо выбрать пункт “Edit option bytes” и в следующем окне установить нужные Option bytes.
Установить Read protection:
sudo stm32flash -j /dev/ttyUSB0Снять защиту от чтения:
sudo stm32flash -k /dev/ttyUSB0Снять защиту от записи:
sudo stm32flash -u /dev/ttyUSB0Желаю успехов!
Смотри также:
www.avislab.com
Через переходник USB-UART подключите микроконтроллер в выходам A9 и A10, которые соответствуют выходам USART1_TX
и USART1_RX
соответственно.
RX выхода переходника стоит подключать к TX, то есть к A9.
TX выхода переходника стоит подключать к RX, то есть к A10.
После этого микроконтроллер надо перевести в режим прошивки. На многих платах для этого есть специальная перемычка. Например, для платы с МК STM32F103C8T6 из предыдущей заметки, — это будет дальняя от кнопки перезагрузки перемычка в положении 1:
Если перемычки нет, то необходимо замкнуть ногу BOOT0 на 3.3 вольта. Для безопасности лучше использовать резистор номиналом 50–200 Ом, но возможно замкнуть контакт и напрямую.
Осталось перезагрузить контроллер, чтобы он перешел в режим прошивки через UART.
Скачайте и установите приложение FLASHER-STM32:
http://www.st.com/en/development-tools/flasher-stm32.html
Работа с приложением достаточно очевидна. Значок светофора, показывает зеленый, при успешном подключении к контроллеру. А также становится доступен диалог выбора файла прошивки с различными опциями загрузки. Полезны опции очистки памяти и проверки записанных данных.
В последних версиях GNU/Linux приложение stm32flash доступно из стандартных источников приложений. В Ubuntu для установки приложения выполните команду:
sudo apt-get install stm32flash
Если так установить не удается, то установите приложение stm32flash с сайта: https://sourceforge.net/projects/stm32flash
Команда:
sudo stm32flash /dev/ttyUSB0
даст вывод:
stm32flash 0.5 http://stm32flash.sourceforge.net/ Interface serial_posix: 57600 8E1 Version : 0x22 Option 1 : 0x00 Option 2 : 0x00 Device ID : 0x0410 (STM32F10xxx Medium-density) - RAM : 20KiB (512b reserved by bootloader) - Flash : 128KiB (size first sector: 4x1024) - Option RAM : 16b - System RAM : 2KiB
Значит микроконтроллер успешно подключен и готов к прошивке.
Чтобы прошить программу в микроконтроллер используйте команду:
sudo stm32flash -w Program.hex -v -g 0x0 /dev/ttyUSB0
Удобно добавить пользователя в группу dialout, чтобы не приходилось вводить sudo перед командой прошивки.
sudo usermod -a -G dialout $USER
Автор заметки: И.А. Денисов
ob/o7/stm32flash.txt · Последние изменения: 2018/11/30 12:34 — иван_денисов
obertone.ru
В своем проекте я использую микроконтроллер STM32F103C8 и фреймворк stm32duino. Этот клон Ардуино предлагает специальный бутлоадер, который позволяет заливать прошивку через 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.
Инструкция:
"maple_upload.bat" COM20 2 1EAF:0003 "PathToFirmware.bin"
Вместо COM20 нужно подставить свой порт куда прицепился микроконтроллер.
Заливатор штука очень нежная, относительных путей не любит. так что путь к прошивке нужно указывать полностью.
1EAF:0003 — это VID и PID
2 — это параметр AltID, который указывает что прошивку нужно заливать по адресу 0x08002000 (читать тут)
Еще чуток нюансов. Перед тем как заливать прошивку нужно запустить бутлоадер. Самый простой способ — нажать кнопку ресет. После этого запустится загрузчик и несколько секунд будет ждать прошивку. Если в этот момент никто не запустил maple_upload, загрузчик передаст управление основной прошивке.
Чтобы не нажимать каждый раз ресет, платы основанные на libmaple/stm32duino используют трюк. Они слушают usb serial порт. Если там возникает сигнал DTR и передается ключевая последовательность байт, то микроконтроллер перегружается в бутлоадер. Смотреть в функцию rxHook()
Из-за этого может возникнуть неудобство. Если микроконтроллер заглючил и повис, то он уже не слушает порт. Следовательно он не может услышать ключевую последовательность и перегрузиться в бутлоадер. Тогда только ресет в помощь.
На этом все. Надеюсь моя статья прольет свет на то, как работает загрузчик в STM32 и как можно загружать прошивку через USB порт. К сожалению порог вхождения по прежнему высок, но вдруг кому-то моя статья поможет его преодолеть.
Автор: grafalex
Источник
www.pvsm.ru