STM32F407+FreeRTOS+Fatfs+SD卡读写

目录

前言

一、CubeMx配置

二、生成代码,用keil打开工程文件,新建一个Sdinit.c和.h文件

1.Sdinit.c

2.在任务函数里面调用初始化,初始化完成后杀死任务

三、用串口助手进行打印测试结果

总结

前言

用裸机开发的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卡读取数据操作。如果有什么问题欢迎留言。

STM32F407是一款32位ARM Cortex-M4内核的微控制器,拥有丰富的周边设备和高性能。FreeRTOS是一款用于嵌入式系统的实时操作系统,提供了任务调度、内存管理、定时器等功能,使得开发者能够创建复杂的多任务应用程序。TCP客户端是指在TCP/IP协议栈的应用层,通过TCP协议与服务器进行通信的客户端程序。 将STM32F407FreeRTOS和TCP客户端结合起来,可以创建一个具有实时性能的TCP客户端应用。首先,我们需要将FreeRTOS移植到STM32F407上,这可以通过使用STM32CubeMX和FreeRTOS内核文件进行配置和生成来实现。接下来,我们需要编写TCP客户端代码,使用TCP/IP协议栈的相关API进行连接服务器、发送和接收数据等操作。在编写TCP客户端代码时,我们需要创建一个或多个任务,用于处理与服务器的TCP连接和数据通信。这些任务可以使用FreeRTOS提供的任务调度器进行管理和调度。 在使用STM32F407FreeRTOS和TCP客户端时,还需要注意一些重要的方面。首先,需要根据应用需求进行系统资源的合理配置,包括内存大小、任务优先级等。其次,需要注意任务之间的同步和通信,以避免竞争条件和数据一致性的问题。还需要考虑网络连接的稳定性,处理网络异常和错误情况的方法。最后,还需要进行性能测试和调优,以确保系统在给定约束条件下的稳定工作。 综上所述,将STM32F407FreeRTOS和TCP客户端结合起来,可以实现一个具有实时性能的嵌入式TCP客户端应用程序。这种应用可以广泛应用于物联网、智能家居、远程监测等领域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值