Чорна магія блакитної таблетки (робимо програматор Black Magic Probe із модуля на базі STM32F103). Чорна магія блакитної таблетки (робимо програматор Black Magic Probe із модуля на базі STM32F103) Програмування stm32 discovery

Для завантаження прошивки в мікроконтролери STM32використовується програматор ST-Link, який можна підключити до програмованого мікроконтролера за інтерфейсом SWD. Крім того, за допомогою того ж ST-Link-аі SWDможна виконувати покрокове налагодження прошивки з середовища розробки за допомогою точок зупинки ( breakpoint). Кількість одночасно встановлених breakpoint-івобмежено кількома штуками (точно не пам'ятаю скільки, на кшталт 5 штук), але цього більш ніж достатньо для налагодження прошивки.

У фірмових налагоджувальних платах від STна борту є і сам цільовий мікроконтролер, і програматор ST-Link, який так само зроблений на мікроконтролері STM32. До речі, дуже зручне рішення. Крім того, програматор, який вбудований в налагоджувальну плату, можна використовувати і для прошивки будь-якого зовнішнього мікроконтролера STM32.Для цих цілей є спеціальний гребінець на платі та перемички, за допомогою яких можна вимкнути інтерфейс SWDвід мікроконтролера, розпаяного на платі У моєму розпорядженні є плата stm32f4discovery, на якій встановлено мікроконтролер STM32F407VGі цю плату я якраз і використовую як програматор ST-Link:

Природно, можна придбати окремий програматор ST-Link. Тут є кілька варіантів. Перший - це фірмовий ST-Link, який буває з гальванічним розв'язкою і без неї. Виглядають ці програматори так:

Інший варіант - китайський ST-Linkу форм-факторі флешки:

Варіант у принципі теж непоганий, тільки треба мати на увазі, що всередині у нього немає жодних захистів інтерфейсу USBі цільової плати, так що при невирівняних землях схеми і ПК, КЗ в схемі, що відладжується, і так далі, є великий шанс спалити програматор разом з USBпортом у комп'ютері. Тож при роботі з цим програматором треба бути дуже уважним!

Підключення програматора ST-Link до мікроконтролера STM32

Інтерфейс SWD, За яким програматор підключається до мікроконтролера має 2 лінії:

  • SWDIO
  • SWCLK

Це є необхідним мінімумом для успішного завантаження прошивки в новий мікроконтролер або налагодження та середовища розробки (з IAR-а, наприклад). У всіх мікроконтролерах STM32висновки програмування поєднані з наступними портами вводу-виводу:

  • SWDIO - PA13
  • SWCLK - PA14

Висновки PA13і PA14можна використовувати як звичайні порти вводу-вывода, проте, у разі втрачається можливість проводити налагодження прошивки із середовища розробки. Крім того, якщо з прошивки, завантаженої в МК, змінити налаштування за замовчуванням пінів PA13і PA14, процес завантаження нової прошивки стає скрутним, доведеться задіяти ще один провід, що з'єднує програматор і МК: лінію RESET. У цьому випадку, перед завантаженням прошивки, ST-Linkвиконає скидання мікроконтролера, тим самим переведе піни PA13і PA14стан за замовчуванням, а вже після цього завантажить в МК нову прошивку. Щоб задіяти функцію скидання мікроконтролера перед завантаженням прошивки в IAR-е в розділі налаштування ST-Link-а необхідно вибрати опцію "Reset Pin".

Опубликовано 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-den bootloader) - Flash: 128KiB (sector size: 4x1024) - Option RAM: 16b - System RAM: 2KiB Завантажити пам'яту 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 familyProduct typeDevice subfamilyPin countFlash memory sizePackageTemperature 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.
STM32F103 C8 T6

Як зняти захист від запису/читання?

Якщо ви отримали плату із 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) 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 1: 0x00 Option 2: 0x00 Device ID: 0 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 1: 0x00 Option 2: 0x00 Device ID: 0 512b reserved by bootloader) - Flash: 128KiB (sector size: 4x1024) - Option RAM: 16b - System RAM: 2KiB Write-unprotecting flash Done.

Тепер можна нормально працювати із мікроконтролером.

Саморобна і доступна альтернатива програматору, що продається від STMicroelectronics. Є витримкою та компіляцією кількох статей та схем знайдених в інтернеті. Реалізація у мінімально можливому форм-факторі.

У будь-якого розробника вбудованого софту має бути програматор для пристроїв, які він використовує. У моєму випадку мікроконтролери фірми STMicroelectronics, а також Milandr (російські процесори на ядрі ARM).

Купівля даного девайса дуже затратна, особливо якщо порівнювати з собівартістю компонентів - друкованої плати та радіодеталей.

Вирішено було зробити програматора самостійно. За основу лягли схеми налагоджувальних плат для різних МК, в результаті вийшов повнофункціональний налагоджувальний модуль і не тільки для stm32, але і для stm8 і навіть міландрівських чіпів (перевірено поки що тільки на К1986ВЕ92, але думаю й інші теж будуть шитись і налагоджуватися).

  • Основні функції:
  • програмування та налагодження STM32;
  • програмування та налагодження STM8;

програмування та налагодження ARM Міландр.

  • Інтерфейси програмування:
  • SWD – до 4 МГц;
  • JTAG;

SWIM.

Сам програматор можна побачити на фото вище. Проводи розтягнуті по платі це лише подальші доробки пов'язані з відсутністю необхідного світлодіода (ліворуч) та з необхідністю програмувати плати без подачі на них живлення (праворуч).

Як роз'єм для підключення до комп'ютера використовується microUSB, вибір упав лише через його сучасність у порівнянні з його міні-братом. У мене ж самого на платі стоїть саме міні, коли збирав закладеного мікро не було.

Після складання та перевірки на коротке замикання підключаємо пристрій до комп'ютера і бачимо, що нічого не відбувається, хіба що програматор визначається як невідомий пристрій, причина у відсутності прошивки.

Для забезпечення роботи необхідно зашити по мікроконтролер, для цього нам знадобиться usb-uart перехідник, бутлоадер і утиліта для прошивки.

Якщо з утилітою і перехідником проблем не виникає, то із завантажувачем все трохи інакше - оскільки сама прошивка в контролерах на налагоджувальних платах заблокована від зчитування і витягнути у мене не вийшло. Благо живемо у сучасному світі, де є інтернет.

Рішення було знайдено на одному із численних форумів – бінарник прошивки. Правда була проблема, після прошивки контролера програматор визначався, але працювати не хотів, зате спокійно прошивався через st-link utility, було вирішено підчистити файл прошивки, вилучивши все зайве, залишивши тільки завантажувач.

Як можна здогадатися, все вдалося і тепер завантажувач можна взяти.

Для заливки використовуємо роз'єм P1, виводи 3 і 4 якого замикаємо разом, переводячи мікроконтролер в режим завантаження ust1. Підключаємо uart перехідники подаємо харчування на плату програматора можна через usb роз'єм.

В утиліті вибираємо послідовний порт, що використовується, і дотримуємося інших інструкцій. Цей процес у картинках описувати нема рації - все досить тривіально.

Мало хто знає, а особливо ті, хто тільки починає вивчати мікроконтролери STM32, що їх можна запрограмувати без спеціального програматора. Необхідно лише вибрати режим завантаження контролера через вбудований завантажувач, підключитися через UART і записати необхідний код.

Тепер про все докладніше. Більшість контролерів STM32 має вбудований (нестирається) завантажувач у спеціальній області пам'яті, який працює за протоколами UART, SPI, I2C та CAN. Звичайно, найпростіше працювати через UART, т.к. він є майже у кожного, хто має стосунки з електронікою, тому його й розглядатимемо.

Вибір області пам'яті, з якої здійснюється завантаження контролера, здійснюється подачею низького або високого рівня на ніжки BOOTx (може бути як одна, так і кілька). Докладніше про те, як вибрати завантажувач на конкретному контролері вказано в AN2606. Також в AN2606 зазначено, який інтерфейс контролера можна використовуватиме програмування. Ще, щоб записати код в контролер, знадобиться маленька програма з сайту ST, яка називається STM32 FlashLoader Demonstrator.

Ну і щоб зрозуміти, як ці знання використовувати запрограмуємо плату з STM32F103C8T6B на борту.

На платі є джампери для встановлення режиму завантаження контролера. На жаль, вони не підписані, тому дивимося на фото вище і встановлюємо їх так само. Установка джамперів BOOT0 в "1" і BOOT1 в "0" активують вбудований завантажувач, як сказано в AN2606. Тепер можна підключити живлення, а також сигнальні лінії RX та TX. Не слід забувати про те, що лінії RX і TX підключаються перехресно:

RX<--->TX

TX<--->RX


Далі запускаємо програму FlashLoader Demonstrator. вибираємо потрібний COM-порт і тиснемо далі. Якщо все підключено правильно, отримуємо повідомлення у тому, що підключений контролер має 64 кБ пам'яті і немає захисту від читання.


Тиснемо далі. Відкривається лист з наявними в контролері сторінками пам'яті, він нас не цікавить, знову тиснемо далі. Відкривається сторінка з можливістю вибору дій над контролером:
  • Erase (стерти)
  • Download to device (завантажити прошивку до МК)
  • Upload from device (вважати прошивку з МК)
  • Enable/Disable Flash protection (увімкнути/вимкнути захист флеш пам'яті)
  • Edit option bytes (редагування захисту пам'яті)

Тиснемо на три точки, вибираємо наш файл "test_stm.hex", ставимо галочку біля "Verify aster download" для перевірки правильності завантаження, а також "Jump to the user program", щоб МК відразу почав виконувати завантажену програму після закінчення процесу завантаження.