基于 STM32F103C8T6 对音频数据的 Flash 读取与 DAC 播放

文章内容

  1. STM32F103C8T6 的 Flash 地址空间的数据读取。
  2. STM32F103C8T6 自带的 DAC 通道,转换为模拟音频进行播放,并用示波器观察波形,用耳机/喇叭收听,评判音乐还原效果。

1 项目准备

1.1 具体要求

  1. Flash 地址空间的数据读取。 STM32F103C8T6 只有 20KB 内存(RAM)供程序代码和数组变量存放,因此,针对内部 Flash 的总计 64KB 存储空间(地址从 0x08000000 开始),运行一次写入 8KB 数据,总计复位运行代码 4 次,将 32KB 数据写入 Flash。并验证写入数据的正确性和读写速率。
    (用cubemx写stm32f103c8t6的内部Flash)

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

1.2 项目环境

软件准备

2 原理简介

硬件准备

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-LINKSTM32F103
SWCLK/TCKSWCLK/TCK
SWDIO/TMSSWDIO/TMS
GNDGND
VCCVCC
  • 连接好的实际电路图如下:
    在这里插入图片描述
  • 准备好 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 1View->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 的原理。这次任务的量很多,操作也很繁琐。

6 参考资料

  1. STM32 进阶教程 13 – FLASH的读写操作
  2. 使用STM32F103的DAC功能实现音频输出
  3. STM32F103的DAC——输出声音效果
  4. STM32F1C8T6音频数据的Flash读取与DAC播放
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值