STM32最小板完成音频数据的读取与DAC播放

目录

一、Flash简单介绍

1、Flash操作流程与操作选址

1.1、Flash操作流程

1.2 、如何查找并选定要写入Flash十六进制地址

2、Flash读写等相关原理

2.1、闪存的读取

2.2、闪存的编程和擦除

二、工程文件建立 

1、CubeMX建立工程

2、代码编写

3、STlink连接说明

三、调制结果演示 

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

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

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

五、总结

六、参考资料


一、Flash简单介绍

1、Flash操作流程与操作选址

1.1、Flash操作流程

Flash的存储方式为直接对地址进行存取,其大致流程如下:

(1)、确定要写入Flash的首地址(稍后介绍确定地址的方法)
(2)、解锁Flash
(3)、对Flash进行操作(写入数据)
(4)、对Flash重新上锁

1.2 、如何查找并选定要写入Flash十六进制地址

对于Flash的地址选取,想要进行安全读写的话可以根据自己的STM32 MCU型号,查找数据手册,确定Flash的地址区段,因为起始段会存储代码,所以一定要避开起始段,以避免数据错误。(根据大佬的建议:可以先根据Flash大小计算Flash的最末尾地址,往前推一段地址空间,在这里一般不会对代码中的数据产生覆盖等影响)

2、Flash读写等相关原理

2.1、闪存的读取

STM32F1 可通过内部的 I-Code 指令总线或 D-Code 数据总线访问内置闪存模块,本章我们主要讲解数据读写,即通过 D-Code 数据总线来访问内部闪存模块。为了准确读取 Flash 数据,必须根据 CPU 时钟 (HCLK) 频率和器件电源电压在 Flash 存取控制寄存器 (FLASH_ACR)中正确地设置等待周期数(LATENCY)。当电源电压低于 2.1V 时,必须关闭预取缓冲器。

等待周期通过 FLASH_ACR 寄存器的 LATENCY[2:0]三个位设置。系统复位后, CPU 时钟频率为内部 16M RC 振荡器, LATENCY 默认是 0,即 1 个等待周期。供电电压,我们一般是 3.3V,所以,在我们设置 72Mhz 频率作为 CPU 时钟之前,必须先设置 LATENCY 为 3,否则 FLASH 读写可能出错,导致死机。STM23F1 的 FLASH 读取是很简单的。例如,我们要从地址 addr,读取一个字(字节为 8 位,半字为 16 位,字为 32 位),可以使用如下方法来读取:data=*(vu32*)addr;

将 addr 强制转换为 vu32 指针,然后取该指针所指向的地址的值,即得到了 addr 地址内的值。类似的,将上面的 vu32 改为 vu16,即可读取指定地址的一个半字。

2.2、闪存的编程和擦除

STM32 的闪存编程是由 FPEC(闪存编程和擦除控制器)模块处理的,这个模块包含 7 个 32 位寄存器,

STM32 复位后, FPEC 模块是被保护的,不能写入 FLASH_CR 寄存器;通过写入特定的序列到 FLASH_KEYR 寄存器可以打开 FPEC 模块(即写入 KEY1 和KEY2),只有在写保护被解除后,我们才能操作相关寄存器。

STM32 闪存的编程每次必须写入 16 位(不能单纯的写入 8 位数据),当FLASH_CR 寄存器的 PG 位为’1’时,在一个闪存地址写入一个半字将启动一次编程;写入任何非半字的数据, FPEC 都会产生总线错误。在编程过程中(BSY 位为’1’ ),任何读写闪存的操作都会使 CPU 暂停,直到此次闪存编程结束。

同样,STM32 的 FLASH 在编程的时候,也必须要求其写入地址的 FLASH 是被擦除了的(也就是其值必须是 0XFFFF),否则无法写入,在 FLASH_SR 寄存器的 PGERR 位将得到一个警告。

对于闪存的擦除,参考资料:https://blog.csdn.net/lushoumin/article/details/87694389

二、工程文件建立 

1、CubeMX建立工程

编辑管脚

 

GPIO管脚设置

 

中断配置

调整堆栈大小

保存文件斌记住位置。 

2、代码编写

打开工程,添加flash.h文件( flash.h文件放在INC文件夹下即可)

源码链接:https://pan.baidu.com/s/11Tn8TocHT8qithneDyKFIQ
提取码:pmvn

修改main函数

 

编译完成无误后,准备ST-LINK烧录工作。

3、STlink连接说明

首先需要电脑下载ST-LINK连接工具,然后再进行下列操作。

ST-LINK STM32
SWCLK/TCK SWCLK/TCK
SWDIO/TMS SWDIO/TMS
GND GND
VCC VCC

 回到Keil下,在魔法棒Option选项卡进行设置
首先是选择调试器,如果使用的是 ST-Link,在 Debug 选项卡中

如果右侧IDCODE有显示的话就是连接成功了

连接完毕后,选择keil的load下载完成。

三、调制结果演示 

View->Watch windows->Watch 1打开一个变量观察窗口,将变量FlashWBuff 和 FlashRBuff加入到 Watch 1 观察窗口

View->memory windows->memory 1打开内存观察窗口,并在地址栏中输入:0x800c000,观察将要修改的flash区间区容:

由于我这里是之前已经调试过一遍,所以在输入该地址时就直接显示了(没有做过的需要全速运行一遍,然后就可以观察到结果了);不过从侧面说明,当断电过后重新运行之后,STM32 的 FLASH 在编程的时候,也必须要求其写入地址的 FLASH 是被擦除了的(也就是其值必须是 0XFFFF),否则无法写入。

观察起始位置的数据0x0800C000

 通过上面观察,可以刚好验证上面的结论。

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

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

1.1、下载安装好后Adobe Audition打开

新建一个音频文件首先用来测试。

 

由于接下来是采用正弦波进行测试,所以我取名为sinx

 导出为wav文件。

用UltraEdit打开刚才保存的wav文件 

 CTRL+A,接着鼠标右键,选择 十六进制复制选定视图,将内容粘贴到一个新建文件中
在新建文件中,CTRL+A,接着鼠标右键,选择范围输入起始的行号和列号,确定就选中了整个我们需要的内容

鼠标右键-选择范围

复制到notepad++中

 

也可以在需要添加内容的位置,alt+c

多次重复添加。

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

链接:https://pan.baidu.com/s/18zsQG5mZXbjafPuAJEUkMg
提取码:706i

将内容复制到keil文件对应的位置,在下图红框中进行替换。

 编译,看能否得到预期的波形。

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

1.使用Audition截取一段喜欢的音乐
①选择文件->打开,找到对应的音乐
②选中一段,然后右键,选择存储选区,接着更改采用类型

 

 2.使用UltraEdit得到相关数据
方法跟上面一样
3.使用notepad++添加相关内容
方法跟上面一样,借助音频模块听听看能否还原。

五、总结

本次了解到了flash的存储原理以及初识了ADC软件并播放音乐。

六、参考资料

https://blog.csdn.net/qq_43279579/article/details/111990896

https://blog.csdn.net/qq_46467126/article/details/122098829 

https://blog.csdn.net/qq_40147893/article/details/107423621 

 

 

 

 

 

 

 

 

 

 

版权声明:本文为CSDN博主「Lc-Yusheng」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_47946816/article/details/122223745

目录

一、Flash简单介绍

1、Flash操作流程与操作选址

1.1、Flash操作流程

1.2 、如何查找并选定要写入Flash十六进制地址

2、Flash读写等相关原理

2.1、闪存的读取

2.2、闪存的编程和擦除

二、工程文件建立 

1、CubeMX建立工程

2、代码编写

3、STlink连接说明

三、调制结果演示 

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

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

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

五、总结

六、参考资料


一、Flash简单介绍

1、Flash操作流程与操作选址

1.1、Flash操作流程

Flash的存储方式为直接对地址进行存取,其大致流程如下:

(1)、确定要写入Flash的首地址(稍后介绍确定地址的方法)
(2)、解锁Flash
(3)、对Flash进行操作(写入数据)
(4)、对Flash重新上锁

1.2 、如何查找并选定要写入Flash十六进制地址

对于Flash的地址选取,想要进行安全读写的话可以根据自己的STM32 MCU型号,查找数据手册,确定Flash的地址区段,因为起始段会存储代码,所以一定要避开起始段,以避免数据错误。(根据大佬的建议:可以先根据Flash大小计算Flash的最末尾地址,往前推一段地址空间,在这里一般不会对代码中的数据产生覆盖等影响)

2、Flash读写等相关原理

2.1、闪存的读取

STM32F1 可通过内部的 I-Code 指令总线或 D-Code 数据总线访问内置闪存模块,本章我们主要讲解数据读写,即通过 D-Code 数据总线来访问内部闪存模块。为了准确读取 Flash 数据,必须根据 CPU 时钟 (HCLK) 频率和器件电源电压在 Flash 存取控制寄存器 (FLASH_ACR)中正确地设置等待周期数(LATENCY)。当电源电压低于 2.1V 时,必须关闭预取缓冲器。

等待周期通过 FLASH_ACR 寄存器的 LATENCY[2:0]三个位设置。系统复位后, CPU 时钟频率为内部 16M RC 振荡器, LATENCY 默认是 0,即 1 个等待周期。供电电压,我们一般是 3.3V,所以,在我们设置 72Mhz 频率作为 CPU 时钟之前,必须先设置 LATENCY 为 3,否则 FLASH 读写可能出错,导致死机。STM23F1 的 FLASH 读取是很简单的。例如,我们要从地址 addr,读取一个字(字节为 8 位,半字为 16 位,字为 32 位),可以使用如下方法来读取:data=*(vu32*)addr;

将 addr 强制转换为 vu32 指针,然后取该指针所指向的地址的值,即得到了 addr 地址内的值。类似的,将上面的 vu32 改为 vu16,即可读取指定地址的一个半字。

2.2、闪存的编程和擦除

STM32 的闪存编程是由 FPEC(闪存编程和擦除控制器)模块处理的,这个模块包含 7 个 32 位寄存器,

STM32 复位后, FPEC 模块是被保护的,不能写入 FLASH_CR 寄存器;通过写入特定的序列到 FLASH_KEYR 寄存器可以打开 FPEC 模块(即写入 KEY1 和KEY2),只有在写保护被解除后,我们才能操作相关寄存器。

STM32 闪存的编程每次必须写入 16 位(不能单纯的写入 8 位数据),当FLASH_CR 寄存器的 PG 位为’1’时,在一个闪存地址写入一个半字将启动一次编程;写入任何非半字的数据, FPEC 都会产生总线错误。在编程过程中(BSY 位为’1’ ),任何读写闪存的操作都会使 CPU 暂停,直到此次闪存编程结束。

同样,STM32 的 FLASH 在编程的时候,也必须要求其写入地址的 FLASH 是被擦除了的(也就是其值必须是 0XFFFF),否则无法写入,在 FLASH_SR 寄存器的 PGERR 位将得到一个警告。

对于闪存的擦除,参考资料:https://blog.csdn.net/lushoumin/article/details/87694389

二、工程文件建立 

1、CubeMX建立工程

编辑管脚

 

GPIO管脚设置

 

中断配置

调整堆栈大小

保存文件斌记住位置。 

2、代码编写

打开工程,添加flash.h文件( flash.h文件放在INC文件夹下即可)

源码链接:https://pan.baidu.com/s/11Tn8TocHT8qithneDyKFIQ
提取码:pmvn

修改main函数

 

编译完成无误后,准备ST-LINK烧录工作。

3、STlink连接说明

首先需要电脑下载ST-LINK连接工具,然后再进行下列操作。

ST-LINK STM32
SWCLK/TCK SWCLK/TCK
SWDIO/TMS SWDIO/TMS
GND GND
VCC VCC

 回到Keil下,在魔法棒Option选项卡进行设置
首先是选择调试器,如果使用的是 ST-Link,在 Debug 选项卡中

如果右侧IDCODE有显示的话就是连接成功了

连接完毕后,选择keil的load下载完成。

三、调制结果演示 

View->Watch windows->Watch 1打开一个变量观察窗口,将变量FlashWBuff 和 FlashRBuff加入到 Watch 1 观察窗口

View->memory windows->memory 1打开内存观察窗口,并在地址栏中输入:0x800c000,观察将要修改的flash区间区容:

由于我这里是之前已经调试过一遍,所以在输入该地址时就直接显示了(没有做过的需要全速运行一遍,然后就可以观察到结果了);不过从侧面说明,当断电过后重新运行之后,STM32 的 FLASH 在编程的时候,也必须要求其写入地址的 FLASH 是被擦除了的(也就是其值必须是 0XFFFF),否则无法写入。

观察起始位置的数据0x0800C000

 通过上面观察,可以刚好验证上面的结论。

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

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

1.1、下载安装好后Adobe Audition打开

新建一个音频文件首先用来测试。

 

由于接下来是采用正弦波进行测试,所以我取名为sinx

 导出为wav文件。

用UltraEdit打开刚才保存的wav文件 

 CTRL+A,接着鼠标右键,选择 十六进制复制选定视图,将内容粘贴到一个新建文件中
在新建文件中,CTRL+A,接着鼠标右键,选择范围输入起始的行号和列号,确定就选中了整个我们需要的内容

鼠标右键-选择范围

复制到notepad++中

 

也可以在需要添加内容的位置,alt+c

多次重复添加。

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

链接:https://pan.baidu.com/s/18zsQG5mZXbjafPuAJEUkMg
提取码:706i

将内容复制到keil文件对应的位置,在下图红框中进行替换。

 编译,看能否得到预期的波形。

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

1.使用Audition截取一段喜欢的音乐
①选择文件->打开,找到对应的音乐
②选中一段,然后右键,选择存储选区,接着更改采用类型

 

 2.使用UltraEdit得到相关数据
方法跟上面一样
3.使用notepad++添加相关内容
方法跟上面一样,借助音频模块听听看能否还原。

五、总结

本次了解到了flash的存储原理以及初识了ADC软件并播放音乐。

六、参考资料

https://blog.csdn.net/qq_43279579/article/details/111990896

https://blog.csdn.net/qq_46467126/article/details/122098829 

https://blog.csdn.net/qq_40147893/article/details/107423621 

 

 

 

 

 

 

 

 

 

 

版权声明:本文为CSDN博主「Lc-Yusheng」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_47946816/article/details/122223745

生成海报
点赞 0

Lc-Yusheng

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

将音频编解码器添加到嵌入式系统的 5 个技巧

嵌入式系统播放音频的能力正在成为一个相当普遍的功能。音频为用户提供了很好的反馈,但如今有如此多的高保真音频可用,使用哔哔声和啁啾声不再削减它。开发人员当然可以使用分立组件和 DAC 从系统中获得不错的音频&#xff0