Комп'ютери та сучасні гаджети



У своєму проекті я використовую мікроконтролер 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.

  • Тепер мікроконтролер готовий прохатись через USB завантажувач. Але ще потрібно саму прошивку підправити. А зробити потрібно 2 речі:
    • Вказати лінкеру стартову адресу. У CooCox це робиться в налаштуваннях проекту, вкладка Link, розділ Memory Areas, Адреса IROM1 Start Address. Бутлоадер займає перші 8 кілобайт, отже стартова адреса прошивки буде 0x0800000 + 0x2000 = 0x08002000. Поле Size, мабуть, теж варто зменшити на 8к.
    • Десь спочатку програми перед ініціалізацією периферії зробити виклик

      NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);

  • Заливатор прошивки можна взяти із проекту stm32duino. У директорії інструментів шукайте скрипт під назвою maple_upload. Я користувався лише винною версією - maple_upload.bat.
  • Запускати так:

    "maple_upload.bat" COM20 2 1EAF:0003 "Path\To\Firmware.bin"
    Замість COM20 потрібно підставити свій порт, куди причепився мікроконтролер.

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

    1EAF:0003 - це VID та PID

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

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

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

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

    Відповіді на питання, що часто ставляться:

  • 1. Для кого призначено цей FAQ?

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

  • 2. Навіщо і від кого робиться захист мікроконтролерів?

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

  • 3. Що є захист від копіювання в мікроконтролері, і чому я сам не можу вважати захищену мікропрограму (прошивку)?

    Зазвичай захист від копіювання встановлюється під час програмування мікроконтролера шляхом встановлення спеціального біта захистуабо кількох біт у слові конфігурації мікроконтролера. Фізично ці біти розташовуються у спеціальних осередках пам'яті на кристалі мікроконтролера. Іноді використовуються інші методи захисту, наприклад, захист паролем, але принцип зберігається. Щоб зняти захист, зазвичай необхідно змінити значення цього біта або кількох бітів, хоча часто можуть використовуватися інші методи зчитування вмісту пам'яті програми мікроконтролера. Звичайними методами, наприклад, програматором, це зробити не вдасться, необхідно складне дороге обладнання, якого звичайний розробник електронних пристроїв не має. Тому ми, маючи необхідне обладнання, знання та досвід, спеціалізуємося на наданні таких послуг.

  • 4. Що дає зняття захисту від читання мікропрограми (прошивки)?

    Допустимо, у Вас є пристрій, який Ви придбали у одного з виробників електронних пристроїв і Ви хочете виробляти такий самий, але модифікований пристрій. Але вихідників мікропрограми або готової прошивки у Вас звичайно немає, і Вам буде потрібно повністю з нуля розробляти та налагоджувати мікропрограму. На це, порівняно з копіюванням електронної складової пристрою (схеми), доведеться витратити багато грошей та часу. Користуючись нашими професійними послугами, Ви заощадите гроші та час на розробку пристрою. За наявності пристрою або його електричної схеми ми можемо повністю відновити алгоритм його роботи і текст мікропрограми мовою програмування Сі або Ассемблер.

  • 5. Яка законність таких дій із погляду законодавства?

    Усі мікропрограми (прошивки) ми зчитуємо на замовлення клієнта з метою ремонту його пристрою або для ознайомлення з алгоритмом роботи мікропрограми. Вся подальша відповідальність за незаконне розповсюдження мікропрограми або інші дії з нею або з її допомогою повністю лягає на замовника.

    Наша компанія працює на території РФ, тому нижче наведемо цитату із закону. Законодавство інших країн декларує аналогічну позицію.

    Стаття 1280 ЦК України. "Вільне відтворення програм для ЕОМ та баз даних. Декомпілювання програм для ЕОМ".

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

    3. Особа, що правомірно володіє екземпляром програми для ЕОМ, має право без згоди правовласника та без виплати додаткової винагороди відтворити та перетворити об'єктний код у вихідний текст (декомпілювати програму для ЕОМ) або доручити іншим особам здійснити ці дії, якщо вони необхідні для досягнення здатності до взаємодії незалежно розробленої цією особою програми для ЕОМ з іншими програмами, які можуть взаємодіяти з програмою, що декомпілюється.

  • 6. Що являє собою додатковий захист від читання і чому він кращий за звичайний?

    Додатковий трирівневий захист призначений для створення умов неможливості читання мікропрограми (прошивки) відомими методами. Вона може включати від одного до трьох рівнів захисту: захист від розтину корпусу, прихований внутрішньокорпусний обрив ніжки використовуваної програматором для читання, приховане внутрішньокристальне видалення логіки управління ніжкою, що використовується для читання.

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

    Другий рівень унеможливлює процедуру зчитування програматором без спеціальних дорогих інструментів.

    Третій рівень виконує аналогічну другу функцію, але при цьому внутрішньокристальне відновлення логіки управління на внутрішніх шарах практично не можливе або вимагає дуже дорогого обладнання.

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

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

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

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

  • Тепер мікроконтролер готовий прохатись через USB завантажувач. Але ще потрібно саму прошивку підправити. А зробити потрібно 2 речі:
    • Вказати лінкеру стартову адресу. У CooCox це робиться в налаштуваннях проекту, вкладка Link, розділ Memory Areas, Адреса IROM1 Start Address. Бутлоадер займає перші 8 кілобайт, отже стартова адреса прошивки буде 0x0800000 + 0x2000 = 0x08002000. Поле Size, мабуть, теж варто зменшити на 8к.
    • Десь спочатку програми перед ініціалізацією периферії зробити виклик

      NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);

      UPDATE 17.05.2018: У сучасній версії STM32Cube функції NVIC_SetVectorTable() немає. Натомість можна у файлі system_stm32f1xx.c (або аналогічного для іншого мікроконтролера) виправити дефайн VECT_TAB_OFFSET

  • Заливатор прошивки можна взяти із проекту stm32duino. У директорії інструментів шукайте скрипт під назвою maple_upload. Я користувався лише винною версією - maple_upload.bat.
  • Запускати так:

    "maple_upload.bat" COM20 2 1EAF:0003 "Path\To\Firmware.bin"
    Замість COM20 потрібно підставити свій порт, куди причепився мікроконтролер.

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

    1EAF:0003 - це VID та PID

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

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

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

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

    Сьогодні ми захищатимемо прошивку на stm32 від зчитування кул-хакерцями. Щоб не тягнути гуму, ось шмат коду:

    #ifdef NDEBUG if (FLASH_GetReadOutProtectionStatus() == RESET) ( FLASH_Unlock(); FLASH_ReadOutProtection(ENABLE); FLASH_Lock(); ) #endif

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

    Так, я знаю, щодо холівору щодо «бібліотека vs безпосереднє звернення до регістрів». Моя позиція тут така - якщо потрібна велика швидкість, або залишилося зовсім мало пам'яті, але потрібне безпосереднє звернення до регістрів. Якщо і швидкість не важлива і пам'яті багато, краще використовувати бібліотеку - так програма пишеться швидше і виходить більш читається.

    Зняти захист
    Контролер ми захистили. Але біда - потрібно поправити нашу програму, а при встановленому захисті нічого з контролером зробити не можна - ні прочитати ні записати. Як зняти захист? Відразу попереджаю - хлопці зі ST все зробили правильно і разом із захистом знищується вся прошивка.

    Для зняття захисту нам знадобиться програма st-link utility. Завантажити її можна.

    Запускаємо програму і вибираємо цей пункт, або просто тиснемо ctrl-b:

    У полі «стан захисту від читання вибираємо вимкнено». І натискаємо кнопку Apply:

    Разом із бітом захисту стирається і вся пам'ять:

    Захищайтесь ми за безпечний ембед.

    Найпростіший і найдоступніший спосіб прошивки 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.

    Якщо помітили помилку, виділіть фрагмент тексту та натисніть Ctrl+Enter
    ПОДІЛИТИСЯ:
    Комп'ютери та сучасні гаджети