你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

U盘IAP升级程序跳转APP异常

[复制链接]
歹徒兄弟 提问时间:2019-5-15 18:32 /
最近使用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盘升级函数:
  1. /*
  2. *********************************************************************************************************
  3. *        Function Name : Programing_From_Flie
  4. *        Function Detail : Programing The Chip From a Flie
  5. *        Paramater : None
  6. *        Return Value : None
  7. *********************************************************************************************************
  8. */
  9. void Programing_From_Flie(void)
  10. {
  11.         static uint8_t page_buffer[4096];

  12.         #if defined BK180H
  13.         const char object_path[]="0:BK180H.bin";
  14.         #elif defined BK300H
  15.         const char object_path[]="0:BK300H.bin";
  16.         #elif defined U180
  17.         const char object_path[]="0:U180.bin";
  18.         #endif
  19.         PrintMessage("Udisk Connected!");
  20.         SysTick_Init();
  21.         do
  22.         {
  23.                 USBH_Process(&USB_OTG_Core, &USB_Host);
  24.         }
  25.         while (count_ms<8000 && (USB_Host.gState!=HOST_CLASS || USBH_MSC_BOTXferParam.MSCState!=0x05));
  26.         SysTick->CTRL=0x00; //Stop Counter
  27.         char string_buf[24]="Scanning for ";
  28.         for (u8 i=13;i<24;i++)string_buf=object_path[i-11];
  29.         PrintMessage(string_buf);
  30.         result = f_mount(&fs,"0:",1);        /* Mount a logical drive */
  31.         if (result != FR_OK)
  32.         {
  33.                 PrintMessage("Mounting Failed!");
  34.                 return;
  35.         }
  36.         result = f_open(&file, object_path, FA_OPEN_EXISTING | FA_READ);
  37.         if(result == FR_OK)
  38.         {
  39.                 if (file.fsize==0 || file.fsize>0x1F8000)
  40.                 {
  41.                         PrintMessage("File Size Error!");
  42.                         goto close_file_exit;
  43.                 }
  44.                 if (FLASH_If_GetWriteProtectionStatus() == 0)   
  45.                 {
  46.                         /* Disable the write protection */
  47.                         if (FLASH_If_DisableWriteProtection()==1)
  48.                         {
  49.                                 PrintMessage("Write Protection disabled!");
  50.                         }
  51.                         else
  52.                         {
  53.                                 PrintMessage("Error: Flash write unprotection failed!");
  54.                                 goto close_file_exit;
  55.                         }
  56.                 }
  57.                
  58.                 PrintMessage("Chip Erassing");
  59.                 FLASH_If_Erase(APPLICATION_ADDRESS,file.fsize);
  60.                 PrintMessage("Chip Programming");
  61.                
  62.                 uint32_t flashdestination = APPLICATION_ADDRESS;
  63.                 uint32_t packets_max = file.fsize/4096+(file.fsize%4096==0?0:1);

  64.                 for (uint32_t packets_readed=0;packets_readed<packets_max;packets_readed++)
  65.                 {
  66.                         result = f_read(&file, page_buffer, sizeof(page_buffer), &fnum);
  67.                         if(result==FR_OK)
  68.                         {
  69.                                 /* Write received data in Flash */
  70.                                 if (FLASH_If_Write(&flashdestination, (uint32_t *) page_buffer, (fnum+3)/4)  == 0)
  71.                                 {
  72.                                         ShowProgressPercent((packets_readed+1)*100/packets_max);
  73.                                 }
  74.                                 else /* An error occurred while writing to Flash memory */
  75.                                 {
  76.                                         /* End session */
  77.                                         PrintMessage("An error occurred while writing to Flash memory");
  78.                                         PrintMessage("End session");
  79.                                         goto close_file_exit;
  80.                                 }
  81.                         }
  82.                         else
  83.                         {
  84.                                 PrintMessage("Error File Reading!");
  85.                                 goto close_file_exit;
  86.                         }
  87.                 }
  88.                 f_close(&file);
  89.                 PrintMessage("Going to the new APP within   Seconds...");
  90.                 SysTick_Init();
  91.                 for (uint8_t i=5;i!=0;i--)
  92.                 {
  93.                         count_ms = 0;
  94.                         LCD_Show8x16sym(272-lcd_x*16,(lcd_y[lcd_x]-12)*8,i+'0',WHITE,BLACK);
  95.                         while (count_ms<1000);
  96.                 }
  97.                 SysTick->CTRL=0x00; //Stop Counter
  98. //跳转APP代码
  99.                 /* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
  100.                 if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
  101.                 {
  102.                         __asm("CPSID  I");__asm("CPSID  F");
  103.                         USBH_DeInit(&USB_OTG_Core,&USB_Host);
  104.                         /* Jump to user application */
  105.                         JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
  106.                         Jump_To_Application = (pFunction) JumpAddress;
  107.                         /* Initialize user application's Stack Pointer */
  108.                         __set_PSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
  109.                         __set_CONTROL(0);
  110.                         __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
  111.                         Jump_To_Application();
  112.                         //APP跳转代码结束
  113.                 }
  114.         }
  115.         else
  116.         {
  117.                 PrintMessage("Error File Opening!");
  118.         }
  119.         close_file_exit:
  120.         f_close(&file);        
  121. }
复制代码

另外说明下,APP中未用到USB功能并且我在跳转前也关闭了中断的,不知为何还是会发生异常。
收藏 评论5 发布时间:2019-5-15 18:32

举报

5个回答
luscu 回答时间:2019-5-16 10:12:50
建议将工程上传才方便排查原因,只需要最少但是必须的功能代码,只包含USB升级功能的代码,这样看代码看不出问题。也可能是应用程序地址分配问题。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

歹徒兄弟 回答时间:2019-5-16 10:44:27
luscu 发表于 2019-5-16 10:12
建议将工程上传才方便排查原因,只需要最少但是必须的功能代码,只包含USB升级功能的代码,这样看代码看不 ...

感谢兄台的热情回复,好巧不巧就在几分钟前我刚把问题解决了,办法就是在跳转APP前把USB的外设时钟关闭:RCC_AHB2PeriphClockCmd( RCC_AHB2Periph_OTG_FS, DISABLE) ;就不会有跳转异常的问题发生了。我怀疑原因可能是USB中断在BOOTLOADER中打开之后,跳至APP时并没有使用USB功能因此没有设置USB中断入口从而导致中断溢出,保险起见以后在跳转APP前应将所有使能的外设全部关闭。
废鱼 回答时间:2019-5-16 11:25:33
楼主,应用程序中是否有使用USB?如果没有使用,不应该只关闭时钟,同时也要讲USBd进行einit一下,关闭USB的中断功能。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

歹徒兄弟 回答时间:2019-5-16 15:00:44
安 发表于 2019-5-16 11:25
楼主,应用程序中是否有使用USB?如果没有使用,不应该只关闭时钟,同时也要讲USBd进行einit一下,关闭USB ...

我看了一下例程里面的USBH_DeInit函数,里面并没有禁用中断这个操作,在发现关闭时钟这个办法之前我其实也试过跳转前调用USBH_DeInit函数,然并卵。我感觉只要断了USB的时钟量她有通天的本事也不能再兴风作浪了。所以也就懒得去改USBH_DeInit函数了。
huangyanga 回答时间:2019-6-11 10:31:33
shipeng1989 发表于 2019-5-16 15:00
我看了一下例程里面的USBH_DeInit函数,里面并没有禁用中断这个操作,在发现关闭时钟这个办法之前我其实 ...

原来时钟关了后,她还真的有通天的本事!

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版