MonkeyPi - STM32
type: channel
link: https://monkeypi.cn/index.php/tag/STM32/
items: STM32G070-CubeMX HAL库-SPI接口SD卡使用
items: STM32G070开发笔记-Platformio+libopencm3-SPI接口SD卡使用
items: STM32G030-Platformio+libopencm3-SPI接口SD卡使用

STM32G070-CubeMX HAL库-SPI接口SD卡使用
type: item
date: 2025-04-28T13:02:00+00:00
description: 使用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_stm32g…

STM32G070开发笔记-Platformio+libopencm3-SPI接口SD卡使用
type: item
date: 2025-04-26T03:09:00+00:00
description: 使用Platformio平台的libopencm3开发框架来开发STM32G0，下面介绍SD卡模块的使用方法。1 新建项目在PIO主页新建项目spi_sdcard，框架选择libopencm3，开发板选择 MonkeyPi_STM32_G070RB；新建完成后在src目录新建主程序文件main.c；然后更改项目文件platformio.ini的烧写和调试方式：upload_protocol = cmsis-dap debug_tool = cmsis-dap2 编写程序2.1 加入FATFS库从网站fatfs http://elm-chan.org/fsw/ff/00index_e.html 下载最新的源码；工程目录lib下新建fatfs文件夹；然后将fatfs源码的source目录下所有文件放置到工程的lib\fatfs目录下;将diskio.c文件移动到src目录下，这个文件是需要我们实现的底层接口；2.2 实现SPI接口的SD读写在src目录下新建spi_sd.h 和 spi_sd.c 文件，现在目录结构如下：spi_sd.h 头文件/** * @file spi_sd.h * @author MakerInChina (makerinchina.cn) * @brief * @version 0.01 * @date 2022-09-18 * * @copyright Copyright (c) 2022 * */ #ifndef _SPI_SD_HEAD_H_ #define _SPI_SD_HEAD_H_ #include <stdint.h> /** * @brief init sd card * */ uint8_t spi_sd_init(); /** * @brief spi read sd * * @param buff * @param sector */ uint8_t spi_sd_read(uint8_t *buff, uint32_t sector); /** * @brief spi write sd * * @param buff * @param sector */ uint8_t spi_sd_write(uint8_t *buff, uint32_t sector); #endif //!_SPI_SD_HEAD_H_spi_sd.c 实现/** * @file spi_sd.c * @author MakerInChina (makerinchina.cn) * @brief * @version 0.01 * @date 2022-09-18 * * @copyright Copyright (c) 2022 * */ #include "spi_sd.h" #include <libopencm3/stm32/spi.h> #include <libopencm3/stm32/gpio.h> #define SDSPI SPI1 #define SD_CS GPIO4 #define SD_PORT GPIOA #define spi_cs_deselect() gpio_set(SD_PORT, SD_CS) #define spi_cs_select() gpio_clear(SD_PORT, SD_CS) /* Definitions for MMC/SDC command */ #define CMD0 (0x40+0) /* GO_IDLE_STATE */ #define CMD1 (0x40+1) /* SEND_OP_COND (MMC) */ #define ACMD41 (0xC0+41) /* SEND_OP_COND (SDC) */ #define CMD8 (0x40+8) /* SEND_IF_COND */ #define CMD9 (0x40+9) /* SEND_CSD */ #define CMD10 (0x40+10) /* SEND_CID */ #define CMD12 (0x40+12) /* STOP_TRANSMISSION */ #define ACMD13 (0xC0+13) /* SD_STATUS (SDC) */ #define CMD16 (0x40+16) /* SET_BLOCKLEN */ #define CMD17 (0x40+17) /* READ_SINGLE_BLOCK */ #define CMD18 (0x40+18) /* READ_MULTIPLE_BLOCK */ #define CMD23 (0x40+23) /* SET_BLOCK_COUNT (MMC) */ #define ACMD2…

STM32G030-Platformio+libopencm3-SPI接口SD卡使用
type: item
date: 2025-04-26T03:03:00+00:00
description: 使用Platformio平台的libopencm3开发框架来开发STM32G030，下面介绍SD卡模块的使用方法。1 新建项目从仓库 MonkeyPi-STM32G030-PIO_Libopencm3_example/template_libopencm3 at main · makerinchina-iot/MonkeyPi-STM32G030-PIO_Libopencm3_example 下载一个模版；更改名字为spisdcard，然后使用VSCode打开该文件夹；然后更改项目文件platformio.ini的烧写和调试方式，可以选择DAPLink或者串口下载：;;;; //use swd upload_protocol=cmsis-dap ;;;; //use custom uart isp ; upload_protocol = custom ; upload_port = COM22 ; upload_flags = ; -f ; G0 ; upload_command = $PYTHONEXE -m stm32loader -p $UPLOAD_PORT -e -w -v -s $UPLOADERFLAGS $BUILD_DIR/${PROGNAME}.bin 2 编写程序2.1 加入FATFS库从网站fatfs http://elm-chan.org/fsw/ff/00index_e.html 下载最新的源码；工程目录lib下新建fatfs文件夹；然后将fatfs源码的source目录下所有文件放置到工程的lib\fatfs目录下;将diskio.c文件移动到src目录下，这个文件是需要我们实现的底层接口；2.2 实现SPI接口的SD读写在src目录下新建spi_sd.h 和 spi_sd.c 文件，现在目录结构如下：spi_sd.h 头文件/** * @file spi_sd.h * @author MakerInChina (makerinchina.cn) * @brief * @version 0.01 * @date 2022-09-18 * * @copyright Copyright (c) 2022 * */ #ifndef _SPI_SD_HEAD_H_ #define _SPI_SD_HEAD_H_ #include <stdint.h> /** * @brief init sd card * */ uint8_t spi_sd_init(); /** * @brief spi read sd * * @param buff * @param sector */ uint8_t spi_sd_read(uint8_t *buff, uint32_t sector); /** * @brief spi write sd * * @param buff * @param sector */ uint8_t spi_sd_write(uint8_t *buff, uint32_t sector); #endif //!_SPI_SD_HEAD_H_spi_sd.c 实现/** * @file spi_sd.c * @author MakerInChina (makerinchina.cn) * @brief * @version 0.01 * @date 2022-09-18 * * @copyright Copyright (c) 2022 * */ #include "spi_sd.h" #include <libopencm3/stm32/spi.h> #include <libopencm3/stm32/gpio.h> #define SDSPI SPI2 #define SD_CS GPIO5 #define SD_PORT GPIOA #define spi_cs_deselect() gpio_set(SD_PORT, SD_CS) #define spi_cs_select() gpio_clear(SD_PORT, SD_CS) /* Definitions for MMC/SDC command */ #define CMD0 (0x40+0) /* GO_IDLE_STATE */ #define CMD1 (0x40+1) /* SEND_OP_COND (MMC) */ #define ACMD41 (0xC0+41) /* SEND_OP_COND (SDC) */ #define CMD8 (0x40+8) /* SEND_IF_COND */ #define CMD9 (0x40+9) /* SEND_CSD */ #define CMD10 (0x40+10) /*…