Доброго времени суток.
Столкнулся с необходимостью программировать удалённый контроллер (в частности stm32f103vet6) желательно через RS-485.
Следовательно требуется загрузчик. В принципе понятно что можно сделать в основной программе задачу в которую попадёт при объявлении сигнала. Которая потушит всё остальное и обновит прошивку.
Однако меня беспокоит что что-то может пойти не так (связь/питания) и очередная страница не сойдется по crc или еще чего. И получится кирпич.
Как это делают?
STM32F(1) Embedded Bootloader (Как?)
Делают загрузчик который включается до программы при запуске контроллера, он проверяет CRC основной программы. Если он совпадает, запускает основную программу, если нет - продолжает сам работать и ждет обновления. Естественно, основная программа тоже может запустить этот основной загрузчик.
Но например прикладную программу мне надо сделать с адресом попозже? Т.е. вопрос к комплиятору, делать как простую программу но указывать стартовый адрес позже загрузчика?
Есть ли необходимость делать загрузчик целиком на одной странице памяти чтобы он не участвовал в прошивке?
Например загрузчик работает из начала при сбросе. Загружается, проверяет хэш, если в порядке то ждет какое-то запланированное время, скажем 50мс, и если ничего не происходит делает переход на исполняемую программу.
Например ведущий говорит всем заткнуться (если это CAN) и ведомому говорит сброс. Пока происходит сброс, ведущий стучится в порт флаг-фреймом. Загрузчик видит флаг-фрейм и мы прошиваемся.
А еще наверное можно сделать обновление загрузчика из основной программы? И впринципе тиражирование своей прошивки соседям.
Если всё так то впринципе понятно.
P.S. Заблокированный от считывания через SWD флеш можно разблокировать из программы?
Есть ли необходимость делать загрузчик целиком на одной странице памяти чтобы он не участвовал в прошивке?
Например загрузчик работает из начала при сбросе. Загружается, проверяет хэш, если в порядке то ждет какое-то запланированное время, скажем 50мс, и если ничего не происходит делает переход на исполняемую программу.
Например ведущий говорит всем заткнуться (если это CAN) и ведомому говорит сброс. Пока происходит сброс, ведущий стучится в порт флаг-фреймом. Загрузчик видит флаг-фрейм и мы прошиваемся.
А еще наверное можно сделать обновление загрузчика из основной программы? И впринципе тиражирование своей прошивки соседям.
Если всё так то впринципе понятно.
P.S. Заблокированный от считывания через SWD флеш можно разблокировать из программы?
Т.е. вопрос к комплиятору, делать как простую программу но указывать стартовый адрес позже загрузчика?
Именно так. Я обычно пишу всю программу отдельно, и только когда все более-менее готово, добавляю загрузчик, просто меняя расположение всей программы в конфиге линкера.
Есть ли необходимость делать загрузчик целиком на одной странице памяти чтобы он не участвовал в прошивке?
Конечно.
А еще наверное можно сделать обновление загрузчика из основной программы?
Можно.
Заблокированный от считывания через SWD флеш можно разблокировать из программы?
Да, правда, у меня эта фича бажила и вылетали непойми какие глюки до физического снятия питания. Что-то явно не нравилось кэшу флэша.
Спасибо за ответы. Про флеш стмки почитал, проблем не должно возникнуть. Поскольку программа передаётся открытым текстом не думаю блокировать флеш от считывания. (Но как говориться "А вдруг")
Вернуться в «Микроконтроллеры и ПЛИС»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость