|
|
  |
stm32 bootloader, разьясните новичку |
|
|
|
Apr 23 2012, 03:44
|
Участник

Группа: Свой
Сообщений: 73
Регистрация: 14-10-08
Из: Omsk
Пользователь №: 40 929

|
Цитата(batisto4ka @ Apr 23 2012, 00:02)  Подскажите, как сделать безусловный переход по адресу. Бутлоадер записал прогу например по адресу 0х08010000.
как организовать прыжек из бутлоадера в основную программу? Если приложение скомпилировано для загрузки с адреса 0x8010000, по этому адресу будет размещаться таблица векторов. Вектор Reset находится по смещению +4, но это не точка входа, а указатель на нее. Поэтому нужно достать адрес из таблицы векторов и уже его присвоить указателю на функцию. Смотрим проверенный пример от ST: Код #define ApplicationAddress 0x08010000 //Начало нашего приложения typedef void (*pFunction)(void); pFunction Jump_To_Application; uint32_t JumpAddress;
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000) //Проверяем, есть ли что-нибудь по адресу (там должно лежать значение SP для приложения, его кладет линкер) { JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4); //Адрес перехода из вектора Reset Jump_To_Application = (pFunction) JumpAddress; //Указатель на функцию перехода __set_MSP(*(__IO uint32_t*) ApplicationAddress); //Устанавливаем SP приложения Jump_To_Application(); //Запускаем приложение } while(1); // Если приложение не записано, Watchdog вернеет нас на начало бутлоадера В приложении переносим таблицу векторов, ведь мы приходим сюда с активной таблицей векторов бутлоадера и первое же прерывание выкинет нас в обработчик бутлоадера, если он определен, а если не определен, то возможен переход неизвестно куда и его следствие - HardFault. Код void main(void) { __disable_interrupt(); // Запрещаем прерывания NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x10000); //Адрес таблицы относительно начала Flash
... } Ответы на все вопросы лежат в примерах из AN2557
Сообщение отредактировал EugenyAM - Apr 23 2012, 03:45
|
|
|
|
|
Apr 23 2012, 07:03
|
Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997

|
Цитата(EugenyAM @ Apr 23 2012, 07:44)  Ответы на все вопросы лежат в примерах из AN2557 Где найти эти примеры?
|
|
|
|
|
Apr 23 2012, 09:29
|
Участник

Группа: Свой
Сообщений: 73
Регистрация: 14-10-08
Из: Omsk
Пользователь №: 40 929

|
Цитата(batisto4ka @ Apr 23 2012, 14:03)  Где найти эти примеры? Все лежит на сайте ST Описание AN2557Примеры AN2557
|
|
|
|
|
Apr 23 2012, 13:34
|
Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997

|
Цитата(EugenyAM @ Apr 23 2012, 07:44)  //Указатель на функцию перехода __set_MSP(*(__IO uint32_t*) ApplicationAddress); //Устанавливаем SP приложения __disable_interrupt(); }[/code] что то ругается компилятр на эи строчки, хотя путь к CoreM3 прописан.
|
|
|
|
|
Apr 23 2012, 13:52
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(batisto4ka @ Apr 23 2012, 17:34)  что то ругается компилятр на эи строчки, хотя путь к CoreM3 прописан. Мне вот такой способ больше нравится: Код #define APP_ADDR 0х08010000
void start_app(void) { static const uint16_t code[] = { 0xF850, 0xDB04, /* LDR.W SP, [R0], #4 */ 0x6800, /* LDR.W R0, [R0] */ 0x4700, /* BX R0 */ }; ((void (*)(uint32_t))(1 + (int)code))(APP_ADDR); }
|
|
|
|
|
Apr 23 2012, 19:32
|
Участник

Группа: Свой
Сообщений: 73
Регистрация: 14-10-08
Из: Omsk
Пользователь №: 40 929

|
Цитата(batisto4ka @ Apr 23 2012, 20:34)  что то ругается компилятр на эи строчки, хотя путь к CoreM3 прописан. Пример под IAR, компилировал на 6.21. __disable_interrupt() объявлена в intrinsics.h Под другие компиляторы примеры есть в AN2557
|
|
|
|
|
Apr 24 2012, 13:53
|
Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997

|
Цитата(scifi @ Apr 23 2012, 17:52)  Мне вот такой способ больше нравится: Вылетает в хард фолт. Меня интересует этот вопрос только для кейла.
Сообщение отредактировал IgorKossak - Apr 24 2012, 19:35
Причина редактирования: бездумное цитирование
|
|
|
|
|
Apr 24 2012, 13:59
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(batisto4ka @ Apr 24 2012, 17:53)  Вылетает в хард фолт. Для этого может быть множество причин, не связанных с этим кодом. Цитата(batisto4ka @ Apr 24 2012, 17:53)  Меня интересует этот вопрос только для кейла. Прелесть этого кода состоит в том, что он должен работать с любым компилятором.
|
|
|
|
|
Apr 24 2012, 19:17
|
Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997

|
Цитата(scifi @ Apr 24 2012, 17:59)  Для этого может быть множество причин, не связанных с этим кодом. Например???
|
|
|
|
|
Apr 26 2012, 07:05
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(jcxz @ Apr 19 2012, 11:22)  Вот такой алгоритм обеспечивает 100%-надёжное удалённое обновление прошивки в устройстве по рабочему протоколу, не боящееся неожиданных сбоев питания и с возможностью широковещательного обновления ПО. У вашего подхода есть минус. Представьте ситуацию - загруженная прошивка в девайс имеет правильную crc, но сама по себе так испорчена, что не позволяет загрузить новую прошивку.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Apr 26 2012, 08:31
|
Участник

Группа: Свой
Сообщений: 73
Регистрация: 14-10-08
Из: Omsk
Пользователь №: 40 929

|
Цитата(k000858 @ Apr 26 2012, 13:12)  - можно ли одной простой коммандой деинициализировать всю переферию, которая была инициализирована в бутлоадере??? ну или каким нибудь простым изящным движением руки? - при переходе в основную программу оперативная память контроллера остается занятой данными из бутлоадера, так? подскажите плиз простой способ подчистить память от всех этих данных? В начале бутлоадера проверяем признак его запуска (это может быть состояние Option Byte или бита в регистре Backup Domain, далее, если не надо его запускать, идем на основную программу с неинициализированной периферией, если надо - инициализируем периферию, пишем прошивку, сбрасываем признак запуска и делаем NVIC_SystemReset(), который выкидывает нас снова на старт, но уже со сброшенным признаком запуска. Если память надо чистить для конфиденциальности или приложение написано на асме, тогда ничего лучше записи чего-нибудь в цикле не придумать. (Может быть DMA?) Если приложение на Си самостоятельное, не является частью проекта бутлоадера, то компилятор пропишет в стартовом коде все инициализации переменных. Глобальные и статические переменные автоматом обнуляются до вызова функции main(), если они явно не инициализированы в программе, поэтому ничего страшного для программы при старте из бутлоадера не должно произойти.
|
|
|
|
|
Apr 26 2012, 12:08
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(jcxz @ Apr 26 2012, 12:07)  Ваши предложения как обойти этот минус? По-моему обойти это можно только, если неизменяемый загрузчик в первом секторе флеш, зашиваемый вами на заводе, будет иметь возможность "засасывать" прошивку из вне.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Apr 26 2012, 12:52
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 27-10-08
Пользователь №: 41 225

|
Раздумывал над таким вариантом. Придумал такой вариант тестирования прошивки: в самой прошивке пишем функцию и располагаем ее по четко указанному адресу памяти программ, задача функции получить какое-нибудь число, выполнить некие действия (например, какие то арифметические действия) и вернуть ответ. Перед загрузкой основной прошивки бутлоадер сделает вызов этой функции с какими-то данными, получит от нее результат, выполнит такие же операции с этим же набором данных сам, сравнит результаты, если результаты совпадут то прошивка будет считаться валидной. Получится эдакий аналог системы пароль-отзыв.
Конечно, от необнаруженных при помощи CRC ошибок в прошивке это может и не спасти (если ошибки в прошивке есть, а сама функция-ключ будет работоспособной), но хотя бы спасет от заливки "левых" прошивок и выполнения устройством непредусмотренных действий.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|