1. STM32. Програмування STM32F103. Тестова плата. Прошивка через послідовний порт та через ST-Link програматор


08.08.2016

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

STM32F103C8_01 STLine_01

Цей мікроконтролер не є найпотужнішим серед 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 шини
  • CAN
  • USB 2.0 full-speed interface
  • RTC - вбудований годинник

На платі STM32F103C8 доступні

STM32F103C8_02

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

Отже почнемо з того, що спробуємо прошити мікроконтролер. Це можна зробити за допомогою USB-Uart перехідника на базі мікросхеми FT232 через USART, або за допомогою програматора ST-Link.

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

Прошивка STM32 за допомогою USB-Uart перехідника під Windows

STM32 мають у системній пам`яті Bootloader. Bootloader записаний на виробництві і будь-який мікроконтролер STM32 можна запрограмувати через інтерфейс USART за допомогою USART-USB перехідника. Такі перехідники частіше за все виготовляють на базі популярної мікросхем FT232RL. Перш за все підключимо перехідник до комп’ютера і встановимо драйвери (якщо потрібно). Скачати драйвери можна з сайту виробника FT232RL - ftdichip.com. Треба качати драйвера VCP (virtual com port). Після встановлення драйверів у комп’ютері має з`явитися віртуальний послідовний порт.

Port_01 Port_02

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

STM32F103C8_UART_PROG_02

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

STM32F103C8_UART_PROG_01

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

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

Качаємо з сайту st.com програму Flash Loader Demonstrator для STM32. Flash Loader Demonstrator - програма для прошивки STM32 через послідовний інтерфейс.

Після включення схеми з правильно виставленими перемичками контролер готовий до роботи з Flash Loader Demonstrator.

Запускаємо Flash Loader Demonstrator и обираємо порт з яким будемо працювати, та встановлюємо параметри порта.

FlashLoaderDemonstrator_01

Після вибору параметрів порта натискаємо Next і маємо побачити «світлофор» і інформацію що до об`єму пам`яті. Якщо цього не відбувається тоді дивимось чи коректно обрані параметри зв`язку та чи мікроконтролер дійсно введений у режим програмування.

FlashLoaderDemonstrator_02

Тиснемо Next,

FlashLoaderDemonstrator_03

На цій сторінці обираємо файл для завантаження у мікроконтролер. Файл може бути у форматі bin або hex.

FlashLoaderDemonstrator_04

Тиснемо Next і чекаємо.

FlashLoaderDemonstrator_05 FlashLoaderDemonstrator_06

Щоб вивести контролер з режиму програмування, повертаємо перемички у початковий стан і натискаємо кнопку Reset. Програма у мікроконтролері має запрацювати.

Прошивка STM32 за допомогою USB-Uart перехідника під Linux (Ubuntu)

Встановлюємо stm32flash

Скачати 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

Читаємо з чипа у файл 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 не використовуються і мають стояти у стандартному положенні для звичайної роботи контролера.

STLine_02

Качаємо з сайту 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

STM32ST-LINKUtility_01

Виконуємо пункт меню Target -> Connect

STM32ST-LINKUtility_02

Виконуємо пункт меню Target -> Erase Chip

STM32ST-LINKUtility_03

Виконуємо пункт меню File -> Open file...

Обираємо файл для завантаження у мікроконтролер.

STM32ST-LINKUtility_04

Виконуємо пункт меню  Target -> Programm & Verify...

STM32ST-LINKUtility_05

Після завершення прошивки і перевірки завантажена програма мікроконтролера автоматично запуститься.

STM32ST-LINKUtility_06

Прошивка STM32 за допомогою ST-Link програматора під Linux (Ubuntu)

Встановлюємо софт для роботи з ST-Link


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

Читаємо з чипа у файл dump.bin


sudo ./st-flash read dump.bin 0x8000000

Програмуємо STM32


sudo ./st-flash --reset write dump.bin 0x8000000

Пам`ятка

Для того щоб не копирсатися у документації кожного разу щодо виводів мікроконтролера на платі я зробив таку пам`ятку, яка нам знадобиться у подальшому.

STM32F103C8

Документація

Всю потрібну документацію до мікроконтролера 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 (Книжка російскою мовою)

Маркування 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.

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

Бажаю успіхів!

Дивись також:

STM32 Корисно знати
Коментарі:
Тарас говорить:
20.08.2016 02:21
Чудово! Дякую за статтю! 
Я якраз приглянув на Aliexpress цю плату і хотів почати з неї знайомитися з STM32, а тут якраз Ваші статті з такими гарними поясненнями.)
Окрема подяка за якісний український контент на тематику електроніки, якого, на жаль, дуже мало.
Велику справу робите.

LynXzp говорить:
06.09.2016 18:49
Класний сайт! Те що треба. Правда плату я зробив свою, вирішив зразу з головою піти, думаю проблем не буде.

Антон говорить:
12.11.2016 13:44
Також дуже вдячний за чудовий матеріал, все по поличкам!!
Так як я стартую в цій темі з нуля, для мене наведені приклади программ і особливо пояснення до них дуже цінні. Хотілось би ще дуже розглянути приклади роботи з CAN та FIFO, в інтернеті практично немає обширного опису як це правильно працює..
Дякую!!

Александр говорить:
14.12.2016 16:51
Привет. Хочу обновить осциллогнаф DSO138 на 60-тую прошивку с помощью программатора ST-LINK v2. На нем процессор STM32F103 48 ножек. Хочу считать утилитой STM32 ST-LINK Utility v4. Мне постоянно выводится сообщение "Can not read memory! Disable read out protection and retry."

andre говорить:
14.12.2016 16:59
Добрый день. Прошивка защищена от считывания. В этом случае ее можно только стереть и записать новую. Подробнее о защите и как ее снять я писал здесь http://www.avislab.com/blog/stm32-ob_ru/

Александр говорить:
14.12.2016 17:05
у меня сразу после команды Target -> Connect вылазит ошибка описана выше. Мне нужно закрыть ошибку и нажать Target -> Erase chip?

andre говорить:
15.12.2016 10:11
Вы можете попробовать сделать Target -> Erase chip, но если Connect не состоялся, то ничего не получиться. Попробуйте Target -> Options bytes... и там снять защиту. Так рекомендуют, но с помощью ST-LINK у меня никак не получалось снят защиту. Программатор просто не видел контроллер. У меня получалось снять защиту от чтения только через UART переходник с помощью Flash Loader Demonstartor.

Владимир говорить:
29.12.2016 16:14
Отличный цикл статей по STM32. СПАСИБО!!!
Хотелось бы еще про Opamp и компаратор если можно.

Віктор говорить:
27.01.2017 21:27
Дуже велика допомога. Молодцi. Дякую!!!

Макс говорить:
21.02.2017 09:22
Дуже дякую за статті та ща й рідною мовою) Чудово!

Володимир говорить:
08.03.2017 23:35
Чи можна прошивати STM32 за допомоги ST-LINK/V2 прямо із IAR Workbench не використовуючи STM32 ST-LINK Utility окремо. Коли я спробував то тримав декілька помилок після чого процедура прошивання зависла. Пошук в інтернеті нашвидкоруч не допоміг. Чи є можливість виправити помилки?

andre говорить:
09.03.2017 16:23
Ваше питання поставило мене у глухий кут. Щоб Вам щось відповісти я маю знати хоча б що то були за помилки та на якій операційній системі?

Єгор говорить:
09.03.2017 21:16
На випадок, якщо хтось використовує програматор на CH430G під windows 10, то драйвер можна взяти тут 
http://www.wch.cn/download/CH341SER_EXE.html

Я використовував програматор http://www.ebay.com/itm/3PCS-USB-To-RS232-TTL-CH340G-Converter-Module-Adapter-STC-replace-Pl2303-CP2102-/221994002559?hash=item33afdfa87f:g:O6cAAOSwYIhWlmrB

Володимир говорить:
23.03.2017 21:32
Дійсно, написав трохи поспіхом і можливо це було б краще помістити в статтю “IAR Workbench – IDE для STM32” але ж).
Я використовую Win10 64bit та IAR Embedded Workbench for ARM v7.50.2.10505
Я виконав зразки завдань по Вашим статтям налаштування “IAR Workbench – IDE для STM32” де було показано як налаштувати вказану IDE під широко розповсюджену плату яка містить STM32C8T6 MCU  і вдало відкомпілював та «залив» на «залізо» программу по миганню світлодіодом. Також я без проблем виконав приклади №5 по програмуванню USART та першу частину прикладу №7 по програмуванню ADC.

Володимир говорить:
23.03.2017 21:33
Однак при роботі у мене виникло питання (а потім і бажання) чи не можливо компілювати та заливати відкомпільовану прошивку відразу у MCU без використання утіліти ST-LINK так як інтерфейс IAR Workbench містить відповідні можливості. Крім того таким чином ми не тільки можемо відразу виконати завантаження відкомпільованої а і запустити її в Debug режимі. Тобто ми натискаемо кнопку «Download and Debug» на панелі і переходимо в режим відладки або вибираємо через меню наприклад «Project->Download->Download active application» (після цього потрібно або відключити-включити живлення плати або натиснути кнопку апаратного Reset).
Відразу «з коробки» ця опція не працювала. Виявилося що для її налаштування потрібно зробити зовсім не багато. Необхідно зайти в налаштування проекту (Options) та вибрати вкладку «Download». На цій вкладці необхідно активувати два чекбокси: «Use flash loader(s)» та «Override default .board file». Після цього необхідно вибрати наступний .board файл: «$TOOLKIT_DIR$\\config\\flashloader\\ST\\FlashSTM32F10xx8.board». 
Після цього прошивка та відладка через інтерфейс IAR Workbench на девелопер-платі STM32C8T6 повинна запрацювати.

andre говорить:
24.03.2017 08:14
Дякую за дуже корисний і змістовний коментар.

Віталій говорить:
23.04.2017 18:53
Прошиваю з допомогою ST-Link V2. Якщо перемички у вихідному положенні, то не прошивається. Загуглив інформацію що потрібно натискати кнопку прошивки з одночасним короткостроковим натисканням кнопки Reset на платі, або переставляти перемички як у прикладі з UART при прошивці та поверненні перемичок при робочому режимі. Дебагер з такими качелями не працює. Протестував декілька плат від різних виробників.
Чи є варіанти усунути "поребрика"?

andre говорить:
24.04.2017 08:39
Коли прошиваю ST-Link-ом перемички не чіпаю. І дебагер працює. Може проблема з програматором?

alexey_laa говорить:
08.06.2017 21:55
Доброго дня.

Я зараз починаю вивчати мікроконтролери STM32. Поки що нічого ще не програмував, розбираюсь з середовищем розробки, з платами, з адаптерами. Купив плати з контролерами і ще дещо на Ali Express. У мена є питання про адаптер на FT232RL. Адаптер виявився неоригінальним, він не працює у Win з новим драйвером, і працює зі старим драйвером v. 2.08.14. Я іще пробував цей адаптер із Ubuntu та Android. На Android (через USB OTG) працює стабільно. На Ubuntu наче працює, але на вихід TX періодично проходять якісь незрозумілі дані (спалахує світлодіод, через підключений джампер на RX проходять якісь байти "...FDDDFDDFDDFDFDDDFDD...", на іншій програмі терміналу обривається зв`язок із портом). Чи не знаєте, може на Ubuntu драйвер також не хоче працювати з неоригінальним чипом? Я на одному форумі знайшов:
«
Linux has a fix for the "broken" devices:
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/usb/serial/ftdi_sio_ids.h#n33
»
але тут наче мова йде про чипи FTDI, які "залочив" драйвер. Чи це просто чип "глючить" під Ubuntu?

alexey_laa говорить:
12.06.2017 07:35
Виявилося, що на моїй системі Ubuntu був якийсь додаток чи процес, який щось посилав через COM-порти. На /dev/ttyS0 також були якісь "F", "D", як і на /dev/ttyUSB0. Через це, та іще через деякі проблеми у системі перевстановив свою Ubuntu. Тепер усе працює.

viki говорить:
22.03.2021 06:25
У Вас заданий початок флеша 0x8000000.

> Читаємо з чипа у файл dump.bin
sudo ./st-flash read dump.bin 0x8000000


А кінцевий адрес який? 0x0801 FFFF? 	

Чи всетаки читається вся память аж до 0x1FFF FFFF. В такому разі можна задати діапазон памяті і його так само зчитати? 

Володимир говорить:
16.08.2021 17:17
Дякую! Завдяки Вашій статі розібрався  як перепрошити осцилограф DSO150.

Додати коментар
Code
* - обов'язкові поля

Архіви