新手上路
- 积分
- 25
- 金钱
- 25
- 注册时间
- 2016-7-11
- 在线时间
- 5 小时
|
1金钱
Hi,
我用STM32103系列进行IAP试验,参考开发板的例程对跳转到APP程序的过程进行了改写:
例程:
在MAIN.C中:
printf("开始执行FLASH用户代码!!\r\n");
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
}....
在iap.c中:
void iap_load_app(u32 appxaddr)
{
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
{
jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app(); //跳转到APP.
}
}
现在我直接改写成:
void APP_jump2UserApp(void) {
UINT32 stackConn;
if(((*(vu32*)(USERAPP_FLASH_ADDR+4))&0xFF000000)==0x08000000) //判断是否为0X08XXXXXX.
{
//测试用
APP_PCUARTSendByte(0xD1);
stackConn = (*(vu32*)FLASH_BASE_ADDR);
APP_PCUARTSendInt(stackConn);
stackConn = (*(vu32*)USERAPP_FLASH_ADDR);
APP_PCUARTSendInt(stackConn);
stackConn = STMFLASH_ReadWord(USERAPP_FLASH_ADDR);
APP_PCUARTSendInt(stackConn);
// if(((*(vu32*)USERAPP_FLASH_ADDR)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
{
APP_PCUARTSendByte(0xD2);
stackConn &=0x2001FFFF;
APP_PCUARTSendInt(stackConn);
jump2app=(pFunVV)*(vu32*)(USERAPP_FLASH_ADDR+4); //用户代码区第二个字为程序开始地址(复位地址)
MSR_MSP(*(vu32*)USERAPP_FLASH_ADDR); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app(); //跳转到APP.
}
}
}
运行这个函数后,串口输出的函数(APP_PCUARTSendInt/Byte)的结果是:
D1
20 00 12 88
28 00 12 88 20 00 12 88 D2 20 00 12 88
可以看到 stackConn = (*(vu32*)USERAPP_FLASH_ADDR);
APP_PCUARTSendInt(stackConn); //输出的是28 00 12 88
stackConn = STMFLASH_ReadWord(USERAPP_FLASH_ADDR);
APP_PCUARTSendInt(stackConn); // //输出的是20 00 12 88
这两个不方式相同地址输出的内容是不一样。请问有谁知道是因为什么原因吗?
|
|