Сделал, но чего то не получается запустить основную программу
в чем может быть проблема?
утилитой 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.binCODE
;Reset_Handler
; LDR R0, =SystemInit
; BLX R0
LDR R0, =__iar_program_start
BX R0
В чем может быть еще засада?