文章内容
:
- STM32F103C8T6 的 Flash 地址空间的数据读取。
- STM32F103C8T6 自带的 DAC 通道,转换为模拟音频进行播放,并用示波器观察波形,用耳机/喇叭收听,评判音乐还原效果。
目录
1 项目准备
1.1 具体要求
-
Flash 地址空间的数据读取。 STM32F103C8T6 只有 20KB 内存(RAM)供程序代码和数组变量存放,因此,针对内部 Flash 的总计 64KB 存储空间(地址从 0x08000000 开始),运行一次写入 8KB 数据,总计复位运行代码 4 次,将 32KB 数据写入 Flash。并验证写入数据的正确性和读写速率。
(用cubemx写stm32f103c8t6的内部Flash) -
基于片内 Flash 的提示音播放程序。
1)实验数据准备:用 Adobe audition 或 goldwave 等音频编辑软件录制“您好欢迎光临!”的几秒钟的声音(8khz 采样、8bit 量化编码的单声道wav格式),确保音频数据尽量小(最大不超 64KB)。然后编程将其分批次写入 STM32F103C8T6 芯片内部 Flash 区域。
2)数字音频还原播放任务:编程读取此段音频,分别通过 STM32F103C8T6 自带的 DAC 通道,转换为模拟音频进行播放,并用示波器观察波形,用耳机/喇叭收听,评判音乐还原效果;
提示:
建议先用单音音频(比如 2000Hz 的正弦波)的 wav 数据进行实验,通过 DAC 或 PCM 音频模块能够基本还原出原始正弦波声音后,再用语音和音乐信号进行实验。
1.2 项目环境
软件准备:
- STM32CubeMX
- Keil 5
- Adobe audition 2022
(安装链接:https://mp.weixin.qq.com/s/S7IlVsRJZ_j1oq9W1X4ZxA) - UltraEdit
(安装链接:https://pan.baidu.com/s/176szE42lpj2OQ-9Cm8vUgQ 提取码:luha) - notepad++
(安装链接:https://pan.baidu.com/s/1kbYTzH1IqNJRgKwhN3K7zw 提取码:luha)
2 原理简介
硬件准备:
- STM32F103C8T6 核心板
- STlink(安装链接:https://pan.baidu.com/s/1XeKTh1VNQo4JapX7HpGjsw 提取码:luha )
2.1 STM32 的内部 FLASH
- 在 STM32 芯片内部有一个 FLASH 存储器,它主要用于存储代码,我们在电脑上编写好应用程序后,使用下载器把编译后的代码文件烧录到该内部 FLASH 中,由于 FLASH 存储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部 FLASH 中加载代码并运行。
- STM32 的内部框架图
2.2 STM32 的 DAC 通道
2.2.1 何为 DAC
- DAC 为数字/模拟转换模块,故名思议,它的作用就是把输入的数字编码,转换成对应的模拟电压输出,它的功能与 ADC 相反。在常见的数字信号系统中,大部分传感器信号被化成电压信号,而 ADC 把电压模拟信号转换成易于计算机存储、处理的数字编码,由计算机处理完成后,再由 DAC 输出电压模拟信号,该电压模拟信号常常用来驱动某些执行器件,使人类易于感知。如音频信号的采集及还原就是这样一个过程。
- STM32 具有片上 DAC 外设,它的分辨率可配置为 8 位或 12 位的数字输入信号,具有两个 DAC 输出通道,这两个通道互不影响,每个通道都可以使用 DMA 功能,都具有出错检测能力,可外部触发。
2.2.2 STM32 的 DAC 模块
DAC 功能框图:
整个 DAC 模块围绕框图下方的“数字至模拟转换器 x”展开,它的左边分别是参考电源的引脚:𝑉𝐷𝐷𝐴、𝑉𝑆𝑆𝐴 及 𝑉𝑟𝑒𝑓+,其中 STM32 的 DAC 规定了它的参考电压 𝑉𝑟𝑒𝑓+ 输入范围为 2.4——3.3V。“数字至模拟转换器 x”的输入为 DAC 的数据寄存器“DORx”的数字编码,经过它转换得的模拟信号由图中右侧的“DAC_OUTx”输出。而数据寄存器“DORx”又受“控制逻辑”支配,它可以控制数据寄存器加入一些伪噪声信号或配置产生三角波信号。
更多详细介绍可以参考资料:零死角玩转STM32—F103指南者 提取码:luha
3 Flash 地址空间的数据读取
3.1 利用 CubeMX 创建工程
- 配置 SYS
- 配置 RCC
- 配置引脚
- 设置堆栈大小
- 导出后打开
3.2 keil 添加文件
工程源码链接(注意:flash.h文件需要自己重新加入到路径中)
链接:https://pan.baidu.com/s/1X2U1c_oLlJ9gyqeRgakoVw
提取码:luha
-
将 flash.c 及 flash.h 加入到工程中
-
在 main.c 文件中添加如下部分代码
-
点击编译,接着使用 ST-Link 调试
3.3 STLink 调试
3.3.1 STLink 连接并烧录
- STLink 与 STM32F103 接线
ST-LINK | STM32F103 |
---|---|
SWCLK/TCK | SWCLK/TCK |
SWDIO/TMS | SWDIO/TMS |
GND | GND |
VCC | VCC |
- 连接好的实际电路图如下:
- 准备好 ST-Link 驱动
【链接:https://pan.baidu.com/s/1XeKTh1VNQo4JapX7HpGjsw 提取码:luha 】
将 BOOT1 置 0,上电之后,可以在设备管理器中看到 STLink 已经连接成功
- 配置 Keil 工程
点击魔法棒
设置,选择ST-Link Debugger
调试器
再点击 Setting 按钮,可见右侧 IDCODE 有显示,表示连接成功
- 点击烧录按键
可见烧录成功。
3.3.2 调试
- 点击
debug
,依次点击View->memory windows->memory 1
,打开内存观察窗口,并在地址栏中输入:0x800c000,观察将要修改的 flash 区间区容:
- 依次点击
View->Watch windows->Watch 1
,View->Watch windows->Watch 2
,打开两个变量观察窗口,将变量 FlashWBuff 和 FlashRBuff 分别加入到 Watch 1 观察窗口和 Watch 2 观察窗口:
- 点击全速运行程序,可以看到数组 FlashRBuff 中内容与数组 FlashWBuff 中内容一致
4 基于 Flash 的提示音 DAC 播放
4.1 使用 DAC 产生 2khz 周期的正弦波输出
建议先用单音音频(比如 2000Hz 的正弦波)的wav 数据进行实验,通过 DAC 或 PCM 音频模块能够基本还原出原始正弦波声音后,再用语音和音乐信号进行实验。
-
新建文件
依次点击文件->新建->音频文件
,完成下图所示修改
-
依次点击
效果->生成->音调
,出现下面视图
-
修改如图所示的配置,并点击确定
-
依次点击
文件->导出->文件
,设置导出为 wav 文件
-
用 UltraEdit 打开刚才保存的wav文件,界面视图如下
-
点击
CTRL+A
全选,鼠标右键
,选择十六进制复制选定视图
-
将内容粘贴到一个新建文件中
-
在新建文件中,
CTRL+A
,鼠标右键
,选择范围
,输入起始的行号和列号,选择内容
-
复制到 notepad++ 中
-
在需要添加内容的位置,点击
alt+c
-
添加结果如下:
-
删除不需要的尾行,将该文本复制下来。
-
打开打开野火提供的样例程序——DAC 输出正弦波。
(链接:https://pan.baidu.com/s/1ixWoW8xyMe3_hyWXpkd_Tg
提取码:luha) -
将文本复制到 keil 文件的 uint16_t Sine12bit[] 数组中去,并删掉中括号里面的数据。
-
编译工程文件,无错
-
烧录
-
最后用示波器显示波形
4.2 使用 DAC 输出数字音频歌曲数据转换为模拟音频波形输出
- 使用 Audition 截取一段喜欢的音乐
选择文件->打开
,找到对应的音乐 - 选中一段,然后右键,选择存储选区,接着更改采用类型
- 使用 UltraEdit 得到相关数据
做法同上 - 使用 notepad++ 添加相关内容
做法同上 - 添加数据
做法同上 - 编译烧录
- 使用示波器观察得到的波形
5 总结
本文学习了 STM32F103C8T6 对音频数据的 Flash 读取与 DAC 播放,了解了 Flash 的原理。这次任务的量很多,操作也很繁琐。