Інтернет Windows Android

Прошивка stm32 через UART. STM32 - це дуже просто Stm32 де взяти готові прошивки

Найпростіший і найдоступніший спосіб прошивки STM32- за допомогою бутлоудера, у цій статті ми розглянемо як це зробити на прикладі плати miniSTM32F103V.

Для початку давайте розберемося, що таке бутлоадерабо як його ще називають завантажувач. Завантажувач- це просто програма, яка зберігається у певній секції пам'яті та може перезаписувати флеш мікроконтролера. Вона зашивається при виробництві чіпа і її не можна змінити будь-яким чином. Щоб мікроконтролер зайшов у цю секцію пам'яті, треба висновок BOOT0підтягнути до харчування, а висновок BOOT1до землі. На платі ці два висновки знаходяться біля usb роз'єму, а підтяжка здійснюється за допомогою перемичок.
Нижче наведена таблиця, яка визначає з якої області пам'яті запуститься мікроконтролер після скидання, залежно від BOOT0і BOOT1.


Припустимо, ми встановили перемички, тепер треба передати завантажувачу hex-файл з прошивкою, передаватимемо по uart, для цього нам знадобиться перетворювач usb-uart.


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

Підключаємо перехідник usb-uartдо комп'ютера і залежно від того, на якій мікросхемі він зроблений CP2120або FT232, встановлюємо відповідні драйвери Після цього він має визначитися у системі як COM_PORT.


Тепер підключимо наш перехідник до плати, висновок RX перехідника з'єднуємо з виводом MCU_TхD, а висновок ТХ із висновком MCU_RхD. Топологія плати, яку вислав продавець, трохи відрізняється від тієї, що на верхній картинці, висновки для прошивки виведені окремо та відмічені червоними стрілочками.


Далі треба завантажити програму, за допомогою якої зв'язуватимемося із завантажувачем, називається вона FLASH LOADER DEMONSTRATOR .


Після встановлення програми вибираємо com port, під яким визначився наш перехідник usb-uartта натискаємо кнопку NEXT, швидкість визначиться автоматично. Якщо контролер захищений від зчитування, захист можна зняти, натиснувши кнопку "Remove Protection" при цьому флеш пам'ять буде стерта і відповідно всі дані, які в ній записані втрачені.


Якщо контролер не захищений, з'явиться вікно зображене нижче, в ньому натискаємо кнопку NEXT.


У наступному вікні потрібно вибрати, що ми хочемо зробити: рахувати/записати флеш мікроконтролера, стерти його, заборонити читання запис, нас цікавить запис, для цього вибираємо файл, який хочемо завантажити і натискаємо NEXT.

Ну, ось ми й дійшли до одного з найцікавіших етапів — як же залити в контролер готову прошивку і нарешті оживити нашу залізяку.

Взагалі-то прошивати контролери STM32 можна по-різному, але ми розглянемо найпростіший варіант прошивки через послідовний інтерфейс за допомогою фірмової утиліти Flash Loader Demonstrator. Ця утиліта абсолютно безкоштовна і її можна завантажити як з офіційного, так і.

Як ми раніше вже говорили, - у системній області пам'яті контролера зашитий bootloader. Саме він дозволяє записати прошивку у flash-пам'ять через послідовний інтерфейс.

Детально bootloader описаний у документі AN2606 (CD00167594.pdf), а протокол, що використовується, — у документі AN3155 (CD00264342.pdf). Це для тих, хто хоче вичерпної інформації, а ми розглянемо процес прошивки через bootloader коротко.

Для початку вам потрібно завантажити та встановити собі на комп'ютер утиліту Flash Loader Demonstrator.

Отже, ногу Tx контролера потрібно з'єднати з ногою Rx перетворювача, а ногу Rx контролера - з ногою Tx перетворювача. Крім цього, контролер потрібно запитати та забезпечити потрібні рівні на ногах BOOT0 (pin 44), BOOT1 (pin 20). Для запуску bootloadera, розташованого в system memory, ногу BOOT1 потрібно підтягнути до «землі», а BOOT0 — до «живлення» (табличка праворуч).

Підтяжку для BOOT0, BOOT1 краще робити не тверду, а джамперами, щоб можна було легко вибирати режими завантаження (наприклад, переключившись після заливання проги в режим завантаження з flash, можна буде цю прогу одразу потестити).

Схема підключення показана нижче.

Парність і кількість біт даних вже налаштовані як треба, швидкість можна змінювати - контролер у процесі ініціалізації обміну налаштовується на обрану швидкість автоматично, com-порт потрібно вибрати той, який створився при підключенні USB-to-COM перетворювача до комп'ютера (наш перетворювач створює при підключенні віртуальний com-порт, що повністю імітує справжній апаратний). Після того, як все налаштували, тиснемо «Next».

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

При встановленні зв'язку програма автоматично визначить скільки у контролера flash-пам'яті і чи ця пам'ять захищена від читання. Натиснувши кнопку «Remove protection» захист можна зняти, але при цьому вміст флешу буде стертим (попередня записана туди прошивка знищиться). Тиснемо «Next».

У наступному вікні нам пропонують вибрати тип програмованого каменю (хоча незрозуміло навіщо, він і так автоматично визначається), а також показують для нашого каменю PID, карту flash-пам'яті, і версію bootloader-а. Просто тиснемо "Next".

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

На наступній сторінці внизу з'явиться прогрес-бар, де буде показано хід виконання процедури завантаження. Після того, як вся прошивка буде завантажена в контролер, цей прогрес-бар стане зеленим і в ньому білими літерами буде написано: "Download operation finished successfully" (операція завантаження успішно завершена). Після цього можна натиснути кнопку «Close» і закрити Flash Loader Demonstrator

Все, щоб залита програма почала виконуватися нам залишиться тільки налаштувати контролер на завантаження з flash (BOOT0 = 0, BOOT1 - будь-який рівень) і перезавантажити його.

Цей клон Ардуїно пропонує спеціальний бутлоадер, який дозволяє заливати прошивку через 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.

Інструкція:

  • Качаємо github.com/rogerclarkmelbourne/STM32duino-bootloader. У директорії STM32F1binaries вже є пакет скомпілованих бутлоадер під різні плати. Індекс наприкінці назви файлу вказує куди підключений світлодіод. Якщо світлодіод підключений до піна C13, я використовував файл generic_boot20_pc13.bin.
  • Прошиваємо. Так, тут знадобиться USB-UART перехідник, але, напевно, можна і за допомогою відладчика.
  • Тепер мікроконтролер готовий прохатись через USB завантажувач. Але ще потрібно саму прошивку підправити. А зробити потрібно 2 речі:
    • Вказати лінкеру стартову адресу. У CooCox це робиться в налаштуваннях проекту, вкладка Link, розділ Memory Areas, Адреса IROM1 Start Address. Бутлоадер займає перші 8 кілобайт, отже стартова адреса прошивки буде 0x0800000 + 0x2000 = 0x08002000. Поле Size, напевно, також варто зменшити на 8к
    • Десь спочатку програми перед ініціалізацією периферії зробити виклик NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);
  • Заливатор прошивки можна. У директорії інструментів шукайте скрипт під назвою maple_upload. Я користувався тільки винною версією - maple_upload.bat
  • Запускати так:
    "maple_upload.bat" COM20 2 1EAF:0003 "PathToFirmware.bin"

    Замість COM20 потрібно підставити свій порт, куди причепився мікроконтролер.

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

    1EAF:0003 - це VID та PID

    2 - це параметр AltID, який вказує, що прошивку потрібно заливати за адресою 0x08002000 (читати )

Ще трохи аспектів. Перед тим, як заливати прошивку, потрібно запустити бутлоадер. Найпростіший спосіб – натиснути кнопку ресет. Після цього запуститься завантажувач і кілька секунд чекатиме на прошивку. Якщо в цей момент ніхто не запустив maple_upload, завантажувач передасть керування основною прошивкою.

Через це може виникнути незручність. Якщо мікроконтролер заглючив і повис, він не слухає порт. Отже, він не може почути ключову послідовність і перевантажитися в бутлоадер. Тоді тільки ресе на допомогу.

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

Допустимо ви випустили на ринок свій пристрій і побоюєтеся того, що хтось почне його копіювати. TargetConnect).

Звичайно можна просто відірвати ніжки мікроконтролера ... але розробники ST Microelectronics пропонують краще альтернативу. Усі МК мають систему захисту (read out protection). Суть її дуже проста - якщо у спеціальному регістрі (Option bytes) встановлено певне значення- то можливість налагодження та зчитування прошивки вимикається. У такому режимі у вас також зникне можливість перепрошивки МК. Зрозуміло, цей захист можна відключити, змінивши значення в регістрі Option bytes, однак у такому випадку пам'ять програми буде затерта, а значить її ніхто не зможе скопіювати.

Поміняти значення в регістрі можна за допомогою тієї ж ST-Link Utility, TargetOption Bytes…Read out protectionENABLE.


Вимкнути, відповідно, можна аналогічним способом. Це не зовсім зручно, якщо багато пристроїв. Можна увімкнути захист програмно.

Для реалізації захисту зручно скористатися стандартною бібліотекоюпериферії, саме stm32f10x_flash.c містить необхідну нам функцію. Сам регістр, а також роботу з флеш-пам'яттю описано в документі . Однак перед цим згадаємо як реалізований захист багаторазового включення заголовних файлів. Ми використовували такі директиви препроцесора як:

  • #define - директива вказує препроцесору замінювати рядок у файлі, проте якщо аргумент (що стоїть наприкінці) не вказується сам ідентифікатор (що по середині) залишиться в системі і може бути перевірений іншими директивами (тобто можна написати умову, за умови якому певний код виконуватиметься або навпаки);
  • #ifndef - директиву можна прочитати як «якщо не виразно», проте нам більше підійде інша #ifdef - «якщо точно»;
  • #endif - директива, що вказує кінець умови.

Створимо ідентифікатор, який буде говорити, що це складання фінальне. Бувай цей рядокзакоментована - код поміщений між #ifdef і #endif не виконуватиметься.

//#define RELEASE

При кінцевому складанні досить просто розкоментувати рядок і прошити пристрій.

#ifdef RELEASE // code here #endif

А тепер до самої суті. Ми вже розбиралися як працювати з внутрішньою флеш-пам'яттю мікроконтролера. Перед записом бітів захисту необхідно розблокувати доступ до пам'яті, потім необхідно здійснити потрібні операції та знову заблокувати доступ. Виходить таке:

#ifdef RELEASE #warning "Protection is ON. Debug is OFF" if (FLASH_GetReadOutProtectionStatus() == RESET) ( FLASH_Unlock(); FLASH_ReadOutProtection(ENABLE); FLASH_Lock(); ) #endif

Деякі з мікроконтролерів 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 має наступне розпинання: