使用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；2.4 配置Fatfs切换到Middleware，选择FATFS后，Mode选择 user-defined；2.5 生成工程在ProjectManger中选择工程路径，然后选择toochain为MDK-ARM，然后生成Keil工程；3 硬件连接将SD卡模块与开发板按照如下引脚进行连接：STM32G070开发板SD卡模块3V33V3GNDGNDPA4CSPA5CLKPA6MISOPA7MOSI4 编写用户程序将生成的Keil工程打开，然后在FATFS下的Target目录添加SPI SD接口文件，并添加Keil的工程中：这个文件是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卡后测试：可以看到串口打印显示成功写入文件，把卡拔下后在电脑上可以看到写入的文件成功；完整工程代码：git: https://github.com/makerinchina-iot/spi_sdcard_stm32g0gitee: https://gitee.com/makerinchina/spi_sdcard_stm32g0
使用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；2.4 配置Fatfs切换到Middleware，选择FATFS后，Mode选择 user-defined；2.5 生成工程在ProjectManger中选择工程路径，然后选择toochain为MDK-ARM，然后生成Keil工程；3 硬件连接将SD卡模块与开发板按照如下引脚进行连接：STM32G030开发板SD卡模块3V33V3GNDGNDPA5CSPA0CLKPB0MISOPA4MOSI4 编写用户程序将生成的Keil工程打开，然后在FATFS下的Target目录添加SPI SD接口文件 user_diskio_spi.h .c ，并添加Keil的工程中：这个文件是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卡后测试：可以看到串口打印显示成功写入文件，把卡拔下后在电脑上可以看到写入的文件成功；完整工程代码：飞书 Docs Link: https://ayje7x8zj1.feishu.cn/drive/folder/SSaNfII9xlC8MndCEsBcYQdun1c?from=from_copylink