STM32F103RCT6挂载FATS文件系统读写SD卡CUBE生成代码
1. 配置系统时钟
2.配置SDIO接口
这里一定要记住配置号分频系数,36M时钟/36=1M,即为SD读写工作频率。频率建议不要太大,否则一些低速的SD卡可能无法兼容。
SD卡速度分类如下图。可以看出速度差别很大,低速的才2MB每秒。为了良好兼容,建议设置分频系数使工作频率为2M以下。
启用DMA,配置好中断优先级。
配置好GPIO。选择4线模式后,除了检测是否有卡的引脚,其他CUBE会自动配置好。
3.配置FATFS,选SD卡
自己选一个引脚作为卡检测引脚,在GPIO设置里配置为输入状态。
4. 项目管理界面下设置编译器、堆栈大小和生成文件方式
stack size可以大一点,只要不超过总内存即可。
这里最好勾选为每个外设生成单独的c文件和h文件。避免代码都混在一个main文件里,否则以后修改移植等都很不方便。最后点击生成代码即可。
5.生成代码后,如果硬件上实际没有用到SD卡检测引脚,要在代码里做屏蔽处理。
/**
* @brief Detects if SD card is correctly plugged in the memory slot or not.
* @param None
* @retval Returns if SD is detected or not
*/
__weak uint8_t BSP_SD_IsDetected(void)
{
__IO uint8_t status = SD_PRESENT;
// if (BSP_PlatformIsDetected() == 0x0)
// {
// status = SD_NOT_PRESENT;
// }
return status;
}
6. 最后添加一个测试函数
FATFS fs; //工作空间
FIL fil; // 文件项目
uint32_t file_byte = 0; //文件大小(字节数)
uint32_t byteswritten = 0; // 写文件计数
uint32_t bytesread = 0; // 读文件计数
uint8_t wtext[] = "我就是那张SD卡,4G那张!!"; // 写的内容
uint8_t rtext[1024]; // 读取的buff,1024bytes
char filename[] = "log.txt"; // 文件名
extern uint8_t retSD; /* Return value for SD */
void TFcard_test(void)
{
printf("\r\n ****** 文件系统 ******\r\n\r\n");
/*-1- 挂载文件系统*/
retSD = f_mount(&fs, "", 0);
// retSD = f_mount(&fs, "0:", 1);
if(retSD)
{
printf(" mount error : %d \r\n",retSD);
Error_Handler();
}
else
printf(" mount sucess!!! \r\n");
/*-2-创建新的文件并写入数据*/
retSD = f_open(&fil, filename, FA_CREATE_ALWAYS | FA_WRITE); //打开文件,权限包括创建、写(如果没有该文件,会创建该文件)
if(retSD) //返回值不为0(出现问题)
printf(" open file error : %d\r\n",retSD); //打印问题代码
else
printf(" open file sucess!!! \r\n");
/*-3- 在txt文件中写入数据*/
// for(uint32_t i=0;i<7000;i++)
{
retSD = f_write(&fil, wtext, sizeof(wtext), (void *)&byteswritten); //在文件内写入wtext内的内容
// printf(" this is %d bytes\r\n",i);
}
if(retSD) //返回值不为0(出现问题)
printf(" write file error : %d\r\n",retSD); //打印问题代码
else
{
printf(" write file sucess!!! \r\n");
printf(" write Data : %s\r\n",wtext); //打印写入的内容
}
/*-4- 关闭txt文件*/
retSD = f_close(&fil); //关闭该文件
if(retSD) //返回值不为0(出现问题)
printf(" close error : %d\r\n",retSD); //打印问题代码
else
printf(" close sucess!!! \r\n");
/*-5- 打开文件读取数据*/
retSD = f_open(&fil, filename, FA_READ); //打开文件,权限为只读
if(retSD) //返回值不为0(出现问题)
printf(" open file error : %d\r\n",retSD); //打印问题代码
else
printf(" open file sucess!!! \r\n");
/*-6- 读取txt文件数据*/
retSD = f_read(&fil, rtext, sizeof(rtext), (UINT*)&bytesread); //读取文件内容放到rtext中
if(retSD) //返回值不为0(出现问题)
printf(" read error!!! %d\r\n",retSD); //打印问题代码
else
{
printf(" read sucess!!! \r\n");
printf(" read Data : %s\r\n",rtext); //打印读取到的数据
}
/*-7- 关闭文件*/
retSD = f_close(&fil); //关闭该文件
if(retSD) //返回值不为0(出现问题)
printf(" close error!!! %d\r\n",retSD); //打印问题代码
else
printf(" close sucess!!! \r\n");
/*##-8- 读写一致性检测 ############*/
if(bytesread == byteswritten) //如果读写位数一致
{
printf(" FatFs is working well!!!\r\n"); //打印文件系统工作正常
}
}
完成以上后,编译下载运行测试即可。