基于片内Flash的提示音播放程序

1)实验数据准备:用Adobe audition或goldwave等音频编辑软件录制”您好欢迎光临!”的几秒钟的声音(8khz采样、8bit量化编码的单声道wav格式),确保音频数据尽量小(最大不超64KB)。然后编程将其分批次写入stm32f103c8t6芯片内部flash区域。
2)数字音频还原播放任务:编程读取此段音频,分别通过 (a)stm32f103c8t6自带的DAC通道,转换为模拟音频进行播放,并用示波器观察波形,用耳机/喇叭收听,评判音乐还原效果;
提示:建议先用单音音频(比如2000Hz的正弦波)的wav数据进行实验,通过DAC或PCM音频模块能够基本还原出原始正弦波声音后,再用语音和音乐信号进行实验。

一、DAC简介

DAC简介

DAC 为数字/模拟转换模块,故名思议,它的作用就是把输入的数字编码,转换成对应的模拟电压输出,它的功能与
ADC相反。在常见的数字信号系统中,大部分传感器信号被化成电压信号,而 ADC把电压模拟信号转换成易于计算机存储、处理的数字编码,由计
算机处理完成后,再由 DAC输出电压模拟信号,该电压模拟信号常常用来驱动某些执行器
件,使人类易于感知。如音频信号的采集及还原就是这样一个过程。 STM32具有片上 DAC外设,它的分辨率可配置为 8位或
12位的数字输入信号,具有两个 DAC 输出通道,这两个通道互不影响,每个通道都可以使用 DMA 功能,都具有出错检测能力,可外部触发。

1)STM32 的 DAC简介
STM32 的 DAC 主要特点

2 个 DAC 转换器:每个转换器对应 1 个输出通道
8 位或者 12 位单调输出
12 位模式下数据左对齐或者右对齐
同步更新功能
噪声波形生成
三角波形生成
双 DAC 通道同时或者分别转换
每个通道都有 DMA 功能

DAC输出电压计算

DAC输出 = VREF x (DOR / 4096)
其中DOR是对应的数字信号,VREF为参考电压。

2)DAC数字信号格式
如图,DAC 输出是受 DORx 寄存器直接控制的,但是我们不能直接往 DORx寄存器写入数据,而是通过 DHRx 间接的传给 DORx 寄存器,实现对 DAC 输出的控制。 而STM32 的 DAC 支持 8/12 位模式, 8 位模式的时候是固定的右对齐的,而 12 位模式可以设置左对齐/右对齐。即单 DAC 通道 x总共有 3 种情况:
8 位数据右对齐:用户将数据写入 DAC_DHR8Rx[7:0]位(实际是存入 DHRx[11:4]位)。

12 位数据左对齐:用户将数据写入 DAC_DHR12Lx[15:4]位(实际是存入 DHRx[11:0]位)。

12 位数据右对齐:用户将数据写入 DAC_DHR12Rx[11:0]位(实际是存入 DHRx[11:0]位)。
之后这些数据会传输到DORx 寄存器。

如果没有选中硬件触发(寄存器DAC_CR1的TENx位置’0′),存入寄存器DAC_DHRx的数据会在一个APB1时钟周期后自动传至寄存器DAC_DORx。 如果选中硬件触发(寄存器DAC_CR1的TENx位置’1′),数据传输在触发发生以后3个APB1时钟周期后完成。 一旦数据从DAC_DHRx寄存器装入DAC_DORx寄存器,在经过时间tSETTLING之后,输出即有效,这段时间的长短依电源电压和模拟输出负载的不同会有所变化。

二、Flash地址空间的数据读取

1、Flash原理

不同型号的 STM32,其 FLASH 容量也有所不同,最小的只有 16K 字节,最大的则达到了 1024K 字节。市面上 STM32F1 开发板使用的芯片是 STM32F103系列,其 FLASH 容量一般为 512K 字节,属于大容量芯片。

Flash的编程原理都是只能将1写为0,而不能将0写为1,所以在进行Flash编程前,必须将对应的块擦除,即将该块的每一位都变为1,块内所有字节变为0xFF。

STM32F1 的闪存(Flash)模块:主存储器、信息块、闪存存储器接口寄存器

①主存储器。该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。

②信息块。该部分分为 2 个小部分,其中启动程序代码,是用来存储 ST 自带的启动程序,用于串口下载代码,当 BOOT0 接 V3.3, BOOT1 接 GND 的时候,运行的就是这部分代码。用户选择字节,则一般用于配置写保护、读保护等功能。

③闪存存储器接口寄存器。该部分用于控制闪存读写等,是整个闪存模块的控制机构。对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。

在进行闪存写操作时,对闪存的任何读操作都会锁定总线,直到写操作完成后才能正确进行读操作,在写操作或擦除操作期间不能进行代码或数据读操作。

[En]

When performing a flash write operation, any read operation to the flash memory will lock the bus, and the read operation can not be carried out correctly until the write operation is completed, and the code or data reading operation cannot be carried out during the write or erase operation.

2、使用到的硬件及软件

STM32F103C8T6、STlink
软件:Keil、STM32CubeMX

三、建立工程

只需按照前面的步骤建立项目即可。

[En]

Just follow the previous steps to establish the project.

部分配置如下图
定时器配置

基于片内Flash的提示音播放程序
管脚配置,对应外设c8t6本身设计好的PC13 LED灯
基于片内Flash的提示音播放程序
对应的GPIO设置
基于片内Flash的提示音播放程序
设置堆栈大小
基于片内Flash的提示音播放程序
时钟配置
基于片内Flash的提示音播放程序

; 1、Keil代码撰写

工程源码链接(主:flash.h文件需要自己重新加入到路径中)
链接:https://pan.baidu.com/s/11Tn8TocHT8qithneDyKFIQ
提取码:pmvn

将事先准备好的flash.c 及flash.h加入到工程中

基于片内Flash的提示音播放程序
在main.c文件中添加部分代码
基于片内Flash的提示音播放程序
基于片内Flash的提示音播放程序
基于片内Flash的提示音播放程序
基于片内Flash的提示音播放程序

2、STlink调试说明

接线

ST-LINKSTM32SWCLK/TCKSWCLK/TCKSWDIO/TMSSWDIO/TMSGNDGNDVCCVCC

基于片内Flash的提示音播放程序

下载好响应的ST-Link驱动,上电,可以看到STLink在电脑上显示出来了(我这里需要安装驱动)

基于片内Flash的提示音播放程序

可以说明ST-Link 驱动已经安装完成。接下来只需要在 mdk 工程里面配置一下 ST-Link即可。

基于片内Flash的提示音播放程序
基于片内Flash的提示音播放程序

回到Keil下,在魔法棒Option选项卡进行设置

基于片内Flash的提示音播放程序
首先是选择调试器,如果使用的是 ST-Link,在 Debug 选项卡中,请选择ST-Link Debugger,如果你使用的是 JLINK,那么需要选择J-LINK/J-Trace Cortex。
基于片内Flash的提示音播放程序
在选择完调试器之后,点击右边的 Setting 按钮
基于片内Flash的提示音播放程序
如果右侧IDCODE有显示的话就是连接成功了

JTAG 模式和 SWD 模式使用方法都是一样的,不同的是,SWD 接口调试更加节省端口,一般情况下,为了节省更多的资源,建议大家使用 SWD 模式仿真。

之后,点红框的箭头就可以将程序烧录到stm32中

基于片内Flash的提示音播放程序
注意:使用st-link和keil进行烧录会严格检查stm32型号,如果不是对应的型号烧录会报错。

; 3、使用DAC输出周期2khz的正弦波

建议先用单音音频(比如2000Hz的正弦波)的wav数据进行实验,通过DAC或PCM音频模块能够基本还原出原始正弦波声音后,再用语言/音乐信号进行实验。
生成单音正弦波
文件—>新建—>音频文件

基于片内Flash的提示音播放程序
效果->生成->音调
基于片内Flash的提示音播放程序
文件->导出->设置导出为wav文件(我这里已经导出成功)
基于片内Flash的提示音播放程序
用UltraEdit得到相关数据
用UltraEdit打开刚才保存的wav文件
使用16进制复制刚才的wav文件
基于片内Flash的提示音播放程序

这里借用DAC生成正弦波的例程代码

链接:https://pan.baidu.com/s/18zsQG5mZXbjafPuAJEUkMg
提取码:706i
将内容复制到keil文件对应的位置,在下图红框中进行替换。

基于片内Flash的提示音播放程序
之后,编译并下载以查看是否可以观察到预期的正弦波。
[En]

After that, compile and download to see if the expected sine wave can be observed.

4、使用DAC输出数字音频歌曲数据转换为模拟音频波形输出 操作同上,采样率修改一下,其余烧录步骤都是一样的,不再赘述。

基于片内Flash的提示音播放程序
编辑代码后,将其烧录,并在音频模块的帮助下收听,看看是否可以恢复。
[En]

After editing the code, burn it and listen to it with the help of the audio module to see if it can be restored.

; 总结

学习了基于片内Flash的提示音播放程序的实现,了解到片内flash的作用。

参考

[1] https://blog.csdn.net/qq_40147893/article/details/107423621

[2] https://blog.csdn.net/lushoumin/article/details/87694389

[3] https://blog.csdn.net/zhanglifu3601881/article/details/96632971

[4] https://blog.csdn.net/Ace_Shiyuan/article/details/78196648

Original: https://blog.csdn.net/qq_46475595/article/details/122128519
Author: xxx-Tention
Title: 基于片内Flash的提示音播放程序

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/498455/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球