STM32G070-CubeMX HAL库-SPI接口SD卡使用

MCU  ·  2025-04-28

使用STM32CubeMX配置SPI-SD卡,并使用FATFS库;以下为使用STM32G070RB型号芯片;

1 准备

开发环境为STM32CubeMX 和Keil,因此需要先安装好这两个工具,并安装STM32G0对应的库组件;

2 CubeMX配置

打开STM32CubeMX,新建项目,MCU型号选择STM32G070RBTx;

2.1 时钟配置

在Clock Configuration中,选择HSI和PLLCLK,将系统时钟配置到64MHz;

2.2 配置调试和串口

在sys中选择serial wire,开启SWD模式仿真器接口;

将USART1打开,选择 Asynchronous Mode,并将PB6\PB7设置为USART1 RX和TX;

2.3 配置SPI

我们使用SPI1来连接SD卡,因此配置SPI1;

  • 打开SPI1,模式选择 Full Duplex Master;
  • 使用软件控制CS脚,因此 Hardware NSS 选择Disable;
  • Data Size 设置为8bit;
  • 时钟分频 Prescaler 选择256,之后会再次在代码中设置SPI速率;
  • 在pinout界面设置GPIOA 5\6\7 为SPI1引脚;
  • 将GPIOA4设置为输出,并设置一个标记为SD_CS;

    image-20250426142202331.png

2.4 配置Fatfs

切换到Middleware,选择FATFS后,Mode选择 user-defined;

2.5 生成工程

在ProjectManger中选择工程路径,然后选择toochain为MDK-ARM,然后生成Keil工程;

3 硬件连接

将SD卡模块与开发板按照如下引脚进行连接:

STM32G070开发板SD卡模块
3V33V3
GNDGND
PA4CS
PA5CLK
PA6MISO
PA7MOSI

4 编写用户程序

将生成的Keil工程打开,然后在FATFS下的Target目录添加SPI SD接口文件,并添加Keil的工程中:

image-20220917165751088.png

这个文件是SPI接口与SD卡底层实现;

  • 底层实现完成后,需要与SD卡的FATFS操作进行连接,直接在user_diskio.c 文件中调用 SPI diskio中的接口即可;
  • 编写测试程序:
 log_print("\n -------------- testing SD card -----------\n");
  
  HAL_Delay(1000); //some delay for sd card ready
  
  FATFS FatFs;     //Fatfs handle
  FIL fil;         //File handle
  FRESULT fres; //Result after operations

  //Mount fs
  fres = f_mount(&FatFs, "", 1); //1=mount now
  if (fres != FR_OK) {
    log_print("f_mount error (%i)\r\n", fres);
    while(1);
  }else{
    log_print("mound fs OK.\r\n");
  }

  //Write fs
  fres = f_open(&fil, "write.txt", FA_WRITE | FA_OPEN_ALWAYS | FA_CREATE_ALWAYS);
  if(fres == FR_OK) {
    log_print("Open/Create file OK.\r\n");
  } else {
    log_print("f_open error (%i)\r\n", fres);
  }

  //write text 
  char buff[] = "write testing for fs\r\n";
  UINT bytesWrote;
  fres = f_write(&fil, buff, sizeof(buff), &bytesWrote);
  if(fres == FR_OK) {
    log_print("write %i bytes OK.\r\n", bytesWrote);
  } else {
    log_print("f_write error (%i)\r\n");
  }

  //close fs
  f_close(&fil);
  log_print(" close the fs\r\n");

  //Unmound
  f_mount(NULL, "", 0);
  log_print(" unmount fs\r\n");
  • 烧写到开发板,连接好SD卡后测试:

image-20220917171530598.png

可以看到串口打印显示成功写入文件,把卡拔下后在电脑上可以看到写入的文件成功;

完整工程代码:

git: https://github.com/makerinchina-iot/spi_sdcard_stm32g0

gitee: https://gitee.com/makerinchina/spi_sdcard_stm32g0

 STM32SDCubeMXSdFat
评论
MonkeyPi. All Rights Reserved.

ICP粤ICP备19095914号-2