OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6727|回复: 5

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

[复制链接]

1

主题

13

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2019-12-4
在线时间
8 小时
发表于 2021-8-16 16:42:49 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 qq183995652 于 2021-8-16 16:45 编辑

本人调试工程中,想实现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);即取消挂载和注销。
bootloader跳转的程序我贴下方:
  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
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2019-12-4
在线时间
8 小时
 楼主| 发表于 2021-8-17 10:17:24 | 显示全部楼层
图片是App程序,cubemx初始化模板生成的。

如果程序不进行跳转,直接运行App是能够正常运行并读出卡的,但是只要在bootloader中挂载过,哪怕之后跳转取消了,依然跳转后会卡死在,图片中 MX_USB_DEVICE_Init();执行后,1-3s内。其中sdio用的是DMA,不知道各位有没有遇到过类似的问题,如有雷同问题,还请指导。
回复

使用道具 举报

2

主题

592

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1458
金钱
1458
注册时间
2019-7-28
在线时间
137 小时
发表于 2021-8-17 10:38:17 | 显示全部楼层
建议排查下你的.s启动文件
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2019-12-4
在线时间
8 小时
 楼主| 发表于 2021-8-17 10:49:07 | 显示全部楼层
lpwithv 发表于 2021-8-17 10:38
建议排查下你的.s启动文件

启动文件的堆栈大小我已经确认过了,不然Fatfs系统应该是挂不上的。
我现在最大的问题是,只要在其他程序段运行过挂载sd卡的函数f_mount操作,之后就没法用usb挂载大容量设备的操作了。没有调用f_mount直接用usb是好的。
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2019-12-4
在线时间
8 小时
 楼主| 发表于 2021-8-19 09:01:34 | 显示全部楼层
自己顶上去求助!!!
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2019-12-4
在线时间
8 小时
 楼主| 发表于 2021-8-23 08:37:04 | 显示全部楼层

自己顶上去求助!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 02:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表