Flash地址空间的数据读取及DAC 实现音频输出——STM32

一、STM32 的内部 FLASH 简介

一、STM32 的内部 FLASH 简介
在 STM32 芯片内部有一个 FLASH 存储器,它主要用于存储代码,我们在电脑上编写好应用程序后,使用下载器把编译后的代码文件烧录到该内部 FLASH 中,由于 FLASH 存储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部 FLASH 中加载代码并运行。

根据用途,STM32 片内的 FLASH 分成两部分:主存储块和信息块。
主存储块用于存储程序,我们写的程序一般存储在这里;
信息块又分成两部分:系统存储器、选项字节。 系统存储器存储用于存放在系统存储器自举模式下的启动程序(BootLoader),当使用 ISP 方式加载程序时,就是由这个程序执行。这个区域由芯片厂写入 BootLoader,然后锁死,用户是无法改变这个区域的。 选项字节存储芯片的配置信息及对主存储块的保护信息。
在这里插入图片描述
除了使用外部的工具(如下载器)读写内部 FLASH 外,STM32 芯片在运行的时候,也能对自身的内部 FLASH 进行读写,因此,若内部 FLASH 存储了应用程序后还有剩余的空间,我们可以把它像外部 SPI-FLASH 那样利用起来,存储一些程序运行时产生的需要掉电保存的数据。

由于访问内部 FLASH 的速度要比外部的 SPI-FLASH 快得多,所以在紧急状态下常常会使用内部 FLASH 存储关键记录;为了防止应用程序被抄袭,有的应用会禁止读写内部FLASH 中的内容,或者在第一次运行时计算加密信息并记录到某些区域,然后删除自身的部分加密代码,这些应用都涉及到内部 FLASH 的操作。

二、工程验证

flash工程下载链接:https://pan.baidu.com/s/11Tn8TocHT8qithneDyKFIQ
提取码:pmvn

下载完成后打开文件夹,将路径stm32_Flash\Drivers\CMSIS\Device\ST\STM32F1xx\Include下的system_stm32f1xx_20190722_092746.h文件修改为system_stm32f1xx.h,否则后面编译会报错

在这里插入图片描述
修改好后,打开工程,可以将想要存入Flash中的内容修改为自定义内容

uint8_t FlashTest[] = "Hello!631907030405";

编译无报错在这里插入图片描述
进行程序调试前,先完成配置:
注意:下载的工程代码调试用的是硬件 st-link debuger,不是软件仿真,因此用软件仿真做,可能情况略有不同(小编这里软件仿真就没有出现结果)
点击Options->Debug->右边使用硬件ST-Link Debugger
在这里插入图片描述
接着点击S T-Link Debugger右边的Settings

进入到Cortex-M Target Driver Setup的Debug页面,其中的Port选择为SW在这里插入图片描述
依次点击Flash Download->勾选Reset and Run->Add->选择STM32F10x Med-density Flash->Add->确定即可在这里插入图片描述
最后点击OK完成硬件配置

由于要连接硬件ST-Link,所以要下载一个STLink驱动,不然下载不成功
链接:https://pan.baidu.com/s/13k0PVQfg5qAHXBKJ2IZiYA
提取码:1234
连线如下图
在这里插入图片描述
点击左上角的LOAD按钮将程序下载到STM32中
现在点击dubug按钮,进入硬件仿真调试
在这里插入图片描述
点击View->memory windows->memory 1打开内存观察窗口,并在地址栏中输入:0x800C000,观察将要修改的flash区间区容:在这里插入图片描述
在这里插入图片描述
其中点击某一字符右击可选择显示格式
在这里插入图片描述
继续View->Watch windows->Watch 1打开一个变量观察窗口
在这里插入图片描述
将变量FlashWBuff 和FlashRBuff加入到Watch 1观察窗口在这里插入图片描述

在这里插入图片描述
另外View->勾选Periodic Windows Update,开启变量自动更新在这里插入图片描述
按如图所示的全速运行按钮或者F5
在这里插入图片描述

这时就可以看到Watch 1窗口的数组FlashRBuff中的内容与数组FlashWBuff中的内容是一样的在这里插入图片描述
同时在Memory 1窗口中可以看到在FLASH地址0x0800C000区成功写入对应内容
在这里插入图片描述

断电后再重新上电进行调试,程序停在main入口处时还可以看到Flash对应区间的内容保持上一次写入内容值
在这里插入图片描述

三 、DAC

1、 DAC简介

DAC为数字/模拟转换模块,顾名思义,它的作用就是把输入的数字编码,转换成对应的模拟电压输出,它的功能与ADC相反。在常见的数字信号系统中,大部分传感器信号被化成电压信号,而ADC把电压模拟信号转换成易于计算机存储、处理的数字编码,由计算机处理完成后,再由DAC输出电压模拟信号,该电压模拟信号常常用来驱动某些执行器件,使人类易于感知。如音频信号的采集及还原就是这样一个过程。

STM32具有片上DAC外设,它的分辨率可配置为8位或12位的数字输入信号,具有两个DAC输出通道,这两个通道互不影响,每个通道都可以使用DMA功能,都具有出错检测能力,可外部触发。

2、DAC功能框图剖析

STM32的DAC模块框图如下:

在这里插入图片描述
整个DAC模块围绕框图下方的 “数字至模拟转换器x” 展开,它的左边分别是参考电源的引脚:VDDA、VSSA及Vref+,其中STM32的DAC规定了它的参考电压Vref+输入范围 为2.4~3.3V。“数字至模拟转换器x” 的输入为 DAC 的数据寄存器 “DORx” 的数字编码,经过它转换得的模拟信号由图中右侧的 “DAC_OUTx” 输出。而数据寄存器 “DORx” 又受“控制逻辑”支配,它可以控制数据寄存器加入一些伪噪声信号或配置产生三角波信号。

图中的左上角为DAC的触发源,DAC根据触发源的信号来进行DAC转换,其作用就相当于DAC转换器的开关,它可以配置的触发源为外部中断源触发、定时器触发或软件控制触发。

STM32的DAC外设有固定的输出通道,分别为PA4和PA5,因此实验时直接使用示波器测量PA4和PA5引脚的输出即可。

关于更多DAC的了解可去 野火 STM32 HAL库开发实战指南第37节:DAC—输出正弦波

四、使用DAC输出周期2kHz的正弦波

本次实验所用到软件及工程下载链接:https://pan.baidu.com/s/1gEATonRXK7km3yf-Mu0eEQ
提取码:1234
1、使用Adobe Audition输出一个周期2khz的正弦波
①选择文件->新建->音频文件
在这里插入图片描述

②设置好文件名、采样率为2000Hz,选择声道为单声道,位深度为16在这里插入图片描述
③选择效果->生成基本音色在这里插入图片描述
④将生成基本音色界面进行如下修改,点击确定即可在这里插入图片描述
⑤点击文件->导出->文件,将其导出为wav文件在这里插入图片描述
在这里插入图片描述

2、打开软件 WavToC,它可以将一个将WAV文件转化成C语言代码的文件
在这里插入图片描述
点击右下角的打开文件在这里插入图片描述
找到我们刚刚导出的.wav文件在这里插入图片描述
点击生成代码,便自动生成出了代码在这里插入图片描述
部分数据如下图所示:在这里插入图片描述
另外还可以点击试听,试听一下是不是正确的声音,比如这里的正弦波会发出嘟——的声音在这里插入图片描述

最后点击保存代码即可在这里插入图片描述
可以看到会在保存路径下生成一个.h文件,里面有音频文件生成的数据在这里插入图片描述
3、打开野火例程的DAC输出正弦波工程

打开bsp_dac.c文件,将正弦波数据换成音频文件生成的数据,这里可以适当删减一部分,修改为POINT_NUM适合的大小在这里插入图片描述
修改后如下:在这里插入图片描述
修改好后进行编译,烧录进硬件中就可以使用示波器观察输出波形了。
注意:这里因为条件有限,没有示波器,因此就没有进行最后一步。

五、使用DAC将数字音频歌曲数据转换为模拟音频波形输出

1、使用Adobe Audition截取一段喜欢的音乐
①选择文件->打开,找到对应的音乐文件
②选中一段,然后右键,选择存储选区为…在这里插入图片描述

③接着点击更改转换采样类型在这里插入图片描述
最后点击确定生成.wav文件
2、打开软件 WavToC,将.wav文件转化成C语言代码的文件
具体步骤跟上例一样,这里不多做阐述
打开.wav文件,点击生成代码便可转换输出数据,保存代码即可在这里插入图片描述
然后就可以使用生成的数据和工程进行波形验证了(这里缺少硬件设备,便无结果展示)

六、小结

由于硬件条件有限,没有具体的硬件展示,但在理论上代码没有问题。我还了解了flash的工作原理。

七、参考链接

https://blog.csdn.net/qq_54496810/article/details/122239610?spm=1001.2014.3001.5501

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值