振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(7)

注解目录

1、znFAT 的起源

1.1 源于论坛

(那是一个论坛文化兴盛的年代。网友 DIY SDMP3 播放器激起了我的兴趣。)

1.2 硬盘 MP3 推了我一把

(“坤哥”的硬盘 MP3 播放器,让我深陷 FAT 文件系统不能自拔。)

1.3 我的导师-- 顾国昌教授

(哈军工时期的老教授,德高望重的人生导师。)

1.4 我的母校-- 哈工程

(隐藏牛校哈工程,网络名嘴张雪峰所言非虚。振南给你讲讲母校历史:哈军工、

工程学院、哈船院、哈工程。)

1.5 那场严重超时的答辩会

(20 分钟的答辩超时 1 小时,老师表示赞叹。现场承诺要把文件系统写成书。)

1.6 时隔多年的谢师会

(承诺必须兑现,5 年之后的谢师会,我擎书谢师。不要轻易作出承诺,除非你真

得能作到!)

2、高手如云 认清对手

2.1 国外 FAT 方案简介

1 )FATFS

2 )EFSL

3 )UCFS

4 )TFFS

5 )DOSFS

(列举那些主流 FAT 文件系统方案,并进行详细介绍。)

2.2 国内 FAT 方案简介

1 )ZLG/FS

2 )沁恒 FAT

(国内尚无成型开源的 FAT 文件系统方案。但是我们要支持国货。)

3、硬刚高手 挑战自己

3.1 与高手竞速

3.2 挑战自己

(这一节我写了一个月。环比各大知名方案,看看到底谁更快!最终,挑战了自我。)

4、znFAT 精彩应用大赏

4.1 振南的精彩实验

4.1.1 SD 卡 卡 WAV 音频播放器

4.1.2 SD 卡电子滚动屏

4.1.3 SD 卡 卡 MP3 播放器

4.1.4 AT89S51 离线下载器

4.1.5 数据采集导入 EXCEL

4.1.6 串口文件窃取器

4.1.7 录音笔于 (基于 VS1003B) )

4.1.8 文件无线传输实验

4.1.9 嵌入式脚本程序解释器

4.1.10 绘图板实验(基于 STM32F4 ,屏幕截图存为 BMP 图片)

4.1.11 MEMS 声音传感器“ 硅麦” 录音实验

(znFAT 的最大亮点在于各种精彩的应用,希望振南的这些实验可以让你眼前一亮。)

4.2 精彩的第三方项目应用

4.2.1 仿 仿 Metro UI 系统应用实验

4.2.2 通过 U 盘对产品进行升级

4.2.3 嵌入式网页服务器

4.2.4 STM32+LD3320 作声控音频播放器

4.2.5 BMP 图片浏览

4.2.6 VGA 显示 SD 卡中的图片(基于 FPGA) )

4.2.7 汉字电子书(基于 STM8) )

4.2.8 文本语音合成实验(TTS ,基于 NUC120) )

4.2.9 《跳跃小猫》动画播放(基于 FPGA NIOSII)

4

znFAT 精彩应用大赏

9.嵌入式脚本程序解释器


所需主要硬件:ATMEGA128A、SD/SDHC 卡

实验详细介绍:

此实验用于实现一个简单的脚本解释器,即逐行读取 SD 卡中的脚本文件中的命令及其参数,经过解释分析后转为相应的硬件动作。脚本(script)是使用一种特定的描述性语言,依据一定的格式编写的可执行文件,又称作宏或批处理文件。说到脚本大家可能会觉得比较遥远而高深,但说到 DOS 的批处理大家就会觉得比较熟悉了。DOS 中的 bat 文件可以一次性逐行编写很多条 DOS 指令,甚至可以有较为复杂的循环结构。它最大的好处就是灵活,而目无需编译,直接解释执行。

此实验中振南自定义了一个简单的脚本格式以及三个指令(SET:CLR:DELAY),由它们构成了脚本文件,放置于 SD 卡中,如图 18.33 所示。


图 18.33 振南定义的脚本文件格式

由 znFAT 读取此文件,逐行取出各条指令,经过解释程序的分析,依次产生相应的硬件动作(AVR 单片机 PORTF 端日各引脚电平变化,如 CLR 1使 PORTF.=,SET 2使PORTF.2=1,DELAY 则根据参数延时相应的时间)。此实验整体详细描述如图 18.34所示。

振南注解:对于“脚本”这一概念,很多搞电子或是嵌人式开发的人可能并不是很熟悉,但是对于计算机专业来说,它却是一个必不可少的东西,尤其是软件工程师。脚本就是一种用纯文本保存的程序(而非二进制的机器码),它是确定的一系列控制计算机进行运算操作或动作的组合。更通俗一些来说,脚本就是一条条的文字命令,这些文字命令是可以由人直接阅读的


图 18.34 脚本解释执行实验示意

(可使用记事本打开查看或编辑)。脚本在执行时,是由一个解释器将其一条条的翻译成机器可识别的指令,并按脚本指令顺序执行。因为脚本在执行时多了一道翻译的过程,所以它比传统的二进制程序执行效率要低。

在计算机平台上脚本通常可以由应用程序临时调用并执行。脚本最大的应用领域就是网页设计,比如我们经常见到的 HTML、ASP 等,这使得网站开发与维护变得极为灵活。也正因为脚本的这些特点,往往被一些别有用心的人所利用。例如在脚本中加入一些破坏计算机系统的命令,这样当用户浏览网页时,一旦调用这类脚本,便会使用户的系统受到攻击。

此实验中振南将脚本的思想应用于单片机平台上,从而实现对硬件可随时配置的、在现场摆脱编译器与烧录器的灵活控制。比如在工业现场需要临时产生一个特定的时序,但是没有开发与烧录环境,则可以通过直接撰写脚本来实现。从某种意义上来说,脚本程序可以让单片机实现类似动态加载的机制。我们可以在 SD 卡中放置若干个脚本文件,并根据不同需要通过文件系统对它们进行读取、解释与执行。而在单片机上我们只需要实现一个解释器即可。(其实这就是 Java 语言及其虚拟机的工作方式。有人在 ARM 上实现了 JVM ,这样一来原本在 PC 上运行的 Java 程序便可以直接移到 ARM 上来运行了。这也是 Java 语言超强跨平台特性的核心内容。)

10.绘图板实验(基于 STM32F4 ,屏幕截图存为 BMP 图片)

所需主要硬件:STM32F405RGT6、TFT 晶、触摸控制器SD/SDHC 

卡实验详细介绍:

“绘图板”实验基本功能的实现其实很简单,就是在 TFT 触摸屏上按轨迹画点。不过这里我们为它附加了更多的内容:触摸按钮,用来实现清屏、改变画点颜色等功能;液晶截屏存为BMP图片。

我们知道,基于触摸的各种功能的实现,其根本在于对屏上坐标的精准获取。触摸按钮的实现,就是将当前的坐标与按钮矩形区域进行比较,看它是否位于其范围内。如果在,则在触摸提起的时候调用相应的处理程序,如图 18.35 所示。

实际上触摸控制器就是一个多路 ADC,它因触摸点位置的不同为我们提供相应的电压值。通过它换算得到的坐标与实际我们看到的坐标可能并不一致,通常都会有一定的偏差。所以在使用触摸屏的之前,我们一般都会进行“4 点校准”如图 18.36 所示。

如果我们直接在计算得到的坐标上画点的话,很多人都会发现一个问题:画出来的不是一个点,而是一组点,而且其中有的点会离中心坐标比较远,如图 18.37 所示。


图 18.35 判断当前坐标是否在按钮矩形区域内


图 18.36 使用“ 4 点校准”为触摸屏进行坐标校正


图 18.37 使用触摸触摸坐标直接画点产生的坐标偏移

这到底是为什么?其根本原因是没有对由触摸计算得到的坐标结果进行处理,比如均值滤波,或是取其中点。人手在进行触摸时所产生的机械动作是不稳定的,带有较大的抖动(其道理就如同按键要去抖一样):另外因为触摸按压会使电阻膜产生形变,改变其原本均匀的电阻率分布,而且这种形变还在不断变化。因此由触摸控制器采集得到的电压必然不会稳定,通常都需要进行中值滤波。其基本原理如图 18.38 所示。


图 18.38 对触摸坐标进行中值滤波处理

此算法分别取出各点的横坐标与纵坐标,并分别进行线性排序,取出中值,从而得到中值点。加入此算法之后,我们就会发现画点的效果好了很 多,绘制的轨迹也比较 平滑,如图18.39 所示。


图 18.39 加入滤波算法之后触摸画点效果变得平滑

其次就是截屏存为 BMP 图片功能的实现。我们在驱动 TFT 液晶的时候,很多时候都是在向它的显存中写入像素数据,从而实现显示功能。其实也可以从中进行像素的回读,这就是载屏功能的实现原理。将读到的 RGB565 格式的像素数据加上一个信息头,写人到 SD卡的文件中便是 BMP 图片。关键就在于这个“信息头”的具体定义,这也是很多人所希望了解的,请看图 18.40。


图 18.40 BMP 文件信息头结构具体定义

最终的实验效果如图 18.41 所示。


图 18.41 画图板实验的实际实验效果

11.MEMS 声音传感器“硅麦”录音实验

所需主要硬件:STM32F051R8T6、SD/SDHC 卡、ADMP401(由 ADI公司出品的全向麦克风,模拟信号输出)

实验详细介绍:

前面我们通过 VS1003B 实现了“录音笔”实验。从某种意义上来说,我们并没有触及真正的底层。VS1003B 自动完成了音频信号采样、编码处理等工作,最终呈现在我们面前的就是现成的 ADPCM 数据,我们做的只不过是数据的组织与存储而已。振南一直想直接采集原始的声波信号,从而实现录音功能,甚至是声音识别。对于模拟信号的处理通常都是比较麻烦的,振南之前使用驻极体(俗称“咪头”)十处理电路基本实现了声波的采集,详见图 18.42。


图 18.42 驻极体音频处理电路

图 18.42 中功放电路的效果会比较好。驻极体将采集到的声音信号转换为电信号,经 C2与 W(电位器)从 TDA2822 的2 脚引人,经放大之后,最终产生音频模拟信号。此电路为 BTI输出,这对于改进音质,降低失真大有好处,同时输出功率也增加了 4 倍,它可直接驱动喇叭发音。

自已搭建电路的方式还是略显烦琐,而且它受到分立元器件质量、焊接等因素的影响较大。振南后来发现了一个更简单的方案,即使用 MEMS 传感器。MEMS,即微机电系统,全称是Micro-electro Mechanical System,它是一种先进的制造技术平台。它是以半导体制造技术为基础发展起来的。MEMS 技术采用了半导体技术中的光刻、腐蚀、薄膜等一系列的现有技术和材料,因此从制造技术本身来讲,MEMS 中基本的制造技术是成熟的。MEMS 更侧重于超精密机械加工,并要涉及微电子、材料、力学、化学、机械学诸多学科领域。它的学科面也扩大到微尺度下的力、电、光、磁、声、表面等物理学的各分支。说白了,MEMS 就是在几厘米甚至更小的空间中封装的,可独立工作的智能传感器系统。此实验中使用的是振南的 ADPM401 模块,如图18.43 所示。


图 18.43 振南的 ADMP401 MEMS 传感器模块

模块电路如图 18.44 所示。


图 18.44 ADMP401 模块电路

此模块输出的是高质量的音频模拟信号。我们需要使用 ADC 对它进行采集,ADC 芯片的精度以及采样速度决定了最终的音频质量。此实验中振南使用了 TLC549 这一芯片(位于ZN-X开发板的基础实验资源模块上),它的采样精度为 8 位最大转换速率为 40 Hz,即每秒钟可提供 40000个 A/D 采样数据。基于这样的硬件性能,我们可实现 8 kHz或 16 kHz的8 位音频(这样的音频质量已经基本可以接受了)。

实验中使用的单片机芯片为 STM32F051R8T6(内核为 Cortex-M0,位于 ZN-X 开发板上),它是 STM32 系列中内核量级与性能较低的一款。但是用来控制 ADC 进行音频采集并实现录音功能还是绰绰有余的。图 18.45 为此实验的实际硬件平台及功能示意。


图 18.45 MEMS 声音传感器录音实验平台及其功能示意

顶层功能与前面的实验是类似的:由按键控制录音的启停,每次在 SD 卡中生成一个新的WAV 文件。不过因为这里使用的是原始的 PCM 数据(即音频模拟信号的直接采样电压值),所以 WAV 文件的 RIFF 头有些差异。另外,播放相同时长的音频数据量较前者要大,因为这里没有进行ADPCM 编码。

下面振南要讲的是一个很多人在作音频录制或播放时都会遇到的问题。形象的描述请看图 18.46。


图 18.46 音频录制过程中因“ CPU 间歇”造成采样丢失

单片机控制 ADC 进行定时采样,将 ADC 转换结果存入到的数据缓冲区中。当缓冲区存满之后,将其中的数据一并写入到 SD 卡中的 WAV 文件之中。数据的写入是比较耗时的,这个时间很有可能比 ADC 采样间隔要长,也就是说会造成“信号漏采”。这样会导致最终的音频数据不连续,由它还原出来的声音自然是有缺陷的。如何解决这一问题?其根本就在于如何让单片机同时干两件事情,又如何让数据缓冲区同时服务于两项工作(采集期间要向缓冲区中写入数据,而数据写人期间则要从缓冲区中读取数据)。前者自然是使用中断机制,针对后者振南提出了“缓冲区折半交换”的思想,具体如图 18.47 所示。


图 18.47 “缓冲区折半交换”思想示意

从图中可以看到,振南将缓冲区从中间一劈两半,采样数据首先被存入到前半,存满后便将前半的数据存入文件,同时在定时中断作用下,MCU 依然控制 ADC 进行信号采集,并将结果存人到缓冲区后半中。在后半存满后,写文件操作早已完成,此时再对后半进行存储,同时采集数据存入前半,如此交替,从而解决了“信号漏采”的问题。此思想可广泛应用于各种对信号连续性要求较高的场合,希望能对大家有所帮助和启发。(这种方法类似于乒乓缓冲。)

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

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

相关文章

Android Bitmap 模糊效果实现 (二)

文章目录 Android Bitmap 模糊效果实现 (二)使用 Vukan 模糊使用 RenderEffect 模糊使用 GLSL 模糊RS、Vukan、RenderEffect、GLSL 效率对比 Android Bitmap 模糊效果实现 (二) 本文首发地址 https://blog.csdn.net/CSqingchen/article/details/134656140 最新更新地址 https:/…

将用户的session改为分布式共享session

将用户的session改为分布式session 分布式session理解 使用分布式session的原因: 后台服务器是分布式的(比如要负载均衡),在A服务器请求的的信息(如用户登录信息)存在A的session中,B服务器并不…

C++之哈希

unordered系列容器的效率之所以比较高(尤其是查找),是因为它底层使用了哈希结构,即哈希表. 哈希概念 前言: 顺序结构以及平衡树中, 元素关键码与其存储位置之间没有对应的关系, 因此在查找一个元素 时, 必须要经过关键码的多次比较. 顺序查找时间复杂度为O(N), 平衡树中为树的…

香港科技大学广州|智能制造学域博士招生宣讲会—天津大学专场

时间:2023年12月07日(星期四)15:30 地点:天津大学卫津路校区26楼B112 报名链接:https://www.wjx.top/vm/mmukLPC.aspx# 宣讲嘉宾: 汤凯教授 学域主任 https://facultyprofiles.hkust-gz.edu.cn/faculty-p…

解决:AttributeError: module ‘os’ has no attribute ‘mknod’

解决:AttributeError: module ‘os’ has no attribute ‘mknod’ 文章目录 解决:AttributeError: module os has no attribute mknod背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在使用之前的代码时,报错…

借助arthas 性能调优全过程

使用 arthas 的trace 命令分析方法耗时瓶颈: 可以看出 bindReloadZoneTimeLimite 耗时最久, 通过分析Bind 底层,将业务粒度进行拆分,加入并发执行 再次使用arthas 追踪单个方法耗时时间: 核心耗时方法&#xff0c…

使用Postman如何在接口测试前将请求的参数进行自定义处理

1、前言 当我们使用 Postman 进行接口测试时,对于简单的不需要处理的接口,直接请求即可,但是对于需要处理的接口,如需要转码、替换值等,则就麻烦一些,一般我们都是先手动把修改好的值拷贝到请求里再进行请…

使用Arthas排查性能问题

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信…

unity学习笔记10

一、生命周期函数 1.Awake() 调用时间:对象被激活或创建时。 用途:通常用于初始化对象的状态,获取组件引用或执行其他在脚本生命周期早期需要完成的任务。 2.OnEnable(): 调用时间:对象激活时,包括对象被创建和Se…

每天五分钟计算机视觉:经典架构的力量与启示

在深度学习和计算机视觉领域,卷积神经网络(Convolutional Neural Networks,简称CNN)无疑是最为经典的架构之一。近年来,随着研究的不断深入和新架构的不断涌现,许多初学者可能会忽视这些经典架构的重要性。然而,理解并学习这些经典架构,对于我们深入理解卷积神经网络的…

操作系统 选择题 期末试题 考研真题 + 参考答案

1.(考研真题,单项选择题)单道批处理系统的主要缺点是( )。 A. CPU利用率不高 B.失去了交互性 C.不具备并行性 D.以上都不是 【参考答案】A 【解析】单道批处理系统的内存中只有一道程序,当该程序…

苍穹外卖项目笔记(5)——Redis

1 入门 1.1 Redis 简介 Redis 是一个基于内存的 key-value 结构数据库,官网链接(中文):https://www.redis.net.cn 特点: 基于内存存储,读写性能高适合存储热点数据(热点商品、资讯、新闻&am…

vue3(二)-基础入门之列表循环、数组变动检测、filter模糊查询、事件修饰符

一、列表循环 of 和 in 都是一样的效果 html代码&#xff1a; <div id"app"><ul><li v-for"item of datalist">{{ item }}</li></ul><ul><li v-for"item in dataobj">{{ item }}</li></u…

3D点云目标检测:CT3D解读(未完)

CT3D 一、RPN for 3D Proposal Generation二、Proposal-to-point Encoding Module2.1、Proposal-to-point Embedding2.2、Self-attention Encoding 三、Channel-wise Decoding Module3.1、Standard Decoding3.2、Channel-wise Re-weighting3.3、Channel-wise Decoding Module 四…

数据库之索引的底层数据逻辑及应用

索引&#xff08;index&#xff09;是帮助数据库高效获取数据的数据结构。 索引的数据结构 堆存储 使用二叉树存储 极端情况下的单链形式 大数据量下&#xff0c;层级越深&#xff0c;查询效率越低。 平衡二叉树 多路平衡查找树 B树的结构 所有的数据都存储在叶结点中…

redis Redis::geoAdd 无效,phpstudy 如何升级redis版本

redis 查看当前版本命令 INFO SERVERwindows 版redis 进入下载 geoadd 功能在3.2之后才有的&#xff0c;但是phpstudy提供的最新的版本也是在3.0&#xff0c;所以需要升级下 所以想出一个 挂狗头&#xff0c;卖羊肉的方法&#xff0c;下载windows 的程序&#xff0c;直接替…

Cache学习(3):Cache地址映射(直接映射缓存组相连缓存全相连缓存)

1 Cache的与存储地址的映射 以一个Cache Size 为 128 Bytes 并且Cache Line是 16 Bytes的Cache为例。首先把这个Cache想象成一个数组&#xff0c;数组总共8个元素&#xff0c;每个元素大小是 16 Bytes&#xff0c;如下图&#xff1a; 现在考虑一个问题&#xff0c;CPU从0x0654…

Vue3 + Scss 实现主题切换效果

Vue3 Scss 实现主题切换效果 先给大家看一下主题切换的效果&#xff1a; 像这样的效果实现起来并不难&#xff0c;只是比较麻烦&#xff0c;目前我知道的有两种方式可以实现&#xff0c;分别是 CSS 变量、样式文件切换&#xff0c;下面是该效果的核心实现方法 CSS变量 给…

3D数字孪生场景编辑器

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 数字孪生的强大功能来自于将真实世界的资产与真实世界的数据联系起来&#xff0c;因此您可以…

95.STL-遍历算法 for_each

算法概述: 算法主要是由头文件 <algorithm> <functional> <numeric> 组成。 <algorithm> 是所有STL头文件中最大的一个&#xff0c;范围涉及到比较、 交换、查找、遍历操作、复制、修改等等 <numeric> 体积很小&#xff0c;只包括几个在序列上面…