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

 
 
> Самозагрузчик
inventor
сообщение Apr 7 2016, 06:34
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Подскажите как правильно сделать вот что:

имеется какой то прибор с SD картой на проце STM32
я хочу сделать для пользователя возможность самому менять прошивку.
делал такие вещи для других процов,
с ST возникли некоторые вопросы.

предположим - нужно поменять прошивку прибора,
саму прошивку - бинарник заливаю в корень SD карты.
при включении питания маленькая программа, loader смотрит:
есть ли файл с определенным именем на SD и если есть, то
записывает его в определенный раздел внутренней flash памяти
далее после того как успешно записал бинарник на flash,
стирает его на SD карте. - передает ему управление.
если файла bin нет - то loader просто передает управление программе.

саму программу Loader я хочу разместить
по адресу Flash 0x08000000
а рабочая прошивка, предположим, будет работать с адреса 0x08001000
после того, как бинарник записан по адресу 0x08001000
как мне LOADER - ом передать ему управление?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
inventor
сообщение Apr 12 2016, 12:44
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Сделал, но чего то не получается запустить основную программу
в чем может быть проблема?

утилитой ST Link проверяю - файл записался и лежит правильно в памяти
Загрузчик у меня такой:
CODE

#define FILE_NAME "loader.bin"
#define APP_ADDRESS (uint32_t)0x08008000


do {
/* Монтируем. Если нет файла - выходим на загрузку */
if ((rc = f_mount(0, &fatfs)) == 0) {
PRINTF("INFO: mount OK\r\n");
} else {
PRINTF("ERROR: mount fs\n");
break;
}

/* Открыть на чтение */
rc = f_open(&fil, FILE_NAME, FA_READ);
if (rc == 0) {
PRINTF("INFO: Loader file %s open OK\n", FILE_NAME);
} else {
PRINTF("INFO: Loader file %s doesn't exist. Continue booting", FILE_NAME);
break;
}

/* стираем секторы 2...4*/
FLASH_Unlock();
delay_ms(50);

if(FLASH_COMPLETE == FLASH_EraseSector(FLASH_Sector_2, VoltageRange_3)) {
PRINTF("Erase sector OK\n");
led_toggle(LED3);
}

if(FLASH_COMPLETE == FLASH_EraseSector(FLASH_Sector_3, VoltageRange_3)) {
PRINTF("Erase sector OK\n");
led_toggle(LED3);
}

if(FLASH_COMPLETE == FLASH_EraseSector(FLASH_Sector_4, VoltageRange_3)) {
PRINTF("Erase sector OK\n");
led_toggle(LED3);
}


/* Читаем файл и записываем в секторы flash */
bytes = 0;
addr = APP_ADDRESS;
do {
bw = 0;
rc = f_read(&fil, buf, sizeof(buf), &bw);
if (rc == 0 && bw > 0) {
bytes += bw;
for(i = 0; i < bw; i++) {
FLASH_ProgramByte(addr, buf[i]);
addr++;
}
PRINTF("%d bytes written\n", bytes);
led_toggle(LED4);
delay_ms(50);
}
} while (bw);

rc = f_close(&fil);

// Стираем файл
/* Если файл существует - удалим его */
// rc = f_unlink(FILE_NAME);

} while (0);

/* Disable all interrupts */
RCC->CIR = 0x00000000;

/* Делаем старт по адресу */
JumpAddr = *(__IO uint32_t*) (APP_ADDRESS + 4);
Jump_To_App = (pFunction) JumpAddr;

/* Initialize application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APP_ADDRESS);
Jump_To_App();


Я вижу отладчиком, что до джампа он доходит - а дальше аут

основная прога использует такой скрипт линкера, где установлены адреса:

define symbol __ICFEDIT_intvec_start__ = 0x08008000;
define symbol __ICFEDIT_region_ROM_start__ = 0x08008000;

+ сделал коментарий в вызове из ассемблера SystenInit() - так это уже сделано в загрузчике
компилю образ проги и получаю бинарник program.bin

CODE
;Reset_Handler

; LDR R0, =SystemInit
; BLX R0
LDR R0, =__iar_program_start
BX R0


В чем может быть еще засада?
Go to the top of the page
 
+Quote Post
KRS
сообщение Apr 12 2016, 14:26
Сообщение #3


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(inventor @ Apr 12 2016, 15:44) *
Код
    /* Disable all interrupts */
       RCC->CIR = 0x00000000;
    
      /* Делаем старт по адресу */
    JumpAddr = *(__IO uint32_t*) (APP_ADDRESS + 4);
    Jump_To_App = (pFunction) JumpAddr;

    /* Initialize application's Stack Pointer */
    __set_MSP(*(__IO uint32_t*) APP_ADDRESS);
    Jump_To_App();


Так делать некорректно!
Во первых не устанавливается новый адрес таблицы векторов ( VTOR )
Во вторых указатель стека будет модифицирован и не будет соответствовать тому что лежит по APP_ADDRESS

И если хотите отлаживать приложение без бутлоадера (если это разные проекты) то надо у IAR в макросах установить запись VTOR - тогда можно без проблем отлаживать.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 12 2016, 14:49
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(KRS @ Apr 12 2016, 17:26) *
Во первых не устанавливается новый адрес таблицы векторов ( VTOR )

По-моему, это все же дело приложения, а не загрузчика.

Цитата(KRS @ Apr 12 2016, 17:26) *
Во вторых указатель стека будет модифицирован и не будет соответствовать тому что лежит по APP_ADDRESS

Где?
Go to the top of the page
 
+Quote Post
KRS
сообщение Apr 12 2016, 15:41
Сообщение #5


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(aaarrr @ Apr 12 2016, 17:49) *
По-моему, это все же дело приложения, а не загрузчика.

Нет - загрузчика! Потому что старт приложения происходит по RESET вектору который лежит в таблице прерываний, соотв. VTOR обязан указывать туда...




Цитата(scifi @ Apr 12 2016, 18:03) *
Как обычно, агитирую за свой вариант biggrin.gif


Ну можно и встроенным асмом обойтись...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- inventor   Самозагрузчик   Apr 7 2016, 06:34
- - KRS   Цитата(inventor @ Apr 7 2016, 09:34) посл...   Apr 7 2016, 06:51
|- - inventor   Цитата(KRS @ Apr 7 2016, 10:51) Самый луч...   Apr 7 2016, 07:05
|- - Непомнящий Евгений   Цитата(inventor @ Apr 7 2016, 10:05) у ме...   Apr 7 2016, 07:11
|- - inventor   то есть я делаю в файле линкера для прошивки испра...   Apr 7 2016, 07:46
|- - KRS   Цитата(inventor @ Apr 7 2016, 10:46) верн...   Apr 7 2016, 08:09
- - jcxz   Цитата(inventor @ Apr 7 2016, 12:34) саму...   Apr 7 2016, 08:07
|- - inventor   Цитата(jcxz @ Apr 7 2016, 11:07) В 0x1000...   Apr 7 2016, 10:13
- - KnightIgor   Цитата(inventor @ Apr 7 2016, 07:34) имее...   Apr 7 2016, 13:54
|- - x893   Цитата(KnightIgor @ Apr 7 2016, 16:54) У ...   Apr 7 2016, 20:01
||- - KnightIgor   Цитата(x893 @ Apr 7 2016, 21:01) Вот бы е...   Apr 8 2016, 09:26
|- - kolobok0   Цитата(KnightIgor @ Apr 7 2016, 16:54) У ...   Apr 7 2016, 21:06
|- - Непомнящий Евгений   Цитата(kolobok0 @ Apr 8 2016, 00:06) в св...   Apr 8 2016, 05:37
|- - kolobok0   Цитата(Непомнящий Евгений @ Apr 8 2016, 08...   Apr 8 2016, 14:07
|- - Kabdim   Цитата(kolobok0 @ Apr 8 2016, 17:07) - за...   Apr 12 2016, 13:11
|- - kolobok0   Цитата(Kabdim @ Apr 12 2016, 16:11) А вот...   Apr 12 2016, 14:26
- - romas2010   Цитата(inventor @ Apr 7 2016, 09:34) Подс...   Apr 7 2016, 15:07
- - bugdesigner   Вот мой скелет бутлоадераю Выделено под него 16К ф...   Apr 8 2016, 09:55
|- - scifi   Цитата(inventor @ Apr 12 2016, 15:44) Я в...   Apr 12 2016, 12:52
||- - inventor   Цитата(scifi @ Apr 12 2016, 15:52) А попо...   Apr 12 2016, 13:12
||- - scifi   Цитата(inventor @ Apr 12 2016, 16:12) ток...   Apr 12 2016, 13:37
|- - scifi   Цитата(aaarrr @ Apr 12 2016, 17:49) Где? ...   Apr 12 2016, 15:03
||- - zltigo   QUOTE (scifi @ Apr 12 2016, 18:03) Ассемб...   Apr 13 2016, 08:03
||- - scifi   Цитата(zltigo @ Apr 13 2016, 11:03) Ассем...   Apr 13 2016, 08:10
||- - KnightIgor   Цитата(scifi @ Apr 13 2016, 09:10) Я ж не...   Apr 13 2016, 09:00
||- - scifi   Цитата(KnightIgor @ Apr 13 2016, 12:00) О...   Apr 13 2016, 09:41
||- - zltigo   QUOTE (scifi @ Apr 13 2016, 12:41) А, ну ...   Apr 13 2016, 09:47
||- - scifi   Цитата(zltigo @ Apr 13 2016, 12:47) В дан...   Apr 13 2016, 09:50
||- - zltigo   QUOTE (scifi @ Apr 13 2016, 12:50) Вы сво...   Apr 13 2016, 10:03
|||- - scifi   Цитата(zltigo @ Apr 13 2016, 13:03) Абсол...   Apr 13 2016, 10:14
||- - Сергей Борщ   QUOTE (scifi @ Apr 13 2016, 11:50) Все уж...   Apr 13 2016, 11:14
|- - aaarrr   Цитата(KRS @ Apr 12 2016, 18:41) Нет - за...   Apr 12 2016, 16:49
|- - scifi   Цитата(aaarrr @ Apr 12 2016, 19:49) А я -...   Apr 13 2016, 06:59
- - inventor   Сделал самозагрузчик, забыл вызвать функцию NVIC_...   Apr 13 2016, 06:49
|- - KnightIgor   Цитата(inventor @ Apr 13 2016, 07:49) вот...   Apr 13 2016, 07:54
- - ViKo   Коль все предъявили, тогда и я...: Код/* Адрес ...   Apr 13 2016, 10:21
|- - scifi   Цитата(ViKo @ Apr 13 2016, 13:21) Коль вс...   Apr 13 2016, 10:35
|- - ViKo   Цитата(scifi @ Apr 13 2016, 13:35) Выше б...   Apr 13 2016, 10:43
|- - aaarrr   Цитата(scifi @ Apr 13 2016, 13:35) Выше б...   Apr 13 2016, 16:28
- - inventor   В догонку. все работает, загрузчик загружает, с од...   Apr 22 2016, 18:59
- - scifi   Цитата(inventor @ Apr 22 2016, 21:59) есл...   Apr 22 2016, 19:13


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 12:43
Рейтинг@Mail.ru


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