STM32F103RCT6挂载FATFS文件系统读写SD卡CUBE生成代码

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");						//打印文件系统工作正常
    }
}

完成以上后,编译下载运行测试即可。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydgd118

您的鼓励是我最大的动力!谢赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值