【正点原子STM32连载】 第四十七章 FATFS实验 摘自【正点原子】APM32E103最小系统板使用指南

news2024/11/21 2:37:54

1)实验平台:正点原子APM32E103最小系统板
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban

第四十七章 FATFS实验

上一章实验中已经成功驱动SD卡,并可对SD卡进行读写操作,但读写SD卡时都是直接读出或写入二进制数据,这样使用起来显得十分不方便,因此本章将介绍FATFS,FATFS是一个通用的FAT文件系统模块,能够帮助实现文件系统,方便对SD卡、NOR Flash或其他存储介质中数据的管理。通过本章的学习,读者将学习到FATFA的基本使用。
本章分为如下几个小节:
47.1 硬件设计
47.2 程序设计
47.3 下载验证

47.1 硬件设计
47.1.1 例程功能

  1. 程序运行后,初始化SD卡,并挂载SD卡和NOR Flash,接着在LCD上显示SD卡的容量信息
  2. 可通过USMART使用FatFs对SD卡和NOR Flash进行文件系统的相关操作
  3. LED0闪烁,指示程序正在运行
    47.1.2 硬件资源
  4. LED
    LED0 - PB5
  5. USART1(PA9、PA10连接至板载USB转串口芯片上)
  6. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
  7. SD卡(SDIO驱动)
  8. NOR Flash(SPI驱动)
    47.1.3 原理图
    本章实验使用的FATFS为软件库,因此没有对应的连接原理图。
    47.2 程序设计
    47.2.1 FATFS的使用
    FATFS涉及多个文件,在本章实验的配套实验例程中,如下图所示:
    在这里插入图片描述

图47.2.1.1 实验例程中的FATFS源文件
对于不同的硬件,使用FATFS仅需修改diskio.c和ffconf.h文件即可,并且本章实验配套的实验例程中的FATFS文件已经针对正点原子APM32E103最小系统板进行了移植适配,用户在使用时,仅需直接将这些文件添加到自己的工程,并根据实际需求适当修改diskio.c和ffconf.h文件即可。
为了方便读者使用FATFS,本章实验配套的实验例程另外提供了四个文件,如下图所示:
在这里插入图片描述

图47.2.1.2 实验FATFS扩展文件
这几个文件中提供了许多便捷使用和测试FATFS的函数,例如:获取文件类型、获取磁盘剩余容量和复制文件夹等。
47.2.2 实验应用代码
本章实验的应用代码,如下所示:

int main(void)
{
    FRESULT res;
    uint32_t total;
    uint32_t free;
    
    NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_4);  /* 设置中断优先级分组为组4 */
    sys_apm32_clock_init(15);                         /* 配置系统时钟 */
    delay_init(120);                                  /* 初始化延时功能 */
    usart_init(115200);                               /* 初始化串口 */
    usmart_dev.init(120);                             /* 初始化USMART */
    led_init();                                       /* 初始化LED */
    lcd_init();                                       /* 初始化LCD */
    my_mem_init(SRAMIN);                              /* 初始化内部SRAM内存池 */
   
    lcd_show_string(30, 50, 200, 16, 16, "APM32", RED);
    lcd_show_string(30, 70, 200, 16, 16, "FATFS TEST", RED);
    lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
    lcd_show_string(30, 110, 200, 16, 16, "Use USMART for test", RED);
    
    while (sd_init() != 0)                            /* 初始化SD卡 */
    {
        lcd_show_string(30, 150, 200, 16, 16, "SD Card Error!", RED);
        delay_ms(500);
        lcd_show_string(30, 150, 200, 16, 16, "Please Check! ", RED);
        delay_ms(500);
        LED0_TOGGLE();
    }
    
    exfuns_init();                                    /* 为exfuns申请内存 */
    f_mount(fs[0], "0:", 1);                          /* 挂载SD卡 */
res = f_mount(fs[1], "1:", 1);                    /* 挂载NOR Flash */
/* 没有文件系统,需要进行格式化 */
    if (res == FR_NO_FILESYSTEM)
    {
        lcd_show_string(30, 150, 200, 16, 16, "Flash Disk Formatting...", RED);
        res = f_mkfs("1:", NULL, NULL, FF_MAX_SS);    /* 格式化NOR Flash */
        if (res ==FR_OK)                              /* 格式化完成 */
        {   /* 设置NOR Flash磁盘的名字为:ALIENTEK */
            f_setlabel((const TCHAR *)"1:ALIENTEK");
            lcd_show_string(30, 150, 200, 16, 16, 
"Flash Disk Format Finish", RED);
        }
        else                                          /* 格式化失败 */
        {
            lcd_show_string(30, 150, 200, 16, 16, 
"Flash Disk Format Error ", RED);
        }
        delay_ms(1000);
    }
    lcd_fill(30, 150, 240, 150 + 16, WHITE);
    
    while (exfuns_get_free("0", &total, &free) != 0)  /* 获取SD卡容量 */
    {
        lcd_show_string(30, 150, 200, 16, 16, "SD Card FatFs Error!", RED);
        delay_ms(200);
        lcd_fill(30, 150, 240, 150 + 16, WHITE);
        delay_ms(200);
        LED0_TOGGLE();
    }
    
    lcd_show_string(30, 150, 200, 16, 16, "FATFS OK!", BLUE);
    lcd_show_string(30, 170, 200, 16, 16, "SD Total Size:     MB", BLUE);
    lcd_show_string(30, 190, 200, 16, 16, "SD Free Size:     MB", BLUE);
    lcd_show_num(30 + 8 * 14, 170, total >> 10, 5, 16, BLUE);
    lcd_show_num(30 + 8 * 13, 190, free >> 10, 5, 16, BLUE);
    
    while (1)
    {
        delay_ms(200);
        LED0_TOGGLE();
    }
}

可以看到,本实验的应用代码中,使用函数exfuns_init()函数为使用和测试FATFS完成一些必要的初始化后,便挂载了SD卡和NOR Flash,并且在NOR Flash上没有文件系统的情况下对其进行格式化,随后借助函数exfuns_get_free()获取SD卡的总容量和剩余容量,并且将其在LCD上进行显示。
本实验还使用到了USMART调试组件,方便使用串口调试助手测试FATFS,usmart_config.c文件中添加的函数,如下所示:

struct _m_usmart_nametab usmart_nametab[] =
{
#if USMART_USE_WRFUNS == 1      /* 如果使能了读写操作 */
    (void *)read_addr, "uint32_t read_addr(uint32_t addr)",
    (void *)write_addr, "void write_addr(uint32_t addr,uint32_t val)",
#endif
    (void *)delay_ms, "void delay_ms(uint16_t nms)",
    (void *)delay_us, "void delay_us(uint32_t nus)",
    (void *)mf_init, "uint8_t mf_init(void)",
    (void *)mf_free, "void mf_free(void)",
    (void *)mf_mount, "uint8_t mf_mount(uint8_t *path, uint8_t mt)",
    (void *)mf_open, "uint8_t mf_open(uint8_t *path, uint8_t mode)",
    (void *)mf_close, "uint8_t mf_close(void)",
    (void *)mf_read, "uint8_t mf_read(uint16_t len)",
    (void *)mf_write, "uint8_t mf_write(uint8_t *pdata, uint16_t len)",
    (void *)mf_opendir, "uint8_t mf_opendir(uint8_t *path)",
    (void *)mf_closedir, "uint8_t mf_closedir(void)",
    (void *)mf_readdir, "uint8_t mf_readdir(void)",
    (void *)mf_scan_files, "uint8_t mf_scan_files(uint8_t *path)",
    (void *)mf_showfree, "uint32_t mf_showfree(uint8_t *path)",
    (void *)mf_lseek, "uint8_t mf_lseek(uint32_t offset)",
    (void *)mf_tell, "uint32_t mf_tell(void)",
    (void *)mf_size, "uint32_t mf_size(void)",
    (void *)mf_mkdir, "uint8_t mf_mkdir(uint8_t *path)",
(void *)mf_fmkfs, 
"uint8_t mf_fmkfs(uint8_t *path, uint8_t opt, uint16_t au)",
    (void *)mf_unlink, "uint8_t mf_unlink(uint8_t *path)",
    (void *)mf_rename, "uint8_t mf_rename(uint8_t *oldname, uint8_t *newname)",
    (void *)mf_getlabel, "void mf_getlabel(uint8_t *path)",
    (void *)mf_setlabel, "void mf_setlabel(uint8_t *path)",
    (void *)mf_gets, "void mf_gets(uint16_t size)",
    (void *)mf_putc, "uint8_t mf_putc(uint8_t c)",
    (void *)mf_puts, "uint8_t mf_puts(uint8_t *str)",
};

这么一来便可以通过串口调试助手借助USMART调试组件对FATFS进行测试。
47.3 下载验证
在完成编译和烧录操作后,将准备好的SD卡插入开发板板载的SD卡卡座(请确保SD卡中没有有用的数据,或已做好备份),接着若SD卡和NOR Flash都初始化并挂载和格式化成功,便能在LCD上看到SD卡的总容量和剩余容量。
接下来便可以通过串口调试助手借助USMART对FATFS进行测试,例如:“mf_scan_files(”0:”)和“mf_scan_files(”1:”)”可分别查看SD卡和NOR Flash中文件系统根目录下的目录结构等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1427739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【模型微调】| 各类微调模型总结 P-Tuning,Prefix,P-tuning v2,LoRA

文章目录 1 微调背景1.1 Full fine-tuning 全参数微调(FFT)1.2 parameter-Efficient-fine-tuning 部分参数微调(PEFT) 2 提示词调整训练法2.1 P-Tuning2.2 Prefix2.3 P-Tuning v2 3 结构调整训练法3.1 Adapter tuning3.2 LoRA 微调…

【2024年美国大学生数学建模竞赛】F题非法的野生动物贸易 完整数据

小云更新了全网最全的F题数据 另外也为大家分享: 技术文档,包括问题分析、建立模型、求解结果等,配套有思路分析视频、代码讲解视频。美赛官方限制总页数为25页,我们的思路长度为35页以上。所有模型都有求解代码和指标&#xff0…

数字化转型:企业适应新常态的关键之举_光点科技

在全球商业环境不断演变和技术日新月异的背景下,数字化转型已经成为企业不可回避的课题。它不仅关乎企业的未来生存与发展,更是适应新常态、提升竞争力的关键之举。但是,数字化转型并非一夜之间可以完成的任务,它需要全面的策略规…

九、显卡性能参数、接口

1、显卡说明 显卡的好坏直接影响画面的流畅度,一般大型游戏都会有一些电脑的推荐配置,里面就会说到显卡。 显卡,也称为显示卡(Video Card),是个人计算机基础的组成部分之一,负责将计算机系统需要…

前缀和 差分

差分和前缀和都是算法里边比较重要的知识点,不过学习的难度并不高,这篇文章会讲解相关的内容。 1. 前缀和怎么玩 1)一维前缀和 在该数之前,包括该数的所有数之和,有点类似高中学的数列的前n项和Sn。 2)二维…

2024年美赛A题:资源可用性和性别比例 Resource Availability and Sex Ratios 思路模型代码解析

2024年美赛A题:资源可用性和性别比例 Resource Availability and Sex Ratios 思路模型代码解析 【点击最下方群名片,加入群聊,获取更多思路与代码哦~】 问题翻译 虽然一些动物物种存在于通常的雄性或雌性之外,但大多数物种在很大…

ncc匹配(二,补足旋转)

先看运行结果: 第一张图是基于形状匹配结果0.992,第二张是匹配结果的ncc结果,1 再看旋转后: 看到没,旋转后,基于形状匹配结果28度,0.517,根据匹配结果ncc结果是0.99 我们看到ncc以…

聊一聊Tomcat的架构和运行流程,尽量通俗易懂一点

1、Tomcat的架构 这里可以看出 A、一个Tomcat就是一个Server,一个Server下会有多个Service, B、Service只负责封装多个Connector和一个Container(Service本身不是容器,可以看做只是用来包装Connector和Container的壳&#xff0c…

户外没有电源和网络,但需要安装监控系统,怎么办?太阳能智能监控系统给你解决

近期有粉丝给小编求助:需要在没网没电的户外进行智能监控的安装,不知道如何解决。收到粉丝的问题,小编立刻联系了技术人员给出方案。针对野外、户外等场景只需使用太阳能供电模组4G摄像机视频监控EasyCVR平台智能分析网关V4的架构&#xff0c…

Leetcode—2950. 可整除子串的数量【中等】Plus(前缀和题型)

2024每日刷题(一零八) Leetcode—2950. 可整除子串的数量 算法思想 让 f ( c ) d , 其中 d 1 , 2 , . . . , 9 f(c) d, 其中d 1, 2, ..., 9 f(c)d,其中d1,2,...,9. // f(c1) f(c2) ... f(ck) / k avg // > f(c1) f(c2) ... f(ck) - …

spring中生成jwtToken字符串以及解析手写通用工具类

当前使用JWT&#xff0c;肯定得提前准备jwt相关的导入依赖。 <!-- 关于jwt 生成令牌--> <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>${jjwt.version}</version> </dependency…

【前沿技术杂谈:开源软件】引领技术创新与商业模式的革命

【前沿技术杂谈&#xff1a;开源软件】引领技术创新与商业模式的革命 开源软件如何推动技术创新开源软件的开放性和协作精神促进知识共享和技术迭代推动关键技术的发展开源软件与新技术的融合 开源软件的商业模式开源软件的商业模式将开源软件与商业软件相结合 开源软件的安全风…

Acwing---798.差分矩阵

差分矩阵 1.题目2.基本思想3.代码实现 1.题目 输入一个 n n n 行 m m m列的整数矩阵&#xff0c;再输入 q q q 个操作&#xff0c;每个操作包含五个整数 x 1 , y 1 , x 2 , y 2 , c x1,y1,x2,y2,c x1,y1,x2,y2,c&#xff0c;其中 ( x 1 , y 1 ) (x1,y1) (x1,y1) 和 ( x …

C++——日期类

前言&#xff1a;哈喽小伙伴们&#xff0c;在上一篇文章中我们对C类与对象的前半段知识进行了简单的分享&#xff0c;其中比较重要的莫过于C类的六个默认成员函数。 所以这篇文章&#xff0c;我们通过实现一个完整的日期的操作&#xff0c;来对这些成员函数有一个更加深入的理…

nginx反向代理----->微服务网关----->具体微服务

今天&#xff0c;做项目的时候做项目的时候配路由出现bug&#xff0c;特此理顺一下从nginx到微服务网关再到微服务这一过程。 nginx配置 upstream admin-gateway{server localhost:21217; }server {listen 8803;location / {root F:/develop/admin-web/;index index.html;}…

strlen函数详解

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;c语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&a…

MATLAB实现二阶模糊逻辑控制系统仿真

1. 内容 假设某一工业过程可等效成以下二阶系统&#xff1a; 设计一个模糊控制器&#xff0c;使其能自动建立模糊规则库&#xff0c;保证控制规则如表1所示&#xff0c;这种规则可表示为&#xff1a; 式中&#xff0c;fix为取整函数&#xff1b;E为误差的模糊集&#xff1b;DE…

惯性导航---常用坐标系

惯性导航—常用坐标系 捷联惯导系统的导航解算中&#xff0c;常用到四个坐标系&#xff0c;接下来介绍四个坐标系定义及其表示符号。 1 地心惯性坐标系&#xff08;i系&#xff09; 惯性传感器的输出是以该坐标系为参考基准的。 原点X轴Z轴Y轴地球中心赤道平面内&#xff0c…

《数字化运维路线图》第三部分-数字化运维转型平台 震撼发布!

数字化转型已不再是企业追求效益最大化的手段&#xff0c;而是成为经济发展变革、提升国家数字竞争的核心动力。在此背景下&#xff0c;博睿数据继续发力&#xff0c;隆重推出「数字化运维转型平台」&#xff0c;汇聚了我们对数字化转型的深刻洞见与实践经验&#xff0c;以期为…

【android】 android->profile 查看内存泄露

目录 实例讲解 各字段解释 实例讲解 各字段解释 在 Android Studio 的 Profile 视图中&#xff0c;Arrange by Stack 用于对内存分配和释放事件进行堆栈排列&#xff0c;以便更好地了解内存使用情况。以下是表上各列的一般含义&#xff1a; 1. **Call Chart (调用图)**: …