【嵌入式22】STM32F1C8T6音频数据的Flash读取与DAC播放

一、题目要求

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

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

1)实验数据准备:用Adobe audition或goldwave等音频编辑软件录制“您好欢迎光临!”的几秒钟的声音(8khz采样、8bit量化编码的单声道wav格式),确保音频数据尽量小(最大不超64KB)。然后编程将其分批次写入stm32f103c8t6芯片内部flash区域。

2)数字音频还原播放任务:编程读取此段音频,通过stm32f103c8t6自带的DAC通道,转换为模拟音频进行播放,并用示波器观察波形,用耳机/喇叭收听,评判音乐还原效果;

提示:建议先用单音音频(比如2000Hz的正弦波)的wav数据进行实验,通过DAC或PCM音频模块能够基本还原出原始正弦波声音后,再用语音和音乐信号进行实验。

二、Flash地址空间的数据读取

1、Flash原理

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

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

STM32F1 的闪存(Flash)模块:主存储器、信息块、闪存存储器接口寄存器

①主存储器。该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。

②信息块。该部分分为 2 个小部分,其中启动程序代码,是用来存储 ST 自带的启动程序,用于串口下载代码,当 BOOT0 接 V3.3, BOOT1 接 GND 的时候,运行的就是这部分代码。用户选择字节,则一般用于配置写保护、读保护等功能。

③闪存存储器接口寄存器。该部分用于控制闪存读写等,是整个闪存模块的控制机构。对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。

在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。

2、使用到的硬件及软件

STM32F103C8T6、STlink
软件:Keil、STM32CubeMX

3、CubeMX工程

建立工程的具体操作不再赘述,这里只提几个地方

→ 定时器配置
在这里插入图片描述
→ 管脚配置,对应外设c8t6本身设计好的PC13 LED灯
在这里插入图片描述
对应的GPIO设置
在这里插入图片描述

→ 设置堆栈大小

在这里插入图片描述
之后导出即可

4、Keil代码撰写

工程源码链接(主:flash.h文件需要自己重新加入到路径中)
链接: https://pan.baidu.com/s/11Tn8TocHT8qithneDyKFIQ
提取码:pmvn

将事先准备好的flash.c 及flash.h加入到工程中

在这里插入图片描述
在main.c文件中添加部分代码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
编译无误,进行调试

5、STlink调试说明

接线

ST-LINKSTM32
SWCLK/TCKSWCLK/TCK
SWDIO/TMSSWDIO/TMS
GNDGND
VCCVCC

在这里插入图片描述
在电脑上下载好响应的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型号,如果不是对应的型号烧录会报错。

6、调试

进入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十六进制地址

要想选定安全的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的提示音播放程序

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

建议先用单音音频(比如2000Hz的正弦波)的wav数据进行实验,通过DAC或PCM音频模块能够基本还原出原始正弦波声音后,再用语言/音乐信号进行实验。
生成单音正弦波
文件—>新建—>音频文件
在这里插入图片描述
效果->生成->音调
在这里插入图片描述
在这里插入图片描述
文件->导出->设置导出为wav文件
在这里插入图片描述
用UltraEdit得到相关数据
用UltraEdit打开刚才保存的wav文件
在这里插入图片描述
CTRL+A,接着鼠标右键,选择 十六进制复制选定视图,将内容粘贴到一个新建文件中
在新建文件中,CTRL+A,接着鼠标右键,选择范围输入起始的行号和列号,确定就选中了整个我们需要的内容
复制到notepad++中
Edit编辑->列块编辑->输入0x

在这里插入图片描述

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

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

将内容复制到keil文件对应的位置,在下图红框中进行替换。
在这里插入图片描述
之后,编译下载,看能否观察到预期的正弦波。

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

操作同上,采样率修改一下,其余烧录步骤都是一样的,不再赘述。
在这里插入图片描述
编辑好代码后,烧录,借助音频模块听听看能否还原。
这里由于手头没有音频播放模块,暂时不详述。

总结

通过本实验了解到片内flash的重要作用,可以不借助外设即可实现存放。

参考

[1] https://blog.csdn.net/qq_40147893/article/details/107423621

[2] https://blog.csdn.net/lushoumin/article/details/87694389

[3] https://blog.csdn.net/zhanglifu3601881/article/details/96632971

[4] https://blog.csdn.net/Ace_Shiyuan/article/details/78196648

噗噗的罐子
关注 关注
  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
STM32音频数据Flash读取DAC播放
qq_57841179的博客
12-30 1204
一、Flash简介 1、闪存的读取 STM32F1 可通过内部的 I-Code 指令总线或 D-Code 数据总线访问内置闪存模块,本章我们主要讲解数据读写,即通过 D-Code 数据总线来访问内部闪存模块。为了准确读取 Flash 数据,必须根据 CPU 时钟 (HCLK) 频率和器件电源电压在 Flash 存取控制寄存器 (FLASH_ACR)中正确地设置等待周期数(LATENCY)。当电源电压低于 2.1V 时,必须关闭预取缓冲器。 等待周期通过 FLASH_ACR 寄存器的 LATENCY[2
STM32音频数据Flash读取DAC播放
weixin_48268385的博客
01-01 1946
文章目录一. STM32103之内部Flash原理1. Flash介绍2. Flash的组成3. STM32内部框架图二. SD卡的读写1. 实验过程2. 查看hello.txt3. 从SD卡里读出数据三. Flash地址空间的数据读取1. Flash写入流程2. 配置STM32CubeMX3. 修改代码4. 设置ST-Link5. Keil配置6. 调试程序四. 实例——基于片内Flash的提示音播放程序1. DAC介绍2. 使用DAC输出周期2KHZ的正弦波3. 数字音频还原播放五. 总结六. 参考资
基于STM32F103C8T6片内Flash音频播放DAC通道)
阿布巴的博客
12-31 4300
基于STM32F103C8T6片内Flash音频播放DAC通道)一、STM32DAC通道介绍二、实验要求三、数据准备1、生成mav文件2、使用UltraEdit得到相关数据3、使用notepad++添加相关内容四、使用DAC输出周期2khz的正弦波五、使用DAC输出数字音频歌曲数据转换为模拟音频波形输出六、总结参考 一、STM32DAC通道介绍 二、实验要求 三、数据准备 1、生成mav文件 Audition生成输出一个周期2khz的正弦波的mav文件 ①选择文件->新建->音频
STM32f1c8t6(pcb,原理图,寄存器库函数资料).rar
05-14
STM32f1c8t6(pcb,原理图,寄存器库函数资料) stm32f1中文资料 f1核心板硬件资料
STM32F103C8T6的DAC的输出接ADC的输入
最新发布
Medjay_的博客
04-22 640
如图所示,DAC采用的是MCP4725,I2C通信正常参考电压给的是3.3V,然后给DAC数字量1024,按理来说输出电压是3.3V *1024/4096 = 0.825V,事实也如此,输出电压0.825V。然后我想着将这个引脚连接给ADC的输入引脚,如果没问题的话,ADC应该会输出1024,但是无论DAC给的数字量是多少,DAC总是输出2047。但是DAC接ADC,明明引脚电压也是一样的,ADC输出就一直是2047,什么原因啊。
STM32最小板完成音频数据读取DAC播放
qq_47946816的博客
12-29 2524
目录 一、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输出数字音频歌曲数据转换为模拟音频波形输出 五、总结 六..
STM32音乐播放,把音频文件放入代码中,无需外部flash
02-16
这是一个非常简单的音乐播放程序,主控芯片采用STM32F407,把音频文件放入代码中,无需外部flash则可以播放,并且采用的是单声道,6kHZ的音质
STM32F103C8T6中文数据手册
05-08
1.STM32F103系列微处理器是首款基于ARM7-M体系结构的32位标准RISC(精简指令集)处理器,提供很高的代码效率,在通常8位和16位系统的存储空间上发挥了ARM内核的高性能。该系列微处理器工作频率为72MHz,内置高达128K...
stm32f103c8t6 内部flash读写
08-06
stm32f103c8t6 内部flash读写
STM32F103C8T6资料
02-21
STM32F103C8T6资料 包含原理图、pcb、芯片手册和参考案例
STM32F103C8T6和DS1302时钟
05-04
通过STM32F103C8T6主控板驱动DS1302时钟模块,测试时间的记录,然后将DS1302记录的时间通过USART1串口发送到调试助手上,将最后的时间整合到结构体中方便后期的二次开发,适合学生制作作品,相关行业的人看大家相互...
stm32f1WM8978录音和放音例程.rar
08-05
使用stm32f1做的音乐播放
STM32F103C8T6.rar
08-25
STM32F103C8T6例子教程以及文档
基于STM32F103C8T6的手持MP3(对应另一分享的工程源码)
04-30
注意 本资源无PCB文件,只是完整的工程源码。PCB见我另一分享。 代码基本上是移植的原子哥的程序,有的可以不用下载我这份(就不用浪费积分了),移植其实很简单。 代码里只开启了切换歌曲的功能,因为只留出了两个按键。音量在vs10xx.c里可以设置。
STM32 STM32F103C8T6 片内FLASH读写例程
03-06
STM32F103C8T6 片内FLASH 读写例程 编程环境 MDK4 可从串口进行操作读写FLASH
STM32F103C8T6开发板实验例程:综合实验程序源代码.rar
01-12
STM32F103C8T6开发板实验例程:综合实验程序源代码。 1、单片机型号:STM32F103C8T6。 2、开发环境:KEIL。 3、编程语言:C语言。 4、提供配套PDF格式STM32F103C8T6单片机开发板电路原理图。 5、程序功能: 按下按键...
基于 STM32F103C8T6 对音频数据Flash 读取DAC 播放
L-GRAZY的博客
12-22 1643
文章内容: 1. STM32F103C8T6 的 **Flash** 地址空间的数据读取。 2. STM32F103C8T6 自带的 **DAC 通道**,转换为模拟音频进行播放,并用示波器观察波形,用耳机/喇叭收听,评判音乐还原效果。
STM32F1C8T6音频数据读写和DAC播放
qq_53072511的博客
12-31 4315
一、题目 1、Flash地址空间的数据读取stm32f103c8t6只有20KB 内存(RAM)供程序代码和数组变量存放,因此,针对内部Flash的总计64KB存储空间(地址从0x08000000开始),运行一次写入8KB数据,总计复位运行代码4次,将32KB数据写入Flash。并验证写入数据的正确性和读写速率。 2、基于片内Flash的提示音播放程序。 1)实验数据准备:用Adobe audition或goldwave等音频编辑软件录制“您好欢迎光临!”的几秒钟的声音(8khz采样、8bit量化编
证明完全立方数模9同余_STM32实例DAC数模转换实验
weixin_39781930的博客
10-22 433
我们介绍过了 STM32F1 的模数转换器 ADC,接下来我们学习下STM32F1 的数模转换器 DAC。要实现的功能是:通过 K_UP 与K_DOWN 按键控制 STM32F1 DAC1 输出电压,通过串口将 DAC1 输出的电压值打印显示,D1 指示灯闪烁提示系统运行。学习时可以参考《STM32F10x 中文参考手册》-12 数模转换器(DAC)章节,特别是寄存器介绍部分。S...
at89c51与stm32f1c8t6的优缺
06-08
AT89C51和STM32F1C8T6这两款芯片有着很大的区别,下面是它们的一些优缺点比较: AT89C51: 优点: - 体积小,价格低廉,适合一些成本敏感的应用。 - 简单易用,容易上手,适合初学者学习嵌入式开发。 缺点: - 性能较低,处理速度慢。 - 存储容量较小,只有64KB。 STM32F1C8T6: 优点: - 性能强劲,处理速度快,适合处理复杂的任务。 - 存储容量大,可达128KB。 - 支持多种外设,包括USB、SPI、I2C、CAN等。 缺点: - 价格相对AT89C51较高。 - 学习和使用较为复杂,需要有一定的嵌入式开发经验。 总的来说,AT89C51适合一些简单的嵌入式应用,而STM32F1C8T6则适合处理复杂的任务。选择哪种芯片需要根据具体应用场景和需求来决定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 【嵌入式20】STM32F103完成对SD卡的数据读取详细操作 8366
  • 【嵌入式08】STM32F103C8T6寄存器方式借助面包板点亮LED流水灯详解 7970
  • 【嵌入式09】STM32串口通信,发送Hello Windows示例 6816
  • 【嵌入式22】STM32F1C8T6音频数据的Flash读取与DAC播放 6503
  • 【嵌入式15】I2C总线通信协议及实操stm32通过I2C实现温湿度(AHT20)采集 5441

最新评论

  • 【嵌入式17】STM32F103C8T6基于HAL库移植uC/OS-III及逻辑分析仪波形观测

    狮子丶篮子: 哥 网盘链接没了 可以重发一下么

  • 【嵌入式18】Ubuntu、stm32下的程序内存分配问题(堆栈、局部全局变量等)

    噗噗的罐子: 已修改,感谢指正

  • 【嵌入式18】Ubuntu、stm32下的程序内存分配问题(堆栈、局部全局变量等)

    偷学ing: 第四条的申请方式写反了吧

  • Latex中文论文模板A4双栏,适用课程论文

    噗噗的罐子: 普通的中文语言内容的代码能够编译成功吗?

  • Latex中文论文模板A4双栏,适用课程论文

    qq_54038811: 为什么导入进去 编译错误呢

大家在看

  • 基于SSM实现的个人日志网站+源代码+文档说明 275

最新文章

  • Latex中文论文模板A4双栏,适用课程论文
  • Matlab学习笔记
  • 【Latex报错】无法执行命令xelatex.exe -synctex=1 -interaction=nonstopmode “document“.tex
2023年3篇
2022年9篇
2021年24篇

目录

目录

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

噗噗的罐子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

聚圣源although姓葛起什么名字好听雄关是指什么关?洗冤录第一部国语宝宝起名女孩宝宝小名大全年轻的老师1中字版无与伦比的意思起名家政服务公司属龙的女孩怎么起名公司起名 喜金中国象棋游戏桂氏起名泷川惠理王一彤空间奈克瑟斯奥特曼剧场版周易八卦起名法专业取名起名大全大师cam350下载低头思故乡一年级看图写话图片姓代起什么名字好听起李姓名字gpu-z下载贵州茅台镇53度酱香型多少钱一瓶园林工程公司取名起名大全物业管理公司起名字贾姓女孩的起名大全帝都殇飞天小女小警z动画片小餐馆取名起名大全大全淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化