历史上的今天
今天是:2024年08月22日(星期四)
2018年08月22日 | STM32 boot之APP的Jump_Address()分析
2018-08-22 来源:eefocus
1,函数原型:
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)的意思是取用户程序首地址里面的数据,这个数据就是用户代码的堆栈地址,堆栈地址指向RAM,而RAM的起始地址是0x20000000,因此上面的判断语句执行:判断用户代码的堆栈地址是否落在:0x20000000~0x2001ffff区间中,这个区间的大小为128K,笔者查阅STM32各型号的RAM大小,目前RAM最大的容量可以做到192K+4K,时钟频率为168MHZ。一般情况下,我们使用的芯片较多的落在<128K RAM的区间,因此上面的判断语句是没有太大问题的。
3,
经过2的分析,test保存的就是堆栈地址(并且是应用程序堆栈的栈顶地址),查看STM32的向量表,可以知道:栈顶地址的地址 + 4 存放的是复位地址,因此JumpAddress存放的是复位地址。
4,
调用__set_MSP函数后,将把用户代码的栈顶地址设为栈顶指针
5,
Jump_To_Application();的意思就是设置PC指针为复位地址。
CORTEX-M3上电后后检测BOOT引脚的电平来决定PC的位置。例:BOOT设置为FLASH启动,启动后CPU会先取两个地址:一个是栈顶地址,另一个是复位地址。因此才有了第4、第5点的写法。
史海拾趣
|
#include #include //寄存器宏定义 #define WRITE_SECOND 0x80 #define WRITE_MINUTE 0x82 #define WRITE_HOUR &n ...… 查看全部问答> |
|
以前的帖子,重新整理到这个版面。 OSAL通过一个16位宽度的数组来管理事件,意味着OSAL最多可以支持16个事件,其中最高位(0x08000,SYS_EVENT_MSG)系统保留,用户可以使用的事件有15个。事件的使用很简单:1)需要找个地方定义事件的ID ...… 查看全部问答> |
|
求助各位高手: CFB的电流噪声分为同相端的和反相端的,VFB只给出一种电流噪声。那么在VFB噪声计算中,电流噪声只在同相端或反相端添加还是两端都添加,只不过值是相同的?十分感谢! [ 本帖最后由 mazzz 于 2011-11-17 23:36 编辑 ]… 查看全部问答> |




