Решил попробовать на f0-дисковери (контроллер stm32f051). Открыл руководство по бутлодеру:
Цитата
3 Kbytes starting from address
0x1FFFEC00, contain the bootloader
firmware.
0x1FFFEC00, contain the bootloader
firmware.
Сдампил содержимое:
Код
7806 0020 35ee ff1f edec ff1f edec ff1f
00f0 02f8 00f0 40f8 0ca0 30c8 0838 2418
2d18 a246 671e ab46 5446 5d46 ac42 01d1
00f0 32f8 7e46 0f3e 0fcc ...
00f0 02f8 00f0 40f8 0ca0 30c8 0838 2418
2d18 a246 671e ab46 5446 5d46 ac42 01d1
00f0 32f8 7e46 0f3e 0fcc ...
Здорово, первая чиселка 0х20000678 похожа на адрес из рамы, очевидно - указатель куда надо стек поместить. А дальше, с адреса 0x1FFFEC00 + 4 (как раз куда этот чел с видео прыгает) - мура какая-то (0х1FFFEE35), подозреваю, что это некая таблица с адресами. На видео - тоже самое. Дизассемблер видит в этом месте инструкцию arm режима: " mrc 15, 1, r1, cr5, cr15, {7} " - в доках что-то про сопроцессор (какой нафиг сопроцессор?). Вообшем я сделал вывод, что по адресу System Memory + 4 инструкции нету и, тогда вопрос, зачем туда переходить?
Ну ладно, думаю, почему не попробовать:
Код
void __early_init(void)
{
uint32_t *key = ( uint32_t * ) SRAM_BASE;
void ( *BootLoader )( void ) = ( void ( * )( void ) ) 0x1FFFEC04;
if( *key == 0xDEADC0DE )
{
*key = 0;
__set_PRIMASK( 1 );
__set_MSP( 0x20000678 );
__set_CONTROL( 0 );
BootLoader();
}
stm32_clock_init();
}
{
uint32_t *key = ( uint32_t * ) SRAM_BASE;
void ( *BootLoader )( void ) = ( void ( * )( void ) ) 0x1FFFEC04;
if( *key == 0xDEADC0DE )
{
*key = 0;
__set_PRIMASK( 1 );
__set_MSP( 0x20000678 );
__set_CONTROL( 0 );
BootLoader();
}
stm32_clock_init();
}
Как и предполагалось - переход по адресу 1FFFEC04 и на этой самой инструкции mrc - провал в хард фолт.