普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 4658|回复: 4

[已解决] 【普中】基于STM32F103文件系统--读取TF卡内文本并存储至SPI-FLASH

[复制链接]

27

主题

337

帖子

3294

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3294
发表于 2021-1-5 13:47:48 | 显示全部楼层 |阅读模式
有些朋友在学习STM32文件系统时,通常不知道如何使用文件系统读取SD卡文件,这里我们给出一个分享案列,基于STM32F103文件系统--读取TF卡内文本并存储至SPI-FLASH。
本案例适用于普中STM32F103系列开发板(Z300&Z400&Z500),所使用的彩屏驱动型号为ILI9481,在工程中tftlcd.h中可查看到。
注意事项:要提前准备好一张TF卡,且TF卡要格式化为FAT32格式,本例程使用的文本文件路径为:/EBOOK/test.txt    所以要在SD卡根目录下创建一个文件夹EBOOK,然后将所要读取的文本文件放于其中,并命名为test,当然也可以自己定义,需配合程序中路径同时修改。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

主题

4

帖子

22

积分

新手上路

Rank: 1

积分
22
发表于 2022-12-5 14:54:27 | 显示全部楼层
您好,我这边想咨询一下关于文件系统的开发细节,方便加一下微信么
回复 支持 反对

使用道具 举报

0

主题

4

帖子

22

积分

新手上路

Rank: 1

积分
22
发表于 2022-12-5 15:14:43 | 显示全部楼层
我这边的话想用FATFS文件系统建一个可存储数据的小装置,现在的问题是,我程序写完了,只能新建文档,但是无法将数据写入到文档中,且函数返回值全部都是FR_OK,不知道问题出在哪里了
回复 支持 反对

使用道具 举报

0

主题

4

帖子

22

积分

新手上路

Rank: 1

积分
22
发表于 2022-12-5 15:18:04 | 显示全部楼层
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "tftlcd.h"
#include "key.h"
#include "malloc.h"
#include "sd.h"
#include "flash.h"
#include "ff.h"
#include "fatfs_app.h"
#include "adc.h"

FRESULT res_flash; /* 文件操作结果 */
FRESULT res_flash1; /* 文件操作结果 */
FRESULT res_flash2; /* 文件操作结果 */
u16 value=0;            //采样点数值监测
float vol;
u16 current;
//char sample_buffer[] = "5,389,56 \r\n";//建一个数组
static const uint8_t WirtBuff[10]={0,1,2,3,4,5,6,7,8,9};
static       uint8_t ReadBuff[100];

int main()
{
        u8 i=0;
        u32 free,total;
       
        SysTick_Init(72);
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
        LED_Init();
        USART1_Init(9600);
        ADCx_Init();        //ADC初始化
        TFTLCD_Init();                        //LCD初始化
       
        EN25QXX_Init();                                //初始化EN25Q128          
        my_mem_init(SRAMIN);                //初始化内部内存池
       
//        FRONT_COLOR=RED;//设置字体为红色
//        LCD_ShowString(10,10,tftlcd_data.width,tftlcd_data.height,16,"PRECHIN STM32F1");       
//        LCD_ShowString(10,30,tftlcd_data.width,tftlcd_data.height,16,"FatFs Test");       
//        LCD_ShowString(10,50,tftlcd_data.width,tftlcd_data.height,16,"www.prechin.net");
        SD_Init();
//        while(SD_Init())//检测不到SD卡
//        {
//                LCD_ShowString(10,100,tftlcd_data.width,tftlcd_data.height,16,"SD Card Error!");
//                printf("SD Card Error!\r\n");
//                delay_ms(500);                                       
//        }
       
//         FRONT_COLOR=BLUE;        //设置字体为蓝色
//        //检测SD卡成功                        
//        printf("SD Card OK!\r\n");       
//        LCD_ShowString(10,100,tftlcd_data.width,tftlcd_data.height,16,"SD Card OK ");
       
        FATFS_Init();                                                        //为fatfs相关变量申请内存       

00  res_flash=f_mkfs("0:",0,0);                   //芯片数据格式化
        res_flash=f_mount(NULL,"0:",1);                                         //挂载SD卡        
        res_flash=f_mount(fs[0],"0:",1);                                         //挂载SD卡        
       
       
//  res_flash=f_mount(fs[0],"0:",1);                                         //挂载SD卡        
//                          
//        while(FATFS_GetFree("0:",&total,&free))        //得到SD卡的总容量和剩余容量
//        {
//                LCD_ShowString(10,120,tftlcd_data.width,tftlcd_data.height,16,"SD Card Fatfs Error!");
//                printf(" SD卡 FAT 错误!");
//                delay_ms(200);
//        }
//         FRONT_COLOR=BLUE;//设置字体为蓝色          
//        LCD_ShowString(10,120,tftlcd_data.width,tftlcd_data.height,16,"SD Card Fatfs OK!     ");         
//        LCD_ShowString(10,140,tftlcd_data.width,tftlcd_data.height,16,"SD Total Size:     MB");         
//        LCD_ShowString(10,160,tftlcd_data.width,tftlcd_data.height,16,"SD  Free Size:     MB");        
//  LCD_ShowString(10,180,tftlcd_data.width,tftlcd_data.height,16,"Voltage:      mV");         
//        LCD_ShowString(10,200,tftlcd_data.width,tftlcd_data.height,16,"Current:      mA");
//         LCD_ShowNum(10+8*14,140,total>>10,5,16);                                //显示SD卡总容量 MB
//         LCD_ShowNum(10+8*14,160,free>>10,5,16);                                        //显示SD卡剩余容量 MB
//        printf("SD Total Size: %ldMB\r\n",total>>10);
//        printf("SD  Free Size: %ldMB\r\n",free>>10);

        /*************************新建txt文档*****************************************/
//  char sample_buffer[] = "5,389,56 \r\n";//建一个数组

//        f_mkdir("0:/电流检测数据获取");//新建文件夹,其中电流检测数据获取是文件夹名称
        res_flash=f_open(file,"0:/电流数据检测.txt", FA_CREATE_ALWAYS | FA_WRITE| FA_READ ); //打开一个文件,若没有则新建一个
       
        if(res_flash== FR_OK )
        {
                        /*   文件定位   */
                  res_flash1=f_lseek(file,f_size(file));
                  if(res_flash1== FR_OK )
                        {
                                        /*   数据写入   */
                                        res_flash2=f_write(file, WirtBuff, 10, &bw);
                        }
        }

  f_close(file);
       
//        f_open(file,"0:/电流数据检测.txt",  FA_READ ); //打开一个文件,若没有则新建一个
//       
//        f_read(file, ReadBuff, 10, &br);
//       
//        f_close(file);
       
               
        while(1)
        {
                i++;
                if(i%20==0)
                {
                                value=Get_ADC_Value(ADC_Channel_8,20);
                                //printf("检测AD值为:%d\r\n",value);
        //                        ADXL_Show_num(80,100,value,0);
                               
                                vol=(float)value*(3.3/4096);
                          current=(float) vol*100000/41.7/1.5;
//                                printf("检测电压值为:%.2fV\r\n",vol);
                                LCD_ShowNum(80,180,vol*1000,5,16);                                //采样电压数据显示
                          LCD_ShowNum(80,200,current,5,16);                                //采样电流数据显示 (mA)级
                       
//                          ADXL_Show_num(80,180,vol*1000,1);
                       
//                          current=(float) vol*1000000/41.7/1.5;
////                    printf("Current:%d\r\n",current);
////                          printf("Current:%f.0 mA\r\n",current);
//                                ADXL_Show_num(80,200,current,1);
                }
               

               
                delay_ms(10);
        }
       
}

回复 支持 反对

使用道具 举报

0

主题

4

帖子

22

积分

新手上路

Rank: 1

积分
22
发表于 2022-12-5 15:19:41 | 显示全部楼层
使用的是PZ6806D开发版,然后内部的FATFS函数是基本上没有动过的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-5-2 08:00 , Processed in 0.128646 second(s), 31 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表