然後JumpAddress = *(__IO uint32_t*) (high+4);中為什麼要在跳轉的地址上+4呢?
+4是因為最開始的4個字節是用來記錄堆棧地址的,而隨後的4個字節才是PC指針
因為CM3不同於ARM7等
並不是從入口地址開始指行第一條指令
而是從地址為0x00取出MSP的初始值
再從地址0×04取出PC的初始值
然後從PC處開始執行第一條指令
PC = 0x20000000;
有誤,因為CM3不同於ARM7等
並不是從入口地址開始指行第一條指令
而是從地址0x00取出MSP的初始值
再從地址0x04取出PC的初始值
然後從PC處開始執行第一條指令
所以應該是:
SP = _RDWORD(RAM地地址);
PC = _RDWORD(RAM地地址+0x04);
示例:(STM32 lib3.0.3 Examples)
FUNC void Setup (void)
SP = _RDWORD(0x20000000) ; // Setup Stack Pointer
PC = _RDWORD(0x20000004); // Setup Program Counter
_WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register非必要
}
沒有留言:
張貼留言