У своєму проекті я використовую мікроконтролер 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к).
У мікроконтролерах STM32 все негаразд. Усі програми стартують із адреси 0x0800000. Бутлоадер не є таким особливим. Це така ж програма, яка стартує з тієї ж початкової адреси. В процесі роботи бутлоадер може прийняти прошивку (через USB або UART, рахувати з флешки, прийняти з супутника, дістати з підпростору, whatever ...) і записати її за адресами вище, ніж знаходиться сам завантажувач. Ну і, звичайно ж, наприкінці своєї роботи передати керування основною програмою.
На цьому із теорією все. Переходимо до практики. Нижче покрокова інструкція як прикрутити завантажувач USB до мікроконтролерів серії STM32F1xx, а може бути і до деяких інших теж.
Є, щоправда, деякі обмеження щодо схемотехніки. Тут я, на жаль, не сильний. ЯТП потрібен підтягуючий резистор 1.5к для порту PA12 (він USB D+). Це дозволяє завантажувачу в потрібні моменти часу підключатися та відключатися від USB.
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);
"maple_upload.bat" COM20 2 1EAF:0003 "Path\To\Firmware.bin"
Замість COM20 потрібно підставити свій порт, куди причепився мікроконтролер.
Заливатор штука дуже ніжна, відносних шляхів не любить. так що шлях до прошивки потрібно вказувати повністю.
1EAF:0003 - це VID та PID
2 - це параметр AltID, який вказує, що прошивку потрібно заливати за адресою 0x08002000 (читати ).
Через це може виникнути незручність. Якщо мікроконтролер заглючив і повис, він не слухає порт. Отже, він не може почути ключову послідовність і перевантажитися в бутлоадер. Тоді тільки ресе на допомогу.
На цьому все. Сподіваюся, моя стаття проллє світло на те, як працює завантажувач у STM32 і як можна завантажувати прошивку через USB порт. На жаль поріг входження, як і раніше, високий, але раптом комусь моя стаття допоможе його подолати.
Відповіді на питання, що часто ставляться:
Більшість фахівців розробні пристрої на мікроконтролерах вже знайомі з темою захисту програм мікроконтролерів, тому можна вважати, що цей розділ їм ні про що не розповість. Однак є величезна армія інженерів і простих споживачів електронних пристроїв не знайомих з детальною організацією такого захисту, але бажаючих або розібратися в деталях роботи наявного пристрою, або створити подібний пристрій, для них і призначена ця збірка відповідей на питання.
Багато виробників електронних пристроїв намагаються захистити пристрій від можливості простого копіювання його іншим виробником. Їм назустріч пішли виробники мікроконтролерів, ввівши у функціонал своїх виробів захист від копіювання програми (мікропрограми), що міститься в пам'яті мікроконтролера. Використовуючи цей захист від читання мікропрограми (прошивки), виробники електронних пристроїв можуть захистити свій продукт від простого копіювання іншим виробником.
Зазвичай захист від копіювання встановлюється під час програмування мікроконтролера шляхом встановлення спеціального біта захистуабо кількох біт у слові конфігурації мікроконтролера. Фізично ці біти розташовуються у спеціальних осередках пам'яті на кристалі мікроконтролера. Іноді використовуються інші методи захисту, наприклад, захист паролем, але принцип зберігається. Щоб зняти захист, зазвичай необхідно змінити значення цього біта або кількох бітів, хоча часто можуть використовуватися інші методи зчитування вмісту пам'яті програми мікроконтролера. Звичайними методами, наприклад, програматором, це зробити не вдасться, необхідно складне дороге обладнання, якого звичайний розробник електронних пристроїв не має. Тому ми, маючи необхідне обладнання, знання та досвід, спеціалізуємося на наданні таких послуг.
Допустимо, у Вас є пристрій, який Ви придбали у одного з виробників електронних пристроїв і Ви хочете виробляти такий самий, але модифікований пристрій. Але вихідників мікропрограми або готової прошивки у Вас звичайно немає, і Вам буде потрібно повністю з нуля розробляти та налагоджувати мікропрограму. На це, порівняно з копіюванням електронної складової пристрою (схеми), доведеться витратити багато грошей та часу. Користуючись нашими професійними послугами, Ви заощадите гроші та час на розробку пристрою. За наявності пристрою або його електричної схеми ми можемо повністю відновити алгоритм його роботи і текст мікропрограми мовою програмування Сі або Ассемблер.
Усі мікропрограми (прошивки) ми зчитуємо на замовлення клієнта з метою ремонту його пристрою або для ознайомлення з алгоритмом роботи мікропрограми. Вся подальша відповідальність за незаконне розповсюдження мікропрограми або інші дії з нею або з її допомогою повністю лягає на замовника.
Наша компанія працює на території РФ, тому нижче наведемо цитату із закону. Законодавство інших країн декларує аналогічну позицію.
Стаття 1280 ЦК України. "Вільне відтворення програм для ЕОМ та баз даних. Декомпілювання програм для ЕОМ".
2. Особа, яка правомірно володіє екземпляром програми для ЕОМ, має право без згоди правовласника та без виплати додаткової винагороди вивчати, досліджувати чи відчувати функціонування такої програми з метою визначення ідей та принципів, що лежать в основі будь-якого елемента програми для ЕОМ, шляхом здійснення дій, передбачених підпунктом 1 пункту 1 цієї статті.
3. Особа, що правомірно володіє екземпляром програми для ЕОМ, має право без згоди правовласника та без виплати додаткової винагороди відтворити та перетворити об'єктний код у вихідний текст (декомпілювати програму для ЕОМ) або доручити іншим особам здійснити ці дії, якщо вони необхідні для досягнення здатності до взаємодії незалежно розробленої цією особою програми для ЕОМ з іншими програмами, які можуть взаємодіяти з програмою, що декомпілюється.
Додатковий трирівневий захист призначений для створення умов неможливості читання мікропрограми (прошивки) відомими методами. Вона може включати від одного до трьох рівнів захисту: захист від розтину корпусу, прихований внутрішньокорпусний обрив ніжки використовуваної програматором для читання, приховане внутрішньокристальне видалення логіки управління ніжкою, що використовується для читання.
Перший рівень є стійкий до кислот і розчинників тугоплавкий полімер, що не дозволяє дістатися кристала.
Другий рівень унеможливлює процедуру зчитування програматором без спеціальних дорогих інструментів.
Третій рівень виконує аналогічну другу функцію, але при цьому внутрішньокристальне відновлення логіки управління на внутрішніх шарах практично не можливе або вимагає дуже дорогого обладнання.
Враховуючи, що в переважній більшості випадків звичайний заводський захист легко обходиться, додатковий захист для багатьох дорогих і складних пристроїв є вкрай необхідним заходом для запобігання матеріальним втратам, пов'язаним з потраплянням плодів інтелектуальної діяльності до рук третіх осіб.
У цьому випадку перед встановленням додаткового захисту можна прошити тільки бутлоадер без основної програми. Після того, як ми встановимо додатковий захист, ви зможете запрограмувати основну пам'ять. Причому бутлоадер для завантаження основної програми повинен використовувати будь-який інший інтерфейс відмінний від основного, що використовується для стандартного програмування, оскільки основний інтерфейс буде відключений після встановлення додаткового захисту. Зазвичай сам бутлоадер не має жодного інтересу для копіювання. Як бутлоадер можна використовувати свій, або модифікований з прикладів від виробника мікроконтролера.
Цей клон Ардуїно пропонує спеціальний бутлоадер, який дозволяє заливати прошивку через 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.
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);
UPDATE 17.05.2018: У сучасній версії STM32Cube функції NVIC_SetVectorTable() немає. Натомість можна у файлі system_stm32f1xx.c (або аналогічного для іншого мікроконтролера) виправити дефайн VECT_TAB_OFFSET
"maple_upload.bat" COM20 2 1EAF:0003 "Path\To\Firmware.bin"
Замість COM20 потрібно підставити свій порт, куди причепився мікроконтролер.
Заливатор штука дуже ніжна, відносних шляхів не любить. так що шлях до прошивки потрібно вказувати повністю.
1EAF:0003 - це VID та PID
2 - це параметр AltID, який вказує, що прошивку потрібно заливати за адресою 0x08002000 (читати ).
Через це може виникнути незручність. Якщо мікроконтролер заглючив і повис, він не слухає порт. Отже, він не може почути ключову послідовність і перевантажитися в бутлоадер. Тоді тільки ресе на допомогу.
На цьому все. Сподіваюся, моя стаття проллє світло на те, як працює завантажувач у STM32 і як можна завантажувати прошивку через USB порт. На жаль поріг входження, як і раніше, високий, але раптом комусь моя стаття допоможе його подолати.
Сьогодні ми захищатимемо прошивку на stm32 від зчитування кул-хакерцями. Щоб не тягнути гуму, ось шмат коду:
#ifdef NDEBUG if (FLASH_GetReadOutProtectionStatus() == RESET) ( FLASH_Unlock(); FLASH_ReadOutProtection(ENABLE); FLASH_Lock(); ) #endif
Як не складно здогадатися, кусок використовує бібліотеку від stm. Такий шмат коду використовувати дуже зручно - контролер сам встановлює свій захист при першому запуску, а перший запуск легко організувати після прошивки. Ось вона, свобода від тиранії ф'юзів!
Так, я знаю, щодо холівору щодо «бібліотека vs безпосереднє звернення до регістрів». Моя позиція тут така - якщо потрібна велика швидкість, або залишилося зовсім мало пам'яті, але потрібне безпосереднє звернення до регістрів. Якщо і швидкість не важлива і пам'яті багато, краще використовувати бібліотеку - так програма пишеться швидше і виходить більш читається.
Для зняття захисту нам знадобиться програма st-link utility. Завантажити її можна.
Запускаємо програму і вибираємо цей пункт, або просто тиснемо ctrl-b:
У полі «стан захисту від читання вибираємо вимкнено». І натискаємо кнопку Apply:
Разом із бітом захисту стирається і вся пам'ять:
Захищайтесь ми за безпечний ембед.
Найпростіший і найдоступніший спосіб прошивки STM32- за допомогою бутлоудера, у цій статті ми розглянемо як це зробити на прикладі плати miniSTM32F103V.
Для початку давайте розберемося, що таке бутлоадерабо як його ще називають завантажувач. Завантажувач- це просто програма, яка зберігається у певній секції пам'яті та може перезаписувати флеш мікроконтролера. Вона зашивається при виробництві чіпа і її не можна змінити будь-яким чином. Щоб мікроконтролер зайшов у цю секцію пам'яті, треба висновок BOOT0підтягнути до харчування, а висновок BOOT1до землі. На платі ці два висновки знаходяться біля usb роз'єму, а підтяжка здійснюється за допомогою перемичок.
Нижче наведена таблиця, яка визначає з якої області пам'яті запуститься мікроконтролер після скидання, залежно від BOOT0і BOOT1.
Підключаємо перехідник usb-uartдо комп'ютера і залежно від того, на якій мікросхемі він зроблений CP2120або FT232, встановлюємо відповідні драйвери Після цього він має визначитися у системі як COM_PORT.