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

1)实验平台:正点原子stm32f103战舰开发板V4
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html##

第五十章 FATFS实验

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

50.1 硬件设计
50.1.1 例程功能

  1. 程序运行后,初始化SD卡,并挂载SD卡和NOR Flash,接着在LCD上显示SD卡的容量信息
  2. 可通过USMART使用FatFs对SD卡和NOR Flash进行文件系统的相关操作
  3. LED0闪烁,指示程序正在运行
    50.1.2 硬件资源
  4. LED
    LED0 - PF9
  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驱动)
    50.1.3 原理图
    本章实验使用的FATFS为软件库,因此没有对应的连接原理图。
    50.2 程序设计
    50.2.1 FATFS的使用
    FATFS涉及多个文件,在本章实验的配套实验例程中,如下图所示:
    在这里插入图片描述

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

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

int main(void)
{
    FRESULT res;
    uint32_t total;
    uint32_t free;
    
    NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_3);	/* 设置中断优先级分组为组3 */
    sys_apm32_clock_init(336, 8, 2, 7);					/* 配置系统时钟 */
    delay_init(168);										/* 初始化延时功能 */
    usart_init(115200);									/* 初始化串口 */
    usmart_dev.init(84);								/* 初始化USMART */
    led_init();											/* 初始化LED */
    lcd_init();											/* 初始化LCD */
    my_mem_init(SRAMIN);								/* 初始化内部SRAM内存池 */
    my_mem_init(SRAMCCM);								/* 初始化CCM内存池 */
    
    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进行测试。
50.3 下载验证
在完成编译和烧录操作后,将准备好的SD卡插入开发板板载的SD卡卡座(请确保SD卡中没有有用的数据,或已做好备份),接着若SD卡和NOR Flash都初始化并挂载和格式化成功,便能在LCD上看到SD卡的总容量和剩余容量。
接下来便可以通过串口调试助手借助USMART对FATFS进行测试,例如:“mf_scan_files(”0:”)和“mf_scan_files(”1:”)”可分别查看SD卡和NOR Flash中文件系统根目录下的目录结构等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决@Autowired警告

一.前言 再使用springboot自动注入Autowired注解时,下方会出现波浪线警告,这是什么原因呢?我们细看提示说明已经说的很清楚了,Field injection is not recommended “不建议使用字段注入”,字段注入是指通过直接将依赖项注入到类的字段中来实现依赖注入。这种方式存在一些问题…

Lightroom Classic 2023 v12.4

Lightroom Classic 2023是一款图像处理软件,是数字摄影后期制作的重要工具之一。与其他图像处理软件相比,Lightroom Classic具有以下特点: 高效的图像管理:Lightroom Classic提供了强大的图像管理功能,可以轻松导入、…

Unit3:贪心算法

文章目录 一、介绍二、分数背包问题问题描述分析时间复杂度伪代码案例彩蛋 三、活动选择问题问题描述分析伪代码时间复杂度拓展:加权活动选择分析计算伪代码时间复杂度案例 对比动态规划和贪心算法 四、哈夫曼编码分类定长编码 目标变长码 案例分析伪代码时间复杂度…

halcon获取轮廓属性的时候报错:Contour attribute not defined(HALCON错误代码:3261)

报错截图: 在使用以下算子,获取xld的distance属性时,或者其他属性时报错。 get_contour_attrib_xld (ObjectSelected, distance, Attrib) 如果是属性报错。这里需要在调用获取轮廓属性之前先获得轮廓之间的距离。 使用以下算子:…

设置专属链接的这些作用你知道吗?

专属链接作为一种个性化的链接,用于为特定的客户或群体提供定制化的体验或服务。对于企业来说,每个渠道或者每个客户都能拥有一个专属链接是无比便利的事情。企业可以将这个链接嵌入到各种宣传物料中,让客户通过输入链接即可进入与客服的交流…

壁灯外贸出口的UL1598检测标准解析

壁灯是安装在室内墙壁上的辅助照明装饰灯具,一般多配用乳白色的玻璃灯罩。灯泡功率多在15-40瓦左右,光线淡雅和谐,可把环境点缀得优雅、富丽,尤以新婚居室特别适合。壁灯的种类和样式较多,一般常见的吸顶灯、变色壁灯、…

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-超级终端

红队专题 招募六边形战士队员[16]超级终端(1) 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 [16]超级终端(1) 服务端 — 本地打开cmd — 接收命令 — 执行 — 发送回显 客户端 — 远端发送命令 — 接收回显 发送开启cmd命令 --- 接受…

vue-组件注册及使用

​🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容-组件注册及使用 目录 1、组件的注册及使用 2、组件常用属性 2.1、directive 2.2、computed 2.…

GoLong的学习之路,进阶,语法之并发(并发错误处理)补充并发三部曲

这篇文章主要讲的是如何去处理并发的错误。 在Go语言中十分便捷地开启goroutine去并发地执行任务,但是如何有效的处理并发过程中的错误则是一个很棘手的问题。 文章目录 recovererrgroup recover 哦对,似乎没写错误处理的文章。后面补上。 首先&…

低功耗蓝牙技术 > GAP和GATT介绍

GAP(Generic Access Profile)和GATT(Generic Attribute Profile)简介 在蓝牙技术的发展中,GAP和GATT两个协议扮演着关键的角色,为BLE(低功耗蓝牙)设备之间的通信提供了规范和框架。…

IPSec案例部署

项目拓扑与项目求 项目需求 某企业网络使用ospf作为IGP协议实现内部网络的互联互通,区域规划和IP规划如图所示,现在要求实现如下需求: 公司总部和分支之间互访,使用IPSec VPN传递流量,并且对其加密,公司内…

IntellJ IDEA利用spring initializr创建springboot项目

maven仓库修改镜像源 idea会默认从.m2目录下读取maven配置信息&#xff0c;若没有setting.xml则从maven安装目录拷贝一个setting.xml到这里 在xml中添加阿里云镜像源 <mirrors><mirror> <id>nexus-aliyun</id> <name>nexus-aliyu…

鸿蒙原生应用开发-DevEco Studio中HarmonyOS与OpenHarmony项目的切换

一、找到该目录 二、修改操作系统类型 三、分别进行开发&#xff0c;一些常规的应用功能实现后&#xff0c;相互切换后都可以正常运行的。前期OpenHarmony项目如果连接开发板比较困难的化&#xff0c;开发完成后&#xff0c;切换成为HarmonyOS后就可以比较详细地看看效果了。

FNPLicensingService.exe 总提示要联网

目录预览 一、问题描述二、原因分析三、解决方案&#xff1a;四、参考链接 一、问题描述 FNPLicensingService.exe 总提示要联网 找到路径如下&#xff1a; C:\Program Files (x86)\Common Files\Macrovision Shared\FlexNet Publisher然而从文件目录来看&#xff0c;并没有…

智能电网线路阻抗模拟负载的工作原理

智能电网线路阻抗模拟负载是一种用于测试和评估电网线路性能的技术&#xff0c;它的工作原理是通过模拟负载来模拟实际负载对电网的影响&#xff0c;以便评估电网的稳定性和可靠性&#xff0c;智能电网线路阻抗模拟负载通常由电子设备和控制系统组成。电子设备主要包括电阻、电…

OLED透明屏在智慧零售场景的应用

OLED透明屏在智慧零售场景中的应用主要包括以下几个方面&#xff1a; 商品展示&#xff1a;OLED透明屏可以作为商品展示窗口&#xff0c;使得产品可以在玻璃的透明表面上直接呈现展示&#xff0c;同时显示相关的文字和视频广告信息。这种宣传模式可以更加吸引顾客注意力&#…

高性能图表库LightningChart JS v5.0 - 轻松实现图表自定义布局

LightningChart JS是Web上性能最高的图表库具有出色的执行性能 - 使用高数据速率同时监控数十个数据源。 GPU加速和WebGL渲染确保您的设备的图形处理器得到有效利用&#xff0c;从而实现高刷新率和流畅的动画。 点击获取LightningChart JS v5.0正式版下载 LightningChart JS …

瑞吉外卖Day03

小张推荐:瑞吉外卖Day02 1.启用/禁用员工账号 1.1 思路分析 1.2Controller层 PutMapping()public R<String> update(RequestBody Employee employee, HttpServletRequest request) {log.info(employee.toString());Long emp (Long) request.getSession().getAttribu…

聚力未来!云起无垠成为光合组织成员单位

近日&#xff0c;云起无垠正式加入海光产业生态合作组织&#xff08;简称“光合组织”&#xff09;。云起无垠将与光合组织联合打造安全、好用、开放的产品与解决方案&#xff0c;满足企业的安全检测需求&#xff0c;帮助企业解决业务系统上线前的安全检测和修复问题。 图1 光合…

未来之光:十八数藏的文化数字化新篇章

在时代的浪潮中&#xff0c;十八数藏显现出文化数字化的新时代光芒。这一数字化的新篇章不仅仅是对传统文化的延续&#xff0c;更是一场对未来的引领。通过数字化&#xff0c;十八数藏打开了文化传承的崭新大门&#xff0c;为传统工艺注入了新的生命力。 数字技术为十八数藏带来…