打印
[技术问答]

HC32F460 IAP远程升级跳转到APP后进中断异常

[复制链接]
1958|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(); 关过中断,好像还是不行的   

使用特权

评论回复
5
liangshuang95| | 2020-11-25 21:02 | 只看该作者
你先把串口外设关掉,然后看看能正常运行不?

使用特权

评论回复
6
lidi911| | 2020-11-26 07:21 | 只看该作者
楼主可以按照5楼的做法,先把外设关掉看能不能正常启动。这种情况一般还是程序问题。

使用特权

评论回复
7
martinhu| | 2020-11-26 08:50 | 只看该作者
boot里面如果使用了中断,那么在跳转之前,需要使用interrupt.c里面resign函数,释放掉这个中断,否则,在app里面再次中断的时候,就会异常。

使用特权

评论回复
8
Puremr| | 2020-11-26 08:57 | 只看该作者
可以参考楼上的这个说法,在跳转之前,需要使用interrupt.c里面resign函数,释放掉这个中断,否则,在app里面再次中断的时候,就会异常。

使用特权

评论回复
9
killy0492|  楼主 | 2020-12-24 16:03 | 只看该作者
martinhu 发表于 2020-11-26 08:50
boot里面如果使用了中断,那么在跳转之前,需要使用interrupt.c里面resign函数,释放掉这个中断,否则,在a ...

回复迟了,不好意思。果然是这个问题,在跳转前释放后都能正常跑起来了,多谢多谢!

使用特权

评论回复
10
lesheng002| | 2020-12-25 21:38 | 只看该作者
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("CPSID  I");
                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不能正常启动。

使用特权

评论回复
11
martinhu| | 2020-12-26 23:44 | 只看该作者
lesheng002 发表于 2020-12-25 21:38
请问HC32L176这个芯片要如何处理,我用串口进行更新升级,串口又用DMA传输,在重新启动APP前都关闭了, ...

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

使用特权

评论回复
12
csv7k1| | 2020-12-31 15:03 | 只看该作者
你要debug试试boot有没有成功跳转到app,
如果成功跳转到app了,那么是运行到哪里有问题,

为什么跳转了就出现问题了呀?

使用特权

评论回复
13
aoo| | 2020-12-31 17:20 | 只看该作者
千人QQ群:206032332

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

9

帖子

0

粉丝