OpenOCD — виправлено помилку в команді stm32f1x unlock
Щось останнім часом я практично лише про помилки і пишу. Але тут поруч з поганою новиною є і хороша.
Ще десь перед новим роком виявив біду — у найсвіжішому на той час OpenOCD команда stm32f1x unlock
захист зчитування наче знімає, але по тому записати у мікроконтролер нічого не вдається.
На щастя, у мене десь лежала перевірена версія, зібрав її, встановив і все пішло. Вже десь у січні підключився до OpenOCD через telnet, потикався різними командами і з’ясував, що в усі option bytes
(окрім readout protection
) записані випадкові значення, тобто на довільні сектори flash-пам’яті було встановлено захист від запису, а також попсовано опції SW/HW WDT і інші.
І оце лише на минулому тижні розібрався. Драйвер stm32f1x
використовується для роботи з stm32f10x, stm32f0xx, stm32f3xx, але біда лише з stm32f10x. З’ясувалося, що в них захист від зчитування поширюється і на область флеш-пам’яті для блоку опцій. Для двох інших згаданих лінійок цього нема, у документації в табличках окремо відзначено можливість такого зчитування (при захисті з рівнем L1
). Можливо, саме тому в коді зчитування опцій з регістрів FLASH_OBR
і FLASH_WRPR
замінили зчитуванням безпосередньо з адрес 0x1ffff800..0x1ffff80f
.
Процедура unlock
перед стиранням опцій зчитує їхні значення, щоб під час запису коду дозволу зчитування відновити те, що було. Але ж доступу нема, OpenOCD доповідав, що прочитати не може і йшов далі. Тобто записував випадкові значення, які на той час були у неініціалізованій структурі.
Відповідно, ремонт простий — повернутися до зчитування з регістрів. Зараз патч лежить на узгодженні в їхньому gerrit-і, а я вже користуюся виправленим 🙂