当前位置: 首页 > news >正文

【正点原子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中文件系统根目录下的目录结构等。

相关文章:

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

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

12. 机器学习——评价指标

机器学习面试题汇总与解析——评价指标 本章讲解知识点 什么是评价指标?机器学习本专栏适合于Python已经入门的学生或人士,有一定的编程基础。本专栏适合于算法工程师、机器学习、图像处理求职的学生或人士。本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。这才是…...

代码随想录算法训练营第23期day45|70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数

目录 一、(leetcode 70)爬楼梯 二、(leetcode 322)零钱兑换 三、(leetcode 279)完全平方数 一、(leetcode 70)爬楼梯 力扣题目链接​​​​​​ 状态:查看思路后AC 除…...

uniapp公共css

/* 弹性布局 */ .flex{display: flex; } .a-c{align-items: center; } .a-s{align-items: flex-start; } .a-e{align-items: flex-end; } .j-c{justify-content: center; } .j-sb{justify-content: space-between; } .j-s{justify-content: flex-start; } .j-e{justify-content…...

C语言—i++、++i、条件运算符、goto语句、注释

i和i #include <stdio.h> int main() {int i5,j;j i;printf("i%d,j%d\n", i, j);i 5;j i;printf("i%d,j%d\n", i, j);system("pause");return 0;}i6,j6 i6,j5 请按任意键继续. . .条件运算符 goto语句 #include <stdio.h> int …...

Java自学第8课:电商项目(3) - 重新搭建环境

由于之前用的jdk和eclipse&#xff0c;以及mysql并不是视频教程所采用的&#xff0c;在后面运行源码和使用作者提供源码时&#xff0c;总是报错&#xff0c;怀疑&#xff1a; 1 数据库有问题 2 jdk和引入的jar包不匹配 3 其他什么未知的错误&#xff1f; 所以决定卸载jdk e…...

深度学习_11_softmax_图片识别代码原理解析

完整代码&#xff1a; import torch from d2l import torch as d2l"创建训练集&创建检测集合" batch_size 256 train_iter, test_iter d2l.load_data_fashion_mnist(batch_size)"每个图片长度&#xff0c;以及图片种类" num_inputs 784 num_output…...

Java Web——前端HTML入门

目录 HTML&CSS3&JavaScript简述 1. HTML概念 2. 超文本 3. 标记语言 4. HTML基础结构 5. HTML基础词汇 6. HTML语法规则 7. VS Code 推荐使用的插件 8. 在线帮助文档 HTML&CSS3&JavaScript简述 HTML 主要用于网页主体结构的搭建&#xff0c;像一个毛坯…...

华为ensp:为vlan配置ip

配置对应vlan的ip vlan1 interface Vlanif 1 进入vlan1 ip address 192.168.1.254 24配置IP为192.168.1.254 子网掩码为24位 这样就配置上ip了 vlan2 interface Vlanif 2 ip address 192.168.2.254 24 vlan3 interface Vlanif 3 ip address 192.168.3.254 24 查看结果 …...

laravel8-rabbitmq消息队列-实时监听跨服务器消息

使用场景介绍&#xff1a; 1&#xff09;用于实时监听远程服务器发出的消息&#xff08;json格式消息&#xff09;&#xff0c;接受并更新消息状态&#xff0c;存储到本地服务器 2&#xff09;环境&#xff1a;lNMP&#xff08;laravel8&#xff09; 3&#xff09;服务器需要开…...

git清除历史提交记录保持本地文件不变

https://www.cnblogs.com/langkyeSir/p/14528857.html git删除历史版本&#xff0c;保留当前状态。 有时候&#xff0c;我们误提交了某些隐私文件&#xff0c;使用git rm xxx删除后&#xff0c;其实版本库中是有历史记录的&#xff0c;想要删除这些记录&#xff0c;但是又不想…...

SOME/IP学习笔记2

1. SOME/IP 协议 SOME/IP目前支持UDP&#xff08;用户传输协议&#xff09;和TCP&#xff08;传输控制协议&#xff09;&#xff0c; PS:UDP和TCP区别如下 TCP面向连接的&#xff0c;可靠的数据传输服务&#xff1b;UDP面向无连接的&#xff0c;尽最大努力的数据传输服务&…...

python实现FINS协议的TCP服务端(篇一)

python实现FINS协议的TCP服务端是一件稍微麻烦点的事情。它不像modbusTCP那样&#xff0c;可以使用现成的pymodbus模块去实现。但是&#xff0c;我们可以根据协议帧进行组包&#xff0c;自己去实现帧的格式&#xff0c;而这一切可以基于socket模块。本文为第一篇。 一、了解FI…...

利用uni-app 开发的iOS app 发布到App Store全流程

1.0.3 20200927 更新官方对应用审核流程的状态。 注&#xff1a;最新审核后续将同步社区另一篇记录 AppStore 审核被拒原因记录及解决措施 &#xff1a;苹果开发上架常见问题 | appuploader使用教程 1.0.2 20200925 新增首次驳回拒绝邮件解决措施。 1.0.1 20200922 首次…...

5个高质量的实用办公软件,每一款都是良心推荐

在现代办公环境中&#xff0c;高效的办公软件可以极大地提升工作效率&#xff0c;简化工作流程&#xff0c;帮助我们更好地完成工作。今天就给大家分享5个高质量的实用办公软件&#xff0c;每一款都是良心推荐。 01、FastStone Capture&#xff08;截图工具&#xff09; FastSt…...

基于GPTs个性化定制SCI论文专业翻译器

1. 什么是GPTs GPTs是OpenAI在2023年11月6日开发者大会上发布的重要功能更新&#xff0c;允许用户根据特定需求定制自己的ChatGPT模型。 Introducing GPTs 官方介绍页面https://openai.com/blog/introducing-gpts 在原有自定义ChatGPT的流程中&#xff0c;首先需要自己编制p…...

Final Cut Pro X for Mac:打造专业级视频剪辑的终极利器

随着数字媒体技术的不断发展&#xff0c;视频剪辑已经成为各行各业不可或缺的一部分。Final Cut Pro X for Mac作为一款专业的视频剪辑软件&#xff0c;凭借其强大的功能和易用性&#xff0c;已经成为Mac用户的首选。本文将向您详细介绍Final Cut Pro X for Mac的优势、功能以及…...

c++分割路径的字符串,得到 目录 文件名 扩展名

简单的做一个c小代码片的记录 c分割了图片的 路径字符串&#xff0c;得到 目录 文件名 扩展名 #include <iostream> using namespace std;int main() {std::string path "E:\\set1_seg\\32.jpg";//index:"\\"在字符串中的位置int index path.find…...

ABAP OpenSQL 分页处理

功能实现 在 ABAP 中&#xff0c;可以使用 OpenSQL 来实现分页功能。下面是一种实现分页的示例方法&#xff1a; 首先&#xff0c;定义一个内部表来存储查询结果数据&#xff1a; DATA lt_data TYPE TABLE OF your_data_type.然后&#xff0c;使用 SELECT 语句将数据查询到内…...

kubeasz一键部署k8s集群

下载程序 部署说明 部署文档 rootiZj6cd9joygowsf7am5hryZ:~# apt-get update rootiZj6cd9joygowsf7am5hryZ:~# apt-get upgrade rootiZj6cd9joygowsf7am5hryZ:~# export release3.6.2 rootiZj6cd9joygowsf7am5hryZ:~# wget https://github.com/easzlab/kubeasz/releases/…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...