HAL库的STM32单片机SDIO,FATFS读取SDmini卡

本文基于STM32H750核心,学习使用SDMMC1(SDIO)外设,用CubeMX创建HAL库工程,用SDIO读取TF卡,用FATFS文件系统读出里面的文件。

文末有工程链接。

一、CubeMX创建工程

这里跳过H750时钟的配置,主要是SDMMC1(SDIO)的配置和FATFS文件系统配置。因为CubeMX自带了FATFS,所以不需要去网上拷贝。

 

 

 

再配置一个串口,方便打印信息查看状态。

FAT需要选择一个检测SDIO插入的GPIO引脚,可以任意选择一个GPIO脚,然后在代码里把检测的代码注释掉,也可以不选择GPIO引脚,但是生成工程时会警告。

二、代码

在keil里选择Use microlib,然后做printf的重定向。

int fputc(int ch , FILE*f)
{
  HAL_UART_Transmit(&huart1 , (uint8_t *)&ch , 1 , 0xffff);
  return ch;
}

1.f_mount挂载

FRESULT f_mount (

    FATFS* fs,          /* Pointer to the file system object (NULL:unmount)*/

    const TCHAR* path,  /* Logical drive number to be mounted/unmounted */

    BYTE opt            /* Mode option 0:Do not mount (delayed mount), 1:Mount immediately */

)

@fs:文件系统指针

@path:挂载路径

@ opt:操作,0-卸载  1-挂载

2.f_open()打开文件

FRESULT f_open (
	FIL* fp,			/* Pointer to the blank file object */
	const TCHAR* path,	/* Pointer to the file name */
	BYTE mode			/* Access mode and file open mode flags */
)

@fp:文件指针

@path:文件路径

@mode:方式

#define	FA_READ				0x01
#define	FA_WRITE			0x02
#define	FA_OPEN_EXISTING	0x00
#define	FA_CREATE_NEW		0x04
#define	FA_CREATE_ALWAYS	0x08
#define	FA_OPEN_ALWAYS		0x10
#define	FA_OPEN_APPEND		0x30

3.f_read()和f_write()

FRESULT f_write (
	FIL* fp,			/* Pointer to the file object */
	const void* buff,	/* Pointer to the data to be written */
	UINT btw,			/* Number of bytes to write */
	UINT* bw			/* Pointer to number of bytes written */
)

@fp:文件指针

@buff:写入的字节

@btw:要写入的长度(这个是我们需要写入的长度)

@bw:写入了的长度(这里会返回一个它实际写入的长度,通过比较这两个长度可以知道写入是否成功)

FRESULT f_read (
	FIL* fp, 	/* Pointer to the file object */
	void* buff,	/* Pointer to data buffer */
	UINT btr,	/* Number of bytes to read */
	UINT* br	/* Pointer to number of bytes read */
)

@btr:要读出的字节长度

@br:实际读出的字节长度

三、测试

//在全局变量中定义:
FRESULT f_res;      /* 操作结果 */
FATFS   fs;         /* FAT句柄 */
FIL     file;       /* 文件句柄 */
uint16_t bw;        /* 写入字节长度 */

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SDMMC1_SD_Init();
  MX_USART1_UART_Init();
  MX_FATFS_Init();
  /* USER CODE BEGIN 2 */
  printf("初始化成功\n");
  f_res = f_mount(&fs , "0:" , 1);    //0:不挂载  1:挂载
  if(f_res != FR_OK)
  {
    printf("挂载失败\n");
  }

  f_res = f_open(&file , "0:test.txt" , FA_OPEN_ALWAYS|FA_WRITE); //如果文件存在则打开,如果文件不存在则创建并打开
  if(f_res != FR_OK)
  {
    printf("打开文件失败\n");
  }

  f_res = f_write(&file , "test hello world" , 16 , &bw);
  if(f_res != FR_OK)
  {
    printf("写入失败\n");
  }

  f_res = f_close(&file);
  if(f_res != FR_OK)
  {
    printf("关闭文件失败\n");
  }

  f_res = f_mount(&fs , "0:" , 0);    //0:不挂载  1:挂载
  if(f_res != FR_OK)
  {
    printf("卸载失败\n");
  }
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

 从读卡器中可以读出,测试成功。

注意:文件指针、系统指针要放在全局变量,不要放在main函数里,不然跑不起,没搞明报什么原因。

测试工程下载:提取码:ebo7

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32 HAL库是ST公司为其STM32系列微控制器提供的一套硬件抽象层库,它提供了简化的API和驱动程序,方便开发人员在不同的硬件平台之间进行移植。STM32 HAL库可以帮助开发人员快速地配置和控制STM32微控制器的不同外设和模块,包括GPIO、SPI、UART、I2C、定时器、中断等。通过使用HAL库,开发人员可以更加专注于应用程序开发,而无需深入理解底层硬件细节。 FATFS是一个开源的用于嵌入式系统的文件系统,它是适用于FAT12、FAT16和FAT32文件系统的一个小型、高效的实现。在STM32 HAL库中,FATFS被集成了进来,提供了用于在STM32微控制器上访问SD或其他外部存储器的功能。通过FATFS库,可以在STM32微控制器上进行文件的读写操作,包括创建、打开、关闭、读取和写入文件等。 使用STM32 HAL库FATFS模块,开发人员可以轻松地将SD或其他外部存储器与STM32微控制器进行连接,并进行文件的读写操作。首先,需要在代码中初始化FATFS模块,并指定SD或外部存储器的物理连接方式和文件系统类型。然后,可以使用FATFS提供的API函数,例如f_open、f_read、f_write等,来进行文件的操作。开发人员可以通过这些API函数来创建文件、读取文件内容、写入文件内容等。最后,在不需要使用文件系统时,需要调用相应的API函数来释放资源和关闭文件系统。 总之,STM32 HAL库中的FATFS模块为开发人员在嵌入式系统中使用STM32微控制器与外部存储器交互提供了便利,简化了开发过程,提高了开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天师电通电容爆破工程师

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值