[技术问答] HC32F460 IAP远程升级跳转到APP后进中断异常

[复制链接]
3103|12
 楼主| killy0492 发表于 2020-11-24 21:19 | 显示全部楼层 |阅读模式
跳转前的关中断   关功能引脚都做了,  跳转到APP后能正常运行,但只要进中断就会异常死机。 中断向量偏移照着STM32类似那样做的,还是不行。搞了快一周了 ,头大啊  D:/1.png
 楼主| killy0492 发表于 2020-11-24 21:20 | 显示全部楼层
          SCB->VTOR = 0 | (0x20000 & (uint32_t)0x1FFFFF80);          
    ClkInit();
          //SCB->VTOR = 0 | 0x10000;
          __enable_irq();
    USART_init();
                LED_init();
huquanz711 发表于 2020-11-25 18:52 来自手机 | 显示全部楼层
跳转APP之前关中断没?
 楼主| killy0492 发表于 2020-11-25 19:19 | 显示全部楼层
huquanz711 发表于 2020-11-25 18:52
跳转APP之前关中断没?

IAP内就只使用了一个串口中断用于接收APP二级制的文件,跳转前使用  __disable_irq(); 关过中断,好像还是不行的   
liangshuang95 发表于 2020-11-25 21:02 来自手机 | 显示全部楼层
你先把串口外设关掉,然后看看能正常运行不?
lidi911 发表于 2020-11-26 07:21 来自手机 | 显示全部楼层
楼主可以按照5楼的做法,先把外设关掉看能不能正常启动。这种情况一般还是程序问题。
martinhu 发表于 2020-11-26 08:50 | 显示全部楼层
boot里面如果使用了中断,那么在跳转之前,需要使用interrupt.c里面resign函数,释放掉这个中断,否则,在app里面再次中断的时候,就会异常。
Puremr 发表于 2020-11-26 08:57 | 显示全部楼层
可以参考楼上的这个说法,在跳转之前,需要使用interrupt.c里面resign函数,释放掉这个中断,否则,在app里面再次中断的时候,就会异常。
 楼主| killy0492 发表于 2020-12-24 16:03 | 显示全部楼层
martinhu 发表于 2020-11-26 08:50
boot里面如果使用了中断,那么在跳转之前,需要使用interrupt.c里面resign函数,释放掉这个中断,否则,在a ...

回复迟了,不好意思。果然是这个问题,在跳转前释放后都能正常跑起来了,多谢多谢!
lesheng002 发表于 2020-12-25 21:38 | 显示全部楼层
martinhu 发表于 2020-11-26 08:50
boot里面如果使用了中断,那么在跳转之前,需要使用interrupt.c里面resign函数,释放掉这个中断,否则,在a ...

  1. void                net_reset_stme32f_mcu(void)
  2. {
  3.     __set_PRIMASK(1);
  4.         if(((*(vu32*)(APP_START_ADDR+4))&FLASH_ADDR_MASK)==FLASH_START_ADDR)//判断是否为0X00XXXXXX.
  5.         {         
  6.                 if(((*(vu32*)APP_START_ADDR)& MCU_RAM_ADDR_MASK)==MCU_RAM_START_ADDR)        //检查栈顶地址是否合法.
  7.                 {
  8.             __ASM("CPSID  I");
  9.                 Dma_DisableChannel(USART_DMA_TX_CHAN);
  10.                         Dma_Disable();
  11.             Uart_DisableIrq(MY_USART,UartRxIrq);             ///<使能串口接收中断
  12.             EnableNvic(MY_USART_IRQ, IrqLevel3, FALSE);       ///<系统中断使能
  13.             
  14.                         jump2app=(iapfun)*(vu32*)(APP_START_ADDR+4);                //用户代码区第二个字为程序开始地址(复位地址)               
  15.                         MSR_MSP(*(vu32*)APP_START_ADDR);                                        //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
  16.             __set_MSP(*(vu32*)(APP_START_ADDR));
  17.                         jump2app();                                                                        //跳转到APP.
  18.                 }
  19.         }
  20. }


请问HC32L176这个芯片要如何处理,我用串口进行更新升级,串口又用DMA传输,在重新启动APP前都关闭了,但APP不能正常启动。
martinhu 发表于 2020-12-26 23:44 | 显示全部楼层
lesheng002 发表于 2020-12-25 21:38
请问HC32L176这个芯片要如何处理,我用串口进行更新升级,串口又用DMA传输,在重新启动APP前都关闭了, ...

F460之所以要做中断resign的释放操作,是因为他的中断向量和中断请求是自由映射的,而176不存在这样的功能。
你要debug试试boot有没有成功跳转到app,
如果成功跳转到app了,那么是运行到哪里有问题,
如果不能正常跳转,是运行到哪一步?
还要,app里面的中断向量表做偏移了吗?
csv7k1 发表于 2020-12-31 15:03 | 显示全部楼层
你要debug试试boot有没有成功跳转到app,
如果成功跳转到app了,那么是运行到哪里有问题,

为什么跳转了就出现问题了呀?
aoo 发表于 2020-12-31 17:20 | 显示全部楼层
千人QQ群:206032332
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

9

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部