STM32
直播中

敷衍作笑谈

10年用户 1023经验值
擅长:制造/封装 连接器 光电显示 接口/总线/驱动 RF/无线
私信 关注
[问答]

STM32F429 U盘IAP升级程序跳转APP异常的原因?

最近使用STM32F429的USB_OTG_FS做了一个BOOTLOADER可通过USB(PA11,PA12)读取U盘中的文件或者UART二选一更新APP。UART升级一切正常,唯有USB升级有个小问题:升级过程都一切顺利,但是到了要跳转到APP时芯片先是背光驱动IO无输出或输出低电平(其它IO状态未知,怀疑和背光驱动IO相似)等了几秒后芯片复位,复位后也能正常进入APP。但就是复位之前那段时间要等好几秒不明白是什么原因。如果是HardFault异常中断,我的看门狗没有使能,芯片没理由复位啊?这个问题无法仿真,因为一旦芯片复位仿真器就与芯片失去同步了。我通过将代码一段一段注释排除发现:如将"USBH_Process( USB_OTG_Core,  USB_Host);"函数及所在的循环注释就不会发生复位问题跳转APP正常,求高人解惑。
U盘升级函数:

  • /*
  • *********************************************************************************************************
  • *        Function Name : Programing_From_Flie
  • *        Function Detail : Programing The Chip From a Flie
  • *        Paramater : None
  • *        Return Value : None
  • *********************************************************************************************************
  • */
  • void Programing_From_Flie(void)
  • {
  •         static uint8_t page_buffer[4096];

  •         #if defined BK180H
  •         const char object_path[]="0:BK180H.bin";
  •         #elif defined BK300H
  •         const char object_path[]="0:BK300H.bin";
  •         #elif defined U180
  •         const char object_path[]="0:U180.bin";
  •         #endif
  •         PrintMessage("Udisk Connected!");
  •         SysTick_Init();
  •         do
  •         {
  •                 USBH_Process( USB_OTG_Core,  USB_Host);
  •         }
  •         while (count_ms<8000    (USB_Host.gState!=HOST_CLASS || USBH_MSC_BOTXferParam.MSCState!=0x05));
  •         SysTick->CTRL=0x00; //Stop Counter
  •         char string_buf[24]="Scanning for ";
  •         for (u8 i=13;i<24;i++)string_buf=object_path[i-11];
  •         PrintMessage(string_buf);
  •         result = f_mount( fs,"0:",1);        /* Mount a logical drive */
  •         if (result != FR_OK)
  •         {
  •                 PrintMessage("Mounting Failed!");
  •                 return;
  •         }
  •         result = f_open( file, object_path, FA_OPEN_EXISTING | FA_READ);
  •         if(result == FR_OK)
  •         {
  •                 if (file.fsize==0 || file.fsize>0x1F8000)
  •                 {
  •                         PrintMessage("File Size Error!");
  •                         goto close_file_exit;
  •                 }
  •                 if (FLASH_If_GetWriteProtectionStatus() == 0)
  •                 {
  •                         /* Disable the write protection */
  •                         if (FLASH_If_DisableWriteProtection()==1)
  •                         {
  •                                 PrintMessage("Write Protection disabled!");
  •                         }
  •                         else
  •                         {
  •                                 PrintMessage("Error: Flash write unprotection failed!");
  •                                 goto close_file_exit;
  •                         }
  •                 }

  •                 PrintMessage("Chip Erassing");
  •                 FLASH_If_Erase(APPLICATION_ADDRESS,file.fsize);
  •                 PrintMessage("Chip Programming");

  •                 uint32_t flashdestination = APPLICATION_ADDRESS;
  •                 uint32_t packets_max = file.fsize/4096+(file.fsize%4096==0?0:1);

  •                 for (uint32_t packets_readed=0;packets_readedCTRL=0x00; //Stop Counter
  • //跳转APP代码
  •                 /* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
  •                 if (((*(__IO uint32_t*)APPLICATION_ADDRESS)   0x2FFE0000 ) == 0x20000000)
  •                 {
  •                         __asm("CPSID  I");__asm("CPSID  F");
  •                         USBH_DeInit( USB_OTG_Core, USB_Host);
  •                         /* Jump to user application */
  •                         JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
  •                         Jump_To_Application = (pFunction) JumpAddress;
  •                         /* Initialize user application's Stack Pointer */
  •                         __set_PSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
  •                         __set_CONTROL(0);
  •                         __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
  •                         Jump_To_Application();
  •                         //APP跳转代码结束
  •                 }
  •         }
  •         else
  •         {
  •                 PrintMessage("Error File Opening!");
  •         }
  •         close_file_exit:
  •         f_close( file);
  • }

另外说明下,APP中未用到USB功能并且我在跳转前也关闭了中断的,不知为何还是会发生异常。

回帖(2)

李勇俊

2024-4-19 15:19:53
建议将工程上传才方便排查原因,只需要最少但是必须的功能代码,只包含USB升级功能的代码,这样看代码看不出问题。也可能是应用程序地址分配问题。 
举报

张伟

2024-4-19 15:50:41
升级过程中出现异常的原因可能有很多,请检查以下几点:

1. 跳转到APP时,可能是因为中断向量表没有正确设置导致。请确保正确设置了中断向量表的地址。

2. 可能是由于跳转时未正确关闭或初始化某些外设引起的。请确保在跳转之前,关闭或初始化所有需要的外设。

3. 如果跳转到APP时芯片先是背光驱动IO无输出或输出低电平,可能是由于IO引脚配置或电平设置不正确导致。请检查相关代码,确保正确配置了背光驱动IO的引脚和电平。

4. 芯片复位前等待几秒钟的时间可能是由于某些操作需要时间完成,或者是在跳转之前需要等待某些条件满足。请仔细检查代码,确定是否有等待条件或操作未完成。

5. 如果通过将代码一段一段注释掉来调试,但无法定位问题所在,可能是因为问题发生在代码被跳转到APP之前的硬件操作中。请仔细检查代码中的硬件操作,确保正确配置和操作硬件。

6. 如果无法在仿真器下调试问题,可以尝试使用printf或者串口调试工具输出一些调试信息或错误码,以帮助定位问题所在。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分