最近搞stm32l433ccu6,移植了原子的IAP,但是发现无法大多时候无法跳转到APP(偶尔能跳转到APP),求解啊。 //跳转到应用程序段 //appxaddr:用户代码起始地址. void iap_load_app(u32 appxaddr) { INTX_DISABLE(); jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址) __set_MSP(*(__IO uint32_t*)appxaddr); // MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址) jump2app(); //跳转到APP } 复制代码
2.参考STM32CUBE示例程序,你相信ST官方还是小作坊?
2、跳转之后要重新设置堆栈
3、跳转之前要关闭中断,同时要检查栈顶地址是否合法
评分
查看全部评分
怎么关全局中断?我用的HAL库
我重新设置了中断向量表的SCB->VTOR = FLASH_BASE | 0x10000;
跳转了,app没运行
__asm void INTX_DISABLE()
{
CPSID I
BX LR
}
//开启所有中断
__asm void INTX_ENABLE(void)
{
CPSIE I
BX LR
}
这样开关中断对不对?
编译出的固件(比如bin文件)没下载对。
对于IAP程序是从flash的第0扇区开始的位置,即是FLASH_BASE;对于APP程序,则需要修改为FLASH_BASE+0x10000。
如果使用MDK-ARM的话配置非常简单,每次配置完成后rebuild再下载或调试。或者添加item区分。
IAP项目时,配置start为flash起始地址,大小为合适的大小(我的大小是0x8000):
APP项目时,配置配置start为flash合适的起始地址(我的是0x800C000),大小为合适的大小(我的大小是0xF4000):
评分
查看全部评分
我设置好了的
1.是否跳转成功
2.是否是因为应用程序产生中断而产生的重启
对于1问题加个打印看看是否跳进去,另外程序写进的格式是否正确,对于问题2如果由于应用程序中断产生重启,要改你代码的中断向量表位置,如图所示