STM32L… і STM32F… Bootloader і його особливості

Реклама від Google



Неточності в технічному описі і особливості використання Bootloader через порт USART
Довелося робити програму для запису в FLASH-пам’ять контролерів із сімейства STM32L…. та STM32F….
Перші враження від цих контролерів: надзвичайно складно, і надзвичайно чудово.

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

А чому чудово ? Та тому, що швидкість роботи контролера така, що згадувати про значно повільніші AVR вже не хочеться.

Програмуючи електроніку з надписом STM32…(далі не важливо), регулярно доводиться наштовхуватись на невідповідність того, що написано в тій чи іншій сервісній інструкції, і суворою реальністю. Назбиравши деякий список “як написано” і “як насправді”, вирішив описати все це в невеличкій коректуючій статті.

Коректувати будемо технічний опис (даташіт) функцій стартового загрузчика (bootloader, “бутлодер”). Цей загрузчик забезпечує запис необхідної інформації в пам’ять контролера, тобто програмування контролера, а також прочитування інформації з пам’яті і виконання ще деяких необхідних сервісних функцій.
Технічний опис називається  “AN3155 AN2606 Application note”, і головна тема опису – “USART protocol used in the STM32 bootloader”, тобто протокол інтерфейса USART загрузчика контролера STM32.

Опис охоплює такі групи контролерів:
STM32L0, STM32L1, STM32F0, STM32F1,
STM32F2, STM32F3. STM32F4

Англійський варіант опису лежить на сайті www.st.com

Нагадую, нас цікавлять неточності цього опису.

Отже, у нас є контролер, на нього подано живлення, наша задача – запрограмувати контролер з допомогою спеціалізованої, нами розробленої програми. Навіщо робити свою програму, коли є стандартні ? Варіантів багато:
 – можливо, потрібен віддалений доступ, який важко організувати, використовуючи стандартну програму для роботи з бутлодером.
 – можливо, потрібне спеціалізоване “засекречування” прошивки контролера.
 – можливо, замовник хоче програмувати якимись своїми програмними засобами, і стандартний програматор не годиться.

Так чи інакше, треба зробити свою програму для роботи з бутлодером. Я звик називати “стартовий загрузчик”, але доведеться називати тупим жаргоном “бутлодер”.

Як “викликати на себе” бутлодер з мікроконтролера ? Це просто. В сімействі контролерів, які ми розглядаємо, є інформаційні входи BOOT0 і BOOT1.
Через який порт зайкраще працювати з бутлодером ?
Залежно від модифікації, бутлодер працює з портами USART, або з портами USART і DFU, або USART і CAN, або USART і SPI, далі можна не продовжувати. Зрозуміло, що найпростіше запрограмувати контролер через інтерфейс USART, ми вибираємо найбільш простий шлях.
Вхід BOOT1 надійно підключаємо до логічного “0”, тобто через резистор – на “землю”. Вхід BOOT0 – також через резистор на “землю”, але ми подамо на нього логічну “1”, коли почнемо програмування контролера.
Послідовність проста.
1. На вхід BOOT0 подаємо логічну “1”,
2. Формуємо одиночний імпульсний сигнал “Reset”, короткий “0” і далі логічна “1”.

Неточність в описі: насправді сигнал “Reset” не може бути нескінченно коротким, приходиться витримувати хоча б 10 мілісекунд (10 мс). Формую для підстраховки 50 мс, часу у мене багато. Тепер, згідно опису, на інтерфейсний вхід TX01 можна подавати байт 0x7F згідно протоколу послідовного інтерфейса USART.

Неточність в описі: після Reset доведеться почекати приблизно 0.1 секунди. Адже електронщики підключили до входу Reset лише конденсатор, а скидувати Reset в “0” рекомендується “відкритим колектором”. Значить, чекаємо, доки на вході Reset надійно встановиться логічна “1”.

Отже, можна подавати байт 0x7F.  Розглянемо детально.
В протоколі USART спочатку “нулем” формується стартовий біт, потім побітно йдуть 8 біт нашого байта, починаючи з молодшого біта і закінчуючи старшим, Потім йде “парний біт”. В деяких протоколах він може бути “непарним” або відсутнім. Для бутлодера він має бути парним.
В кінці йдуть два стоп-біти, вони йдуть логічною “одиницею”.
Швидкість передачі біт вибираємо стандартну, починаючи з 1200 бод, і закінчуючи 115200 бод. При наладці програми програматора можна наугад вибрати 19200 бод.

Неточність в описі: написано, що бутлодер одержить байт 0x7F і негайно віддасть байт 0x79 (така відповідь називається ACK), показуючи, що він готовий до роботи. В реальності бутлодер деяких контролерів може нічим не відповісти. Доводиться, почекавши 0.1 секунди, знову подавати байт 0x7F і так само приблизно 0.1 секунди чекати на відповідь. Довелось в моїй програмі до 10 раз повторювати цю процедуру, щоб гарантовано витрясти відповіль з бутловера. Але спрацьовує не після 10 раз, а після 2-3 раз. А в деяких контролерах відповідає зразу, з першого запиту.

Бутлодер вже в робочому стані. Далі буде краще. Розглядуємо функції (команди) бутлодера.

Get command
Ніяких претензій не маю, працює нормально, і згідно з описом.

Get version, Get ID command – працює нормально. Потрібність цих функцій відносна, ви й так добре знаєте, який контролер хочете запрограмувати.

Read Memory command
Дуже потрібна команда. Наштовхуємось на необхідність самим формувати контрольну суму. Контрольна сума завжди є такою, щоб при “додаванні по модулю 2” байтів інформаційного блока і контрольної суми ми одержували число 0xFF.
“Додавання по модулю 2” – це одна з назв додавання XOR, в компіляторі “C” це додавання позначається значком “^“.
Наприклад, C=A ^ B;

Отже, команда Read Memory. Передаємо байт 0x11 і його контрольну суму 0xEE, чекаємо відповіль ACK, це байт 0x79.
Передаємо 4-байтну адресу в пам’яті контролера, починаючи зі старшого байта, і контрольну суму. Чекаємо на відповідь ACK.
Передаємо одним байтом кількість байт, які ми хочемо прочитати, і контрольну суму цієї кількості.
Наприклад, це байти 0x10 і 0xEF. Кількість = 16 = 0x10, а контрольна сума = 0xEF.
Чекаємо на ACK.
Далі ми одержимо байти з пам’яті контролера в необхідній кількості.

Неточність в описі: ні, це ще не все. Незважаючи на опис, далі ми одержимо байт ACK. Якщо ми його не прочитаємо, він нам залізе в буфер (якщо читання по протоколу USART у нас буфероване) і зіпсує нам інформаційну картину.

GO command – ця команда успішно виконується, її потрібність незначна.

Write Memory command
Це головна команда з усіх, що нам потрібні.
Передаємо 0x31 і контрольну суму 0xCE. Чекаємо ACK.
Передаємо 4 байти адреси пам’яті контролера і контрольну суму. Адреса – зі старшого байта до молодшого.
Чекаємо ACK.
Далі уважно.
1. Кількість байт, які ми записуємо, завжди повинна бути кратна 4. Ми можемо записати 20 байт, але не можемо записати 19 або 21.
2.  Вибираємо потрібну нам кількість байт (це число кратне 4), віднімаємо від нього 1, і результат передаємо одним байтом в контролер.
3. Передаємо необхідні байти для запису.
4. Передаємо контрольну суму. В контрольну суму входить “кількість байт -1” і передані інформаційні байти.
5. Чекаємо ACK.

Erase Memory command і Extended Erase Memory command
Команди хороші, але працюють погано.
1. Для різних контролерів різні розміри сторінок FLASH-пам’яті, які підлягають стиранню.
2. Для деяких контролерів немає стирання по сторінках, там стирання по секторах.
3. Кінцева відповіль ACK приходить не відразу, а лише після витирання вказаних сторінок.
4. Деякі контролери підтримують команду Erase Memory command, інші підтримують команду Extended Erase Memory command. Немає контролерів, які підтримують обидві групи команд.
5. В деяких контролерах після витирання сторінки діалог припиняється.

А як продовжувати роботу ?
Тепер доведеться застосовувати такий ланцюжок:
“чекання 50 мс” – “Reset” – “чекання 50 мс” – “передача байта 0x7F” – “отримання байта 0x79” (а в деяких контролерах ці дві останні дії доводиться виконувати кілька раз, це було описано на початку статті) і далі бутлодер знову готовий до роботи. Такий ланцюжок можна назвати “повторний запуск бутлодера”, нам цю назву ще доведеться згадувати.
Важливо ! В повторному запуску бутлодера категорично потрібно на початку витримувати паузу в кілька десятків мілісекунд. Саме тому така пауза вказана в ланцюжку повторного запуску бутлодера. Зрозуміло, що ця пауза може бути трохи коротшою.

Write Protect command і Write Unprotect command – працюють нормально.

Readout Protect command – працює нормально.
Увага ! Після виконання цієї команди – обов’язковий повторний запуск бутлодера.

Readout Unprotect command – працює нормально. Виконується довго, кілька секунд.
Увага ! Після виконання цієї команди – обов’язковий повторний запуск бутлодера.

Рекомендація виробників. Хто не хоче зайвих складнощів, той не користується очисткою FLASH-пам’яті контролера методом Erase Memory command або Extended Erase Memory. Рекомендують спочатку захистити FLASH-пам’ять від зчитування захистом першого рівня (це виконується командою Readout Protect command) а потім зняти захист (Readout Unprotect command). Після таких дій FLASH-пам’ять чиста-чиста. Така послідовність є універсальною, а тому зручною.
——————————————————————————————————–
Чи не пропустив я що-небудь ? Для тих, хто хоче щось додати, завжди є коментарі.
——————————————————————————————————–

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

Всім бажаючим продаємо наш інформаційний архів

Ви можете замовити ВЕСЬ наш файловий архів, його об'єм - більше 12 Гігабайт. Отримати можна в вигляді бандеролі з чотирма DVD-дисками, на яких ВСІ наші схеми, мануали, вся додаткова інформація, або завантажити вказаний архів через Інтернет. При завантаженні через Інтернет - вартість замовлення 120 грн, при замовленні на DVD-дисках - загальна вартість 220 грн при замовленні доставки звичайною Укрпоштою чи Новою поштою. Оплата - після отримання замовлення.
Ось СПИСОК НАШИХ ФАЙЛІВ.
Для замовлення архіва треба перейти НА СТОРІНКУ ЗАМОВЛЕННЯ.
Схема мануал телевизора шасси, схему скачать бесплатно, ищу схему модулей, ищу шасси телевизора, схемы телевизоров, мануалы

Залишити відповідь (Leave a Reply)