打印
[国产单片机]

求助:boot跳转APP失败问题

[复制链接]
392|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liuzi511|  楼主 | 2024-11-25 14:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近用GD32F103芯片做了一个boot跳转APP的程序,发给客户的设备发现会有部分(1%)在运行几天或几个月后 ,重启设备boot无法跳转到APP,主程序服务启动起来。boot跳转代码参考的网上很多资料:
/*--------------------绝对地址跳转--------------------*/
void AppJump(INT32U entry_addr)
{
  if (((*(volatile INT32U*)entry_addr)& 0x2FFE0000LU)==0x20000000LU)/*STM32堆栈指针SP*/
  {
    CPU_PTR boot_entry_func;
    INT32U boot_jump_addr=*(__IO INT32U*)(entry_addr+4);
    INT8U i=0;
    boot_entry_func=(CPU_PTR)(boot_jump_addr);

    // 关闭所有外设中断
    __disable_irq();  //关闭总中断, 在 app 处必须开启

    //关闭滴答定时器,恢复到默认值
    SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;

    //设置所有时钟到默认状态,使用HSI时钟
    RCC_DeInit();

   //关闭所有中断,清除所有中断挂起状态
   for(i=0;i<8;i++)
   {
     NVIC->ICER[i]=0xFFFFFFFF;
     NVIC->ICPR[i]=0xFFFFFFFF;
   }
   
    NVIC_DisableIRQ(USART1_IRQn);

   // __set_PSP(*(volatile uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS);
    __set_MSP(*(__IO INT32U*)entry_addr);
    boot_entry_func();
  }
}
主程序运行后,开启中断,再进行初始化。
由于在公司很难复现,客户出现此问题,需要刷一个不同版本的主程序(即重新编译的)才可以恢复。
目前只是初步判断可能是主程序需要初始化中断向量表以后才能开启中断,不知大家是否有遇到过同样的问题,请各位大佬不吝赐教。

使用特权

评论回复

相关帖子

沙发
ayb_ice| | 2024-11-25 17:20 | 只看该作者
当然要初始化中断向量表以后才能开启中断

使用特权

评论回复
板凳
forgot| | 2024-11-26 08:18 | 只看该作者
APP的主程序进来之后是需要初始化中断向量表的啊,因为地址变了

使用特权

评论回复
地板
liuzi511|  楼主 | 2024-11-26 10:30 | 只看该作者
forgot 发表于 2024-11-26 08:18
APP的主程序进来之后是需要初始化中断向量表的啊,因为地址变了

APP主程序是有初始化中断向量表的,只不过之前是放在__enable_irq(); 之后,但我觉得在boot程序里已经关闭了所有中断,清除了所有中断挂起状态,这个先后顺序应该也没影响吧。

使用特权

评论回复
5
liuzi511|  楼主 | 2024-11-26 10:31 | 只看该作者
forgot 发表于 2024-11-26 08:18
APP的主程序进来之后是需要初始化中断向量表的啊,因为地址变了

在boot程序里已经关闭了所有中断,清除了所有中断挂起状态,即使先开启也不会产生中断吧?所以可能也并不是这个问题。

使用特权

评论回复
6
ayb_ice| | 2024-11-26 10:51 | 只看该作者
liuzi511 发表于 2024-11-26 10:31
在boot程序里已经关闭了所有中断,清除了所有中断挂起状态,即使先开启也不会产生中断吧?所以可能也并不 ...

boot关中断是必须的,APP进入后,有些外设肯定也要用中断,所以开总中断前必须配置好向量表,否则中断来了就会出错

使用特权

评论回复
7
xionghaoyun| | 2024-11-26 11:32 | 只看该作者
学习一下

使用特权

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

本版积分规则

5

主题

32

帖子

0

粉丝