HC32F460 IAP远程升级跳转到APP后进中断异常
跳转前的关中断 关功能引脚都做了,跳转到APP后能正常运行,但只要进中断就会异常死机。 中断向量偏移照着STM32类似那样做的,还是不行。搞了快一周了 ,头大啊D:/1.png SCB->VTOR = 0 | (0x20000 & (uint32_t)0x1FFFFF80);ClkInit();
//SCB->VTOR = 0 | 0x10000;
__enable_irq();
USART_init();
LED_init(); 跳转APP之前关中断没? huquanz711 发表于 2020-11-25 18:52
跳转APP之前关中断没?
IAP内就只使用了一个串口中断用于接收APP二级制的文件,跳转前使用__disable_irq(); 关过中断,好像还是不行的 你先把串口外设关掉,然后看看能正常运行不? 楼主可以按照5楼的做法,先把外设关掉看能不能正常启动。这种情况一般还是程序问题。 boot里面如果使用了中断,那么在跳转之前,需要使用interrupt.c里面resign函数,释放掉这个中断,否则,在app里面再次中断的时候,就会异常。 可以参考楼上的这个说法,在跳转之前,需要使用interrupt.c里面resign函数,释放掉这个中断,否则,在app里面再次中断的时候,就会异常。
martinhu 发表于 2020-11-26 08:50
boot里面如果使用了中断,那么在跳转之前,需要使用interrupt.c里面resign函数,释放掉这个中断,否则,在a ...
回复迟了,不好意思。果然是这个问题,在跳转前释放后都能正常跑起来了,多谢多谢! martinhu 发表于 2020-11-26 08:50
boot里面如果使用了中断,那么在跳转之前,需要使用interrupt.c里面resign函数,释放掉这个中断,否则,在a ...
void net_reset_stme32f_mcu(void)
{
__set_PRIMASK(1);
if(((*(vu32*)(APP_START_ADDR+4))&FLASH_ADDR_MASK)==FLASH_START_ADDR)//判断是否为0X00XXXXXX.
{
if(((*(vu32*)APP_START_ADDR)& MCU_RAM_ADDR_MASK)==MCU_RAM_START_ADDR) //检查栈顶地址是否合法.
{
__ASM("CPSIDI");
Dma_DisableChannel(USART_DMA_TX_CHAN);
Dma_Disable();
Uart_DisableIrq(MY_USART,UartRxIrq); ///<使能串口接收中断
EnableNvic(MY_USART_IRQ, IrqLevel3, FALSE); ///<系统中断使能
jump2app=(iapfun)*(vu32*)(APP_START_ADDR+4); //用户代码区第二个字为程序开始地址(复位地址)
MSR_MSP(*(vu32*)APP_START_ADDR); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
__set_MSP(*(vu32*)(APP_START_ADDR));
jump2app(); //跳转到APP.
}
}
}
请问HC32L176这个芯片要如何处理,我用串口进行更新升级,串口又用DMA传输,在重新启动APP前都关闭了,但APP不能正常启动。 lesheng002 发表于 2020-12-25 21:38
请问HC32L176这个芯片要如何处理,我用串口进行更新升级,串口又用DMA传输,在重新启动APP前都关闭了, ...
F460之所以要做中断resign的释放操作,是因为他的中断向量和中断请求是自由映射的,而176不存在这样的功能。
你要debug试试boot有没有成功跳转到app,
如果成功跳转到app了,那么是运行到哪里有问题,
如果不能正常跳转,是运行到哪一步?
还要,app里面的中断向量表做偏移了吗? 你要debug试试boot有没有成功跳转到app,
如果成功跳转到app了,那么是运行到哪里有问题,
为什么跳转了就出现问题了呀? 千人QQ群:206032332
页:
[1]