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

简介: 振南技术干货集: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 进行信号采集,并将结果存人到缓冲区后半中。在后半存满后,写文件操作早已完成,此时再对后半进行存储,同时采集数据存入前半,如此交替,从而解决了“信号漏采”的问题。此思想可广泛应用于各种对信号连续性要求较高的场合,希望能对大家有所帮助和启发。(这种方法类似于乒乓缓冲。)

相关文章
|
6月前
|
存储 数据采集 语音技术
振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(6)
振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(6)
|
6月前
|
存储 算法 语音技术
振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(3)
振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(3)
|
6月前
|
存储 语音技术 芯片
振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(8)
振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(8)
|
6月前
|
存储 IDE 语音技术
振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(9)
振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(9)
|
6月前
|
存储 机器学习/深度学习 机器人
振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(1)
振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(1)
|
6月前
|
数据采集 传感器 语音技术
振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(5)
振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(5)
|
6月前
|
传感器 数据采集 算法
振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(4)
振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(4)
|
6月前
|
存储 传感器 数据采集
振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(2)
振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(2)