目录
前言
用裸机开发的Fatfs+SD卡可以挂载成功,也能够读写,但是上FreeRTOS后,总是挂载失败,返回值是1,最后重新用CubeMx配置了一下,能够重新实现读写功能。我用的是STM32CubeMX 6.2.1,版本不同可能配置的参数有点不太一样,下面是我的详细配置。
一、CubeMx配置
1、时钟和SD等相关配置
2、FreeRTOS的配置
3、创建任务和队列
4、创建信号量
5、进行中断配置
二、生成代码,用keil打开工程文件,新建一个Sdinit.c和.h文件
1.Sdinit.c
#ifndef _SDINIT_H_
#define _SDINIT_H_
#include "stm32f4xx_hal.h"
//#include "cmsis_os.h"//void StartSDinitTask(void const * argument);
void FatFS_Mount1(void);
void FatFs_SD_Write(uint8_t* WriteBuffer,uint16_t bufferSize);
extern uint8_t Writedata[];extern uint8_t Writedata[];
extern uint16_t Writedata_len;
extern uint8_t RecetimeBuff[20];
extern uint8_t ReceADCBuff[90];
extern uint8_t Writedata1[];
extern uint16_t Mount_flag;
#endif
#include "SDinit.h" #include "stdio.h" #include "sdio.h" #include "fatfs.h" #include "usart.h" #include "public.h" uint8_t sdcard_status; FATFS fs; FIL file; FRESULT f_res; UINT fnum; BYTE ReadBuffer[128] = {0}; uint8_t Writedata[] = "123456ykun@??"; uint16_t Mount_flag=0; int a = 256; uint8_t Writedata1[]={1,2,3,4,5,6,0x10,0x11,0x12,0x13}; uint16_t Writedata_len = sizeof(Writedata); int ab1; extern int fputc(int ch, FILE *f); uint8_t RecetimeBuff[20]={0}; uint8_t ReceADCBuff[90]={0}; extern void RTCtime_Get(uint8_t* Recebuff); void FatFs_SD_Write(uint8_t* WriteBuffer,uint16_t bufferSize) { if(Mount_flag==1) { // f_res = f_open(&file, "0:CUBE.json", FA_WRITE | FA_READ); f_res = f_open(&file, "test22.txt", FA_WRITE | FA_READ |FA_OPEN_ALWAYS); if(f_res == FR_OK) { printf(" open file sucess!!! \r\n"); f_lseek (&file, f_size(&file)); RTCtime_Get(RecetimeBuff); f_res = f_write(&file, RecetimeBuff, sizeof(RecetimeBuff), &fnum); f_puts("\n",&file); f_res = f_write(&file, WriteBuffer, bufferSize, &fnum); f_puts("\r\n",&file); // f_lseek (&file, sizeof(WriteBuffer)); if(f_res == FR_OK) { printf(" write file sucess!!! file len = %d\n",fnum); printf(" write Data = %s\r\n", WriteBuffer); // printf("read sucess!!! (%d)\n", fnum); // printf("read Data : %s\r\n", ReadBuffer); } else { printf(" write file error : %d\r\n", f_res); // printf(" read error!!! %d\r\n", f_res); } f_lseek (&file, 0); HAL_Delay(50); f_res = f_read(&file, ReadBuffer, sizeof(ReadBuffer), &fnum); if(f_res == FR_OK) { // printf(" write file sucess!!! file len = %d\n", fnum); // printf(" write Data = %s\r\n", WriteBuffer); printf("read sucess!!! (%d)\n", fnum); printf("read Data : %s\r\n", ReadBuffer); } else { // printf(" write file error : %d\r\n", f_res); printf(" read error!!! %d\r\n", f_res); } f_close(&file); } else { printf(" open file error : %d\r\n", f_res); } } else { FatFS_Mount1(); } HAL_Delay(50); } void FatFS_Mount1() { retSD = f_mount(&SDFatFS, SDPath, 1); if(retSD) { printf("mount error : %d \r\n",retSD); } else { printf("mount sucess!!! \r\n"); // vTaskDelete(FatFS_MountHandle); Mount_flag=1; } HAL_Delay(500); }
2.在任务函数里面调用初始化,初始化完成后杀死任务
void StartSDinitTask(void const * argument){
for(;;)
{
if(NB_Flag==9){
// NB_SendString(NB_TEST_QMTPUB);
if(Mount_flag==1)
{
vTaskDelete(NULL);
}else{
FatFS_Mount1();
}
}else{
BC260Y_Init();
}
osDelay(500);
}
}
三、
用串口助手进行打印测试结果
总结
通过串口助手的打印测试,能够实现基于FreeRTOS的FatFs对SD卡读取数据操作。如果有什么问题欢迎留言。