1.早期用cubemx配置的fatfs的代码总是没办法挂载fatfs文件系统,与我来说总共有两个原因:
第一个原因是cubemx中只能先配置四线的模式来初始化,但是四线太快了,需要自己写一个初始化函数来替代cubemx生成的MX_SDIO_SD_Init()函数
void MX_SDIO_SD_Initagain(void)
{
hsd.Instance = SDIO;
hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
hsd.Init.ClockDiv = 118;
if (HAL_SD_Init(&hsd) != HAL_OK)
{
Error_Handler();
}
HAL_Delay(500);
HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B);
}
这个代码是先用一线来初始化(SDIO_BUS_WIDE_1B),初始化完成后再改用四线(SDIO_BUS_WIDE_4B)
第二个原因就是使用的TF卡是从旧手机上拆下来的,需要格式化之后才可以搭载fatfs系统,这里的格式化是指用读卡器在电脑上格式化
2.第二个问题就是搭载上freertos和fatfs操作系统之后不能成功搭载fatfs系统,而卸掉freertos却可以搭载,说明问题出现在freertos上,原来是因为我给搭载fatfs的任务函数分配的栈空间太小了,我使用的是默认的128,修改成1024之后就可以正常搭载了,(但是我没有发现原因之前,没有把freertos操作系统卸掉,而是把他的在main.c文件里面的初始化代码和相关的代码都注释掉,这时候是没有使用freertos的,而是把搭载fatfs系统的代码放在主函数里面运行,也没办法搭载,可能是因为freertos同时把主函数的栈空间也压缩了,所以才失败)
3.第三个问题就是在解决完搭载系统之后调用读取SD卡根目录下的文件名并显示在lcd上无法显示,调试之后发现是在向sd卡中读取数据的时候超时了,但是在单独调用这个读取函数的时候却可以读取数据,说明不是硬件问题,后来翻阅资料,发现SDIO的中断要大于DMA的中断优先级

并且SDIO和DMA的优先级最好低于freertos的最大优先级,不然无法在freertos中正常使用,
但是更改之后还是无法正常显示。
最后终于在和AI的详细对答之后发现,在我上面说的读取SD卡根目录下的文件名并显示在lcd上的那个函数里面使用到了SDIO和DMA的中断,而我为了lcd显示函数更稳定一点就直接在这个函数上调用了taskENTER_CRITICAL和taskEXIT_CRITICAL,这两个函数构成了一个临界区,这个临界区内禁止中断,这样就妨碍了我获取信息的中断。
void cont_func(void *argument)
{
/* USER CODE BEGIN cont_func */
/* Infinite loop */
for(;;)
{
xTaskNotifyWait(0,0,NULL,portMAX_DELAY);
taskENTER_CRITICAL();
fatfs_GetDiskInfo();
taskEXIT_CRITICAL();
}
/* USER CODE END cont_func */
}

1万+

被折叠的 条评论
为什么被折叠?



