一、首先我们要对串口进行重定向(在没有屏幕或者其他提示的情况下方便调试错误),注意在flash config里面勾选microlib。
int fputc(int ch,FILE *f){
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,1000);
return ch;
}
重定向过程中遇到如下问题:编译时出现error: #20: identifier “FILE” is undefined
解决方法:
1、在该函数的定义中添加#include "stdio.h"头文件
2、添加了头文件依旧报错,这时候其实和头文件没有关系了,我们要在FILE的使用之前定义
typedef struct __FILE FILE;
二、接下来要配置SDIO和FATFS
参考配置:FATFS SDIO配置方法
出现的问题:
1、SD卡HAL库初始化成功,能顾正确读取存储卡信息(可用容量与总容量),但是挂载不成功
(1)
res = f_mount(&fs_t, "0:", 1); /* 挂载SD卡 */
返回值为1,FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */
原因是因为分配的读取速度过快,修改方式 hsd.Init.ClockDiv = 9;要根据你的SDIO实际的总线频率来修改,和时钟树有关
void MX_SDIO_SD_Init(void)
{
/* USER CODE BEGIN SDIO_Init 0 */
/* USER CODE END SDIO_Init 0 */
/* USER CODE BEGIN SDIO_Init 1 */
/* USER CODE END SDIO_Init 1 */
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 = 9;
/* USER CODE BEGIN SDIO_Init 2 */
/* USER CODE END SDIO_Init 2 */
}
(2)返回值为3,FR_NOT_READY, /* (3) The physical drive cannot work */
原因是因为存储卡有热插拔检测,在你设置的热插拔检测IO口上,将它设置为输入,并且设置为下拉输入,可以免除没有检测连接的影响
(2)、代码如下&#