STM32boot跳转到APP的Jump_Address()分析_摘录
标签:
itstm32 |
分类: 资料收藏 |
Jump2App函数代码
#define
__IO
volatile
#define ApplicationAddress
0x8003000
pFunction Jump_To_Application;
uint32_t JumpAddress;
typedef void
(*pFunction)(void);
__ASM void __set_MSP(uint32_t mainStackPointer)
{
}
void Jump2App(void)
{
}
————————————————
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);
}
}
2、 if
(((*(volatileu32*)ApplicationAddress) & 0x2FFE0000 )
==0x20000000)分析:
ApplicationAddress存放的是用户程序Flash的首地址,(*(volatileu32*)ApplicationAddress)的意思是取用户程序首地址里面的数据,这个数据就是用户代码的堆栈地址,堆栈地址指向RAM,而RAM的起始地址是0x20000000,因此上面的判断语句执行:判断用户代码的堆栈地址是否落在:0x20000000~0x2001ffff区间中,这个区间的大小为128K,笔者查阅STM32各型号的RAM大小,目前RAM最大的容量可以做到192K+4K,时钟频率为168MHZ。一般情况下,我们使用的芯片较多的落在<128KRAM的区间,因此上面的判断语句是没有太大问题的。
3、经过2的分析,test保存的就是堆栈地址(并且是应用程序堆栈的栈顶地址),查看STM32的向量表,可以知道:栈顶地址的地址 +
4存放的是复位向量地址,因此JumpAddress存放的是复位向量地址的内容。
4、调用__set_MSP函数后,将把用户代码的栈顶地址设为栈顶指针
5、 Jump_To_Application();的意思就是设置PC指针为复位地址。
CORTEX-M3上电后后检测BOOT引脚的电平来决定PC的位置。例:BOOT设置为FLASH启动,启动后CPU会先取两个地址:一个是栈顶地址,另一个是复位地址。因此才有了第4、第5点的写法。
后一篇:SPIFlash介绍

加载中…