Свой бутлоадер код во флеш прописал.
для старта делаю следующее:
1. копирую 48 векторов прерывания основной программы в ОЗУ с адреса 0x10000000
2. Делаю ремап LPC_SYSCON->SYSMEMREMAP = 0x01; т.е. отобрашаем вектора из ОЗУ в начало адресного простанства
3. инициализирую SP и PC данными из первых 8-ми байт моей проги.
Все это выглядит так:
Код
__asm void boot_jump( uint32_t address )
{
LDR R1, [R0] ;Load new stack pointer address
MOV R13, R1
LDR R1, [R0, #4];Load new program counter address
BX R1
}
void run(unsigned long address)
{
unsigned long *dst, size;
const unsigned long *src;
// Copy vectors table
src = (unsigned long *)address;
dst = (unsigned long *)0x10000000;
size = VECTORS_TABLE_SIZE >> 2;
do { *dst++ = *src++; } while (--size);
LPC_SYSCON->SYSMEMREMAP = 0x01; /* remap to SRAM */
boot_jump(address);
}
{
LDR R1, [R0] ;Load new stack pointer address
MOV R13, R1
LDR R1, [R0, #4];Load new program counter address
BX R1
}
void run(unsigned long address)
{
unsigned long *dst, size;
const unsigned long *src;
// Copy vectors table
src = (unsigned long *)address;
dst = (unsigned long *)0x10000000;
size = VECTORS_TABLE_SIZE >> 2;
do { *dst++ = *src++; } while (--size);
LPC_SYSCON->SYSMEMREMAP = 0x01; /* remap to SRAM */
boot_jump(address);
}
В результате поведение непредсказуемое. то висит, то попадает куда-то в середину бутлоадера.
Если убрать ремап, то целевая прога запускается, но естественно с векторами из флеша.
Что я забываю в этой схеме?