中级会员
 
- 积分
- 214
- 金钱
- 214
- 注册时间
- 2014-12-29
- 在线时间
- 36 小时
|
发表于 2017-1-10 22:25:20
|
显示全部楼层
本帖最后由 hhlh2l 于 2017-1-11 13:31 编辑
1, 假定app是从0x80002000开始的; MCU内存RAM是从0x20000000开始的;
2, 0x80002000这个位置装载的是MSP指针初始化的数据地址, 这个数据是指向MCU内存RAM区域;
3, 0x80002004这个位置装载的硬件复位中断函数的地址, 这个地址是指向MCU程序ROM区域;
4, 系统是从硬件复位中断函数开始运行的;
5, 理解一个函数指针 typedef void (*iapfun)(void);
//函数指针的用法
void fun_t(void); //定义一个函数
iapfun _iapfun; //定义一个函数指针变量
_iapfun = fun_t; //给函数指针变量赋值
_iapfun(); //这句的意思就是让CPU运行_iapfun所指向的函数, 这里这个函数fun_t
6, 要从bootloader跳转到app要进行两部操作:
1) 设置MSP指针;
2) 调用硬件中断函数;
7, 定义一个函数指针变量 iapfun jump2app; 假设appxaddr = 0x80002000;
8, if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000); //检查msp指针在不在可用内存范围,不在的话程序就跑飞了;
jump2app=(iapfun)*(vu32*)(appxaddr+4); //获取硬件中断函数的的地址;
MSR_MSP(*(vu32*)appxaddr); //设置MSP指针;
jump2app(); //运行中断函数;
9, 这样程序就自动跳转到app啦.
|
|