使用STM32CUBEMX建的工程,BOOT和APP都是用了FREERTOS,然后跳转到APP是正常的,但是死在MX_FREERTOS_Init();
求指点啊,之前做过CAN的IAP,运行正常,现在弄串口结果不行了。。。
我在MX_FREERTOS_Init();里面加了串口打印,函数下面也加了,发现里面需要打印的数据都是输出正常的,但是到函数下面就不行了。
MX_FREERTOS_Init();//这个函数体里面的最后加了一句串口打印,打印是正常的。。
printf("ADECU_APP_2,0x%X\r\n",SCB->VTOR);//这句一直打印不出来。
/* Start scheduler */
osKernelStart();
其中BOOT跳转前把中断也都关了
APP相比没做IAP之前,就增加了2项:(没做IAP之前程序运行正常)
1)MAIN开头的中断向量偏移
int main(void)
{
/* USER CODE BEGIN 1 */
SCB->VTOR = FLASH_BASE | 0x80000;//设置偏移量
2)option for target里把IROM1的起始地址改为了0x8080000,start改为了0x40000
而BOOT跳转函数如下:
void iap_load_app(uint32_t appxaddr)// 调用时参数为0x08080000
{
if((((vu32)appxaddr)&0x2FF00000)==0x20000000) { //检查栈顶地址是否合法.
HAL_RCC_DeInit();
INTX_DISABLE();
SysTick->CTRL = 0X00;//卡死后新增的,但是没有用,跟上面应该是功能重复的
SysTick->LOAD = 0;//卡死后新增的,但是没有用,跟上面应该是功能重复的
SysTick->VAL = 0;//卡死后新增的,但是没有用,跟上面应该是功能重复的
__disable_irq();//卡死后新增的,但是没有用,跟上面应该是功能重复的
jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app(); //跳转到APP.
}
}
更多回帖