项目背景
项目基于STM32L471微控制器,最初采用uC/OS-III操作系统,后迁移至手动移植的FreeRTOS(非CubeMX生成版本)。在系统配置中,HAL库的时基源设为TIM7,而FreeRTOS继续使用SysTick作为其时钟源。
初始问题:非DMA模式下的稳定性问题
在初始实现中,SD卡驱动未启用DMA功能(CubeMX中FATFS的"Use DMA template"选项设为禁用)。此时发现以下现象:
-
即使将SDMMC时钟配置为7分频或8分频,在执行
f_stat()
或文件读写操作时仍会偶尔返回FR_DISK_ERR
错误 -
当尝试使用低于4分频的配置时,SD卡完全无法正常工作
DMA模式引入后的新问题
为解决上述的稳定性问题,我启用了DMA传输模式,但随后遇到了更复杂的问题:
-
初始实现方案:
-
SD卡挂载函数放置在main函数的while循环上方
-
紧随其后创建系统所需的FreeRTOS任务并启动调度器
-
在此配置下,程序会在挂载函数的
SD_read
函数中的等待循环中卡死:while((ReadStatus == 0) && ((HAL_GetTick() - timeout) < SD_TIMEOUT))
{
}
-
-
问题现象:
-
HAL_IncTick()
位于定时器回调函数中,但HAL_GetTick()
始终返回0 -
TIM7计数器寄存器显示正常递增,系统却未能进入
TIM7_IRQHandler
中断服务程序
-
解决方案与发现
通过调整程序初始化流程,找到了可行的解决方案:
-
在main函数中不立即挂载SD卡,仅创建一个启动任务
-
在启动任务中执行SD卡挂载操作,挂载成功后再创建其他系统任务
如此,程序便一切正常了。。。
有大佬知道其中原因吗?