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

基于stm32的usb,sdio,fatfs系统读卡器工程,经过bootloader挂在后,跳转初始化就卡死的情况。

[复制链接]
张先生183995652 提问时间:2021-8-12 10:30 / 未解决
本人调试工程中,想实现bootloader中读取sd卡是否有升级固件完成iap升级。逻辑如下:
开机进入bootloader→挂载fatfs系统读取sd卡中是否有升级固件→读卡器的App。
工程用stm32cubemx生成,问题现象如下:
1,直接运行App本身,即usb读卡器任务,是能够读取到sd卡,并且在电脑上进行读写操作的。
2,从bootloader跳转到App后,不开启usb设备的初始化,程序也是正常。
3,跳转后开启usb初始化,程序并没有马上卡死。过了大概1-3s后,程序卡死,触发看门狗复位。
4,经过深度的查询后,我发现在跳转app中,只要不执行 f_mount(&fs,(TCHAR const*)SDPath,1);这一条挂载sd卡命令,在后续的App中并不会卡死。
5,在跳转前,我执行了f_mount(NULL,(TCHAR const*)SDPath,1); 和FATFS_UnLinkDriver(SDPath);即取消挂载和注销。


  1.     if(retSD == 0)
  2.   {
  3.             //在SD卡挂载文件系统,文件系统挂载时会对SD卡初始化
  4.             f_res = f_mount(&fs,(TCHAR const*)SDPath,1);        
  5.             //读取是否有升级文件
  6.             f_res = f_open(&file, "Jarvis Updata.bin", FA_OPEN_EXISTING | FA_READ);
  7.             if(f_res == FR_OK)
  8.             {
  9.                     printf("打开升级文件成功\r\n");
  10.                     f_res = f_read(&file, ReadBuffer, sizeof(ReadBuffer), &fnum);
  11.                     if(f_res==FR_OK)
  12.                     {
  13.                                                         //这里写升级
  14.                             HAL_Delay(5000);
  15.                     }
  16.                     else
  17.                     {
  18.                             printf("升级文件读取失败 错误代码(%d)\r\n",f_res);
  19.                             delete_updata_sign = 1;        //文件错误删除升级固件
  20.                     }        
  21.             }
  22.             else
  23.             {
  24.                     printf("未检测到升级文件\r\n");
  25.                     jump_app_sign = 1;        //跳转app标志位
  26.             }
  27.             memset(ReadBuffer,NULL,sizeof(ReadBuffer));
  28.             f_close(&file);            
  29.             if(delete_updata_sign == 1)        //如果要删除升级文件
  30.             {
  31.                     f_res = f_unlink("Jarvis Updata.bin");
  32.                     if(f_res==FR_OK)
  33.                     {
  34.                             printf("删除升级文件成功,进入跳转\r\n");
  35.                             jump_app_sign = 1;                //跳转app标志位               
  36.                     }
  37.             }
  38.             /* 不再使用,取消挂载 */
  39.             f_res = f_mount(NULL,(TCHAR const*)SDPath,1);   
  40.             /* 注销一个FatFS设备:SD卡 */
  41.             FATFS_UnLinkDriver(SDPath);
  42.     }
  43.     if(jump_app_sign == 1)
  44.     {   
  45.             HAL_RCC_DeInit();
  46.             HAL_RTC_MspDeInit(&hrtc);
  47.             HAL_UART_MspDeInit(&huart1);
  48.             HAL_SD_MspDeInit(&hsd);
  49.             HAL_NVIC_DisableIRQ(DMA2_Stream3_IRQn);
  50.             HAL_NVIC_DisableIRQ(DMA2_Stream5_IRQn);
  51.             HAL_NVIC_DisableIRQ(DMA2_Stream6_IRQn);
  52.             HAL_TIM_Base_MspDeInit(&htim3);
  53.             HAL_TIM_Base_MspDeInit(&htim5);
  54.             HAL_TIM_Base_MspDeInit(&htim6);
  55.             HAL_TIM_Base_MspDeInit(&htim7);
  56.                         appxaddr = 0x08010000;
  57.             jump2app=(iapfun)*(uint32_t*)(appxaddr+4);            
  58.                 __set_MSP(*(uint32_t*)appxaddr);   
  59.                 SCB->VTOR=appxaddr;   
  60.                 __disable_irq();
  61.                 jump2app();
  62.     }
复制代码


微信截图_20210812102010.png
收藏 评论0 发布时间:2021-8-12 10:30

举报

0个回答

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版