реклама на сайте
подробности

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> stm32 bootloader, разьясните новичку
EugenyAM
сообщение Apr 23 2012, 03:44
Сообщение #31


Участник
*

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
batisto4ka
сообщение Apr 23 2012, 07:03
Сообщение #32


Частый гость
**

Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997



Цитата(EugenyAM @ Apr 23 2012, 07:44) *
Ответы на все вопросы лежат в примерах из AN2557

Где найти эти примеры?
Go to the top of the page
 
+Quote Post
EugenyAM
сообщение Apr 23 2012, 09:29
Сообщение #33


Участник
*

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



Цитата(batisto4ka @ Apr 23 2012, 14:03) *
Где найти эти примеры?


Все лежит на сайте ST

Описание AN2557
Примеры AN2557
Go to the top of the page
 
+Quote Post
batisto4ka
сообщение Apr 23 2012, 13:34
Сообщение #34


Частый гость
**

Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997



Цитата(EugenyAM @ Apr 23 2012, 07:44) *
//Указатель на функцию перехода
__set_MSP(*(__IO uint32_t*) ApplicationAddress); //Устанавливаем SP приложения
__disable_interrupt();
}[/code]

что то ругается компилятр на эи строчки, хотя путь к CoreM3 прописан.
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 23 2012, 13:52
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 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);
}
Go to the top of the page
 
+Quote Post
EugenyAM
сообщение Apr 23 2012, 19:32
Сообщение #36


Участник
*

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



Цитата(batisto4ka @ Apr 23 2012, 20:34) *
что то ругается компилятр на эи строчки, хотя путь к CoreM3 прописан.

Пример под IAR, компилировал на 6.21.
__disable_interrupt() объявлена в intrinsics.h

Под другие компиляторы примеры есть в AN2557
Go to the top of the page
 
+Quote Post
batisto4ka
сообщение Apr 24 2012, 13:53
Сообщение #37


Частый гость
**

Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997



Цитата(scifi @ Apr 23 2012, 17:52) *
Мне вот такой способ больше нравится:

Вылетает в хард фолт.

Меня интересует этот вопрос только для кейла.

Сообщение отредактировал IgorKossak - Apr 24 2012, 19:35
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 24 2012, 13:59
Сообщение #38


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(batisto4ka @ Apr 24 2012, 17:53) *
Вылетает в хард фолт.

Для этого может быть множество причин, не связанных с этим кодом.

Цитата(batisto4ka @ Apr 24 2012, 17:53) *
Меня интересует этот вопрос только для кейла.

Прелесть этого кода состоит в том, что он должен работать с любым компилятором.
Go to the top of the page
 
+Quote Post
batisto4ka
сообщение Apr 24 2012, 19:17
Сообщение #39


Частый гость
**

Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997



Цитата(scifi @ Apr 24 2012, 17:59) *
Для этого может быть множество причин, не связанных с этим кодом.

Например???
Go to the top of the page
 
+Quote Post
k000858
сообщение Apr 26 2012, 06:12
Сообщение #40


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



подскажите плиз по переходу из бутлоадера в основную программу:
- можно ли одной простой коммандой деинициализировать всю переферию, которая была инициализирована в бутлоадере??? ну или каким нибудь простым изящным движением руки?
- при переходе в основную программу оперативная память контроллера остается занятой данными из бутлоадера, так? подскажите плиз простой способ подчистить память от всех этих данных?
Go to the top of the page
 
+Quote Post
Lotor
сообщение Apr 26 2012, 07:05
Сообщение #41


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



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

У вашего подхода есть минус. Представьте ситуацию - загруженная прошивка в девайс имеет правильную crc, но сама по себе так испорчена, что не позволяет загрузить новую прошивку.


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 26 2012, 08:07
Сообщение #42


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Конечно перед заливкой, надо провести полные испытания новой прошивки.
Ваши предложения как обойти этот минус?
Учтите, что рабочий интерфейс в общем случае у нас может быть сложным - сокет TCP/IP поверх Ethernet или GSM или ZigBee и т.п., т.е. - канал, для которого нельзя задать конфигурационные параметры по умолчанию.
Go to the top of the page
 
+Quote Post
EugenyAM
сообщение Apr 26 2012, 08:31
Сообщение #43


Участник
*

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



Цитата(k000858 @ Apr 26 2012, 13:12) *
- можно ли одной простой коммандой деинициализировать всю переферию, которая была инициализирована в бутлоадере??? ну или каким нибудь простым изящным движением руки?
- при переходе в основную программу оперативная память контроллера остается занятой данными из бутлоадера, так? подскажите плиз простой способ подчистить память от всех этих данных?

В начале бутлоадера проверяем признак его запуска (это может быть состояние Option Byte или бита в регистре Backup Domain, далее, если не надо его запускать, идем на основную программу с неинициализированной периферией, если надо - инициализируем периферию, пишем прошивку, сбрасываем признак запуска и делаем NVIC_SystemReset(), который выкидывает нас снова на старт,
но уже со сброшенным признаком запуска.

Если память надо чистить для конфиденциальности или приложение написано на асме, тогда ничего лучше записи чего-нибудь в цикле не придумать. (Может быть DMA?)
Если приложение на Си самостоятельное, не является частью проекта бутлоадера, то компилятор пропишет в стартовом коде все инициализации переменных.
Глобальные и статические переменные автоматом обнуляются до вызова функции main(), если они явно не инициализированы в программе, поэтому ничего страшного для программы при старте из бутлоадера не должно произойти.
Go to the top of the page
 
+Quote Post
Lotor
сообщение Apr 26 2012, 12:08
Сообщение #44


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Цитата(jcxz @ Apr 26 2012, 12:07) *
Ваши предложения как обойти этот минус?

По-моему обойти это можно только, если неизменяемый загрузчик в первом секторе флеш, зашиваемый вами на заводе, будет иметь возможность "засасывать" прошивку из вне.


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
lead_seller
сообщение Apr 26 2012, 12:52
Сообщение #45


Участник
*

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



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

Конечно, от необнаруженных при помощи CRC ошибок в прошивке это может и не спасти (если ошибки в прошивке есть, а сама функция-ключ будет работоспособной), но хотя бы спасет от заливки "левых" прошивок и выполнения устройством непредусмотренных действий.
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 06:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01512 секунд с 7
ELECTRONIX ©2004-2016