STM32 boot跳轉(zhuǎn)到APP的Jump_Address()分析
1、函數(shù)原型:
void Jump_Address(void)
{
if (((*(volatile u32*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
{
test = (*(volatile u32*)ApplicationAddress);
JumpAddress = *(volatile u32*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;
__set_MSP(*(volatile u32*) ApplicationAddress);
Jump_To_Application();
}
}
2、if (((*(volatile u32*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)分析:
ApplicationAddress存放的是用戶程序Flash的首地址,(*(volatile u32*)ApplicationAddress)的意思是取用戶程序首地址里面的數(shù)據(jù),這個數(shù)據(jù)就是用戶代碼的堆棧地址,堆棧地址指向RAM,而RAM的起始地址是0x20000000,因此上面的判斷語句執(zhí)行:判斷用戶代碼的堆棧地址是否落在:0x20000000~0x2001ffff區(qū)間中,這個區(qū)間的大小為128K,筆者查閱STM32各型號的RAM大小,目前RAM最大的容量可以做到192K+4K,時鐘頻率為168MHZ。一般情況下,我們使用的芯片較多的落在<128K RAM的區(qū)間,因此上面的判斷語句是沒有太大問題的。
3、經(jīng)過2的分析,test保存的就是堆棧地址(并且是應(yīng)用程序堆棧的棧頂?shù)刂罚?,查看STM32的向量表,可以知道:棧頂?shù)刂返牡刂?+ 4 存放的是復(fù)位地址,因此JumpAddress存放的是復(fù)位地址。
4、調(diào)用__set_MSP函數(shù)后,將把用戶代碼的棧頂?shù)刂吩O(shè)為棧頂指針
5、Jump_To_Application();的意思就是設(shè)置PC指針為復(fù)位地址。
CORTEX-M3上電后后檢測BOOT引腳的電平來決定PC的位置。例:BOOT設(shè)置為FLASH啟動,啟動后CPU會先取兩個地址:一個是棧頂?shù)刂?,另一個是復(fù)位地址。因此才有了第4、第5點的寫法。