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

MCU  ·  2025-04-27

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

1 准备

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

2 CubeMX配置

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

2.1 时钟配置

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

2.2 配置调试和串口

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

将USART2打开,选择 Asynchronous Mode,并将PA2/PA3设置为USART2 RX和TX;

2.3 配置SPI

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

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

    image-20250426153620049.png

2.4 配置Fatfs

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

2.5 生成工程

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

3 硬件连接

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

STM32G030开发板SD卡模块
3V33V3
GNDGND
PA5CS
PA0CLK
PB0MISO
PA4MOSI

4 编写用户程序

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

image-20250426173208353.png

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

  • 底层实现完成后,需要与SD卡的FATFS操作进行连接,直接在user_diskio.c 文件中调用 SPI diskio中的接口:

需要在 user_diskio.c 文件中 initialize、status、read、write、ioctrl 几个函数使用SPI接口进行操作;

  • 编写测试程序:
    printf("\n -------------- testing SD card -----------\n");

    HAL_Delay(1000); // some delay for sd card ready


    FRESULT fres; // Result after operations

    // Mount fs
    fres = f_mount(&FatFs, "", 1); // 1=mount now
    if (fres != FR_OK)
    {
        printf("f_mount error (%i)\r\n", fres);
        while (1)
            ;
    }
    else
    {
        printf("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)
    {
        printf("Open/Create file OK.\r\n");
    }
    else
    {
        printf("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)
    {
        printf("write %i bytes OK.\r\n", bytesWrote);
    }
    else
    {
        printf("f_write error (%i)\r\n",fres);
    }

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

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

    image-20250427203335405.png

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

完整工程代码:

飞书 Docs Link: https://ayje7x8zj1.feishu.cn/drive/folder/SSaNfII9xlC8MndCEsBcYQdun1c?from=from_copylink

评论
MonkeyPi. All Rights Reserved.

ICP粤ICP备19095914号-2