STM32 音频数据的Flash读取与DAC播放

STM32 音频数据的Flash读取与DAC播放

    • STM32 音频数据的Flash读取与DAC播放
  • 一、题目内容
  • 二、Flash地址空间数据读取
    • 1、原理
    • 2、工程
    • 3、STlink调试说明
    • 4、修改
    • 5、调试
  • 三、基于片内Flash的提示音播放程序
    • 1、用DAC输出周期2KHZ的正弦波
    • 2、用DAC输出数字音频歌曲数据转换为模拟音频波形输出
  • 四、实验总结
  • 五、参考

一、题目内容

  1. (简答题)
    预备实验:
    1)在SD卡创建一个test-speed.txt文件,循环(不加延时)分批一次写入256字节,累计写入不少于64KB字节;然后读取此文件数据,通过串口显示出来。分析写入和读取的速率。
    2)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)数字音频还原播放任务:编程读取此段音频,分别通过 (a)stm32f103c8t6自带的DAC通道,转换为模拟音频进行播放,并用示波器观察波形,用耳机/喇叭收听,评判音乐还原效果;
提示:建议先用单音音频(比如2000Hz的正弦波)的wav数据进行实验,通过DAC或PCM音频模块能够基本还原出原始正弦波声音后,再用语音和音乐信号进行实验。

二、Flash地址空间数据读取

1、原理

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

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

STM32F1 的闪存(Flash)模块:主存储器、信息块、闪存存储器接口寄存器。
**(1)主存储器:**该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。
**(2)信息块:**该部分分为 2 个小部分,其中启动程序代码,是用来存储 ST 自带的启动程序,用于串口下载代码,当 BOOT0 接 V3.3, BOOT1 接 GND 的时候,运行的就是这部分代码。用户选择字节,则一般用于配置写保护、读保护等功能。
**(3)闪存存储器接口寄存器:**该部分用于控制闪存读写等,是整个闪存模块的控制机构。对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。
在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。

除了使用外部的工具(如下载器)读写内部 FLASH 外,STM32 芯片在运行的时候,也能对自身的内部 FLASH 进行读写,因此,若内部 FLASH 存储了应用程序后还有剩余的空间,我们可以把它像外部 SPI-FLASH 那样利用起来,存储一些程序运行时产生的需要掉电保存的数据。
由于访问内部 FLASH 的速度要比外部的 SPI-FLASH 快得多,所以在紧急状态下常常会使用内部 FLASH 存储关键记录;为了防止应用程序被抄袭,有的应用会禁止读写内部FLASH 中的内容,或者在第一次运行时计算加密信息并记录到某些区域,然后删除自身的部分加密代码,这些应用都涉及到内部 FLASH 的操作。

2、工程

这里可以放上别人的网盘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! 631907030416";


编译成功,没有报错

3、STlink调试说明

接线:

4、修改

在电脑上下载好响应的ST-Link驱动,上电,可以看到STLink在电脑上显示出来。

可以说明ST-Link 驱动已经安装完成。接下来只需要在 mdk 工程里面配置一下 ST-Link即可。
回到Keil下,在魔法棒Option选项卡进行设置
首先是选择调试器,如果使用的是 ST-Link,在 Debug 选项卡中,请选择ST-Link Debugger,如果你使用的是 JLINK,那么需要选择J-LINK/J-Trace Cortex。

在选择完调试器之后,点击右边的 Setting 按钮

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

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

之后,点红框的箭头就可以将程序烧录到stm32中
注意:使用st-link和keil进行烧录会严格检查stm32型号,如果不是对应的型号烧录会报错。

OK了

5、调试

进入debug,如果是仿真调试的话,实际操作发现数组没有产生变化。
于是又用STlink又试了一下,以下主要是STlink调试的过程。

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

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

全速运行程序,可以看到数组FlashRBuff中内容与数组FlashWBuff中内容一样了。

在Memory 1窗口中可以看到在FLASH地址0x0800C000区成功写入对应内容。

断电,重新上电后再次调试,程序刚停在main入口处时还可以看到Flash对应区间的内容保持上一次写入内容值。

重复读写入,这里没什么变化。

可以看一下起始位置的数据0x08000000

之后的FF说明数据没有再写入覆盖了。

通过内部flash的学习,以后基于STM32开发就可以省去一些外部flash或EEPROM了。
要想选定安全的Flash地址进行读写,可以根据自己的STM32 MCU型号,查找数据手册,确定FLASH的地址区段,因为起始段会存储代码,所以一定要避开起始段,以避免数据错误。(一般是根据Flash大小计算Flash的最末尾地址,往前推一段地址空间,在这里一般不会对代码中的数据产生覆盖等影响)

此次操作Flash使用的MCU是STM32F103C8T6,以该型号MCU为例进行描述:

在数据手册中,可以看到STM32F103C8T6的flash起始地址是0x0800 0000(如下图所示),而STM32F103C8T6的Flash大小为64K,可以计算出STM32F103C8T6的Flash地址范围是:0x0800 0000——0x0800 FFFF(计算方法参考另一篇博客:STM32内存大小与地址的对应关系以及计算方法)。这里选取0x0800 F000作为读写操作的起始地址,对于C8T6这款MCU,操作这个起始地址应该算是很安全的范围了。

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

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

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

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

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

效果->生成->音调


文件->导出->设置导出为wav文件

用UltraEdit得到相关数据
用UltraEdit打开刚才保存的wav文件

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

这里借用DAC生成正弦波的例程代码
将内容复制到keil文件对应的位置,在下图这进行替换。

之后,编译下载,看能否观察到预期的正弦波。

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

采样率修改

编辑好代码后,烧录,借助音频模块听听看能否还原。
这里由于没有音频播放模块。

四、实验总结

通过这次实验,我们可以了解到很多关于flash的相关知识,学到了许多课本上没有的东西,明白了要能够将理论运用到实践上去,而不是仅仅只是会理论。总之收获很大。

五、参考

https://blog.csdn.net/zhanglifu3601881/article/details/96632971
https://blog.csdn.net/qq_45748462/article/details/112392144
https://blog.csdn.net/qq_43279579/article/details/111990896
https://www.cnblogs.com/pertor/p/9484663.html
https://blog.csdn.net/zhanglifu3601881/article/details/89315359
https://blog.csdn.net/liqiang420795936/article/details/108216511

STM32 音频数据的Flash读取与DAC播放相关推荐

  1. 音频数据的Flash读取与DAC播放

    目录 二.Flash地址空间的数据读取 1.flash 2.stm32CubeMX文件创建 3.keil文件配置 4.s-TLINK调试 三.基于片内Flash的提示音播放程序 1.输出2000kHZ ...

  2. 基于 STM32对音频数据的 Flash 读取与 DAC 播放

    目录 1 项目准备1.1 具体要求 1.2 项目环境 2 原理简介 2.1 STM32 的内部 FLASH 2.2 STM32 的 DAC 通道2.2.1 何为 DAC 2.2.2 STM32 的 D ...

  3. STM32之音频数据的Flash读取与DAC播放

    文章目录 一. STM32103之内部Flash原理 1. Flash介绍 2. Flash的组成 3. STM32内部框架图 二. SD卡的读写 1. 实验过程 2. 查看hello.txt 3. ...

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

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

  5. STM32F103C8T6音频数据的Flash读取与DAC播放

    目录 一.Flash地址空间的数据读取 1.Flash简介 2.Flash的硬件实现机制 3.使用到的硬件及软件 4.STM32CubeMX工程配置 5.keil代码 6.STlink调试说明 7.调 ...

  6. 音频数据的Flash读取与DAC的播放

    文章目录 一.Flash地址空间的数据读取 1.Flash简介 内部 FLASH 的构成 2.建立工程 3.编辑代码 4.STlink调试仿真 二.基于片内Flash的提示音播放程序 1.使用DAC输 ...

  7. 音频数据的SD/Flash读取与DAC播放

    文章目录 一.简介 1.flash简介 2.DAC简介 二.预备实验 1.问题描述 2.ST-LINK准备 3.Flash地址空间的数据读取 三.基于片内Flash的提示音播放程序 1.使用DAC输出 ...

  8. 基于stm32实现片内flash读取数据及音乐播放(不完整)

    基于stm32实现片内flash读取数据及音乐播放(不完整) FLASN 一.片内flash 三.flash数据读取 1.工程建立 2.修改代码 3.烧录运行与结果 四.flash实现提示音播放 1. ...

  9. STM32利用flash读取音频数据读取与DAC播放

    目录 一.博客内容 二.Flash地址空间的读取 2.1 Flash原理 2.2 软.硬件准备 2.3 利用CubeMX建立工程 2.4 工程代码 2.5 ST-Link的使用 ​2.6 仿真调试 三 ...

最新文章

  1. 根据某一列的进行去重的小工具----duplicated.exe
  2. cisco 访问控制列表ACL笔记
  3. LOCALALLOC和GLOBALLOC有什么区别? 全局内存和局部内存有什么区别?(转)
  4. 在 Java 中如何优雅地判空
  5. HDU5007 Post Robot
  6. 哪个更快:Java 堆还是本地内存
  7. DCMTK:DSRRootTemplate和DSRSubTemplate类的测试程序
  8. linux ssh连接交换机_访问SMB交换机CLI使用SSH或远程登录
  9. java将naso注册成计算机服务_2018计算机二级考试Java语言每日一练 8月2日
  10. uniapp实现语音播放功能
  11. 计算机不能关机处理方法,电脑不能关机怎么回事 电脑不能关机处理方法讲解...
  12. JS学习之路,菜鸟总结的注意事项及错误更正
  13. 字体图标库(Font Awesome)的使用--绝佳的图标字体库和CSS框架
  14. 陈强教授《机器学习及R应用》课程 第十四章作业
  15. Excel:多个单元格内容合并——“”-PHONETIC()函数-Text()函数
  16. gfp 通用成帧程序 帧结构 校验 crc 多项式 加扰
  17. Ubuntu下安装UE和AirSim并使用UE4.27编译C++项目
  18. kubernetes v1.20项目之二进制扩容多Master
  19. 语音识别数据集及性能评测指标WER
  20. 信息学奥赛一本通T1158

热门文章

  1. 瑞斯康达nms_瑞斯康达iTN产品
  2. 安装驱动时,错误提示:类别安装程序拒绝安装或更新此设备
  3. Corel MyDVD Pro for Mac(专业DVD制作软件)
  4. Windows环境下的ELK——logstash输出apche日志到控制台(2)
  5. iPhone录音转文字识别率高达96%,录音转文字在线转换的方法
  6. 三坐标测量的基本原理和组成
  7. 【OpenCV+Dlib】C++基于眼睛宽高比的实时眨眼检测(原理+完整源码)
  8. 怎么用python检索法律_法律人,你的检索与处理信息的方式,决定了你的专业程度...
  9. 竖脊肌(05):屈腿硬拉
  10. Pinterest与日本电子商务巨头乐天强强联手