使用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卡模块 |
---|---|
3V3 | 3V3 |
GND | GND |
PA4 | CS |
PA5 | CLK |
PA6 | MISO |
PA7 | MOSI |
4 编写用户程序
将生成的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卡后测试:
可以看到串口打印显示成功写入文件,把卡拔下后在电脑上可以看到写入的文件成功;
完整工程代码:
评论