STM32F1C8T6Flash读取音频和DAC播放
文章目录
一、Flash简介
1、Flash原理
Flash全名叫做Flash Memory,从名字就能看出,是种数据存储设备,存储设备有很多类,Flash属于非易失性存储设备(Non-volatile Memory Device),与此相对应的是易失性存储设备(Volatile Memory Device)。关于什么是非易失性/易失性,从名字中就可以看出,非易失性就是不容易丢失,数据存储在这类设备中,即使断电了,也不会丢失,这类设备,除了Flash,还有其他比较常见的入硬盘,ROM等,与此相对的,易失性就是断电了,数据就丢失了,比如大家常用的内存,不论是以前的SDRAM,DDR SDRAM,还是现在的DDR2,DDR3等,都是断电后,数据就没了。
典型的Flash内存单元的物理结构:
2、STM32F1中的Flash
不同型号的 STM32,其 FLASH 容量也有所不同,最小的只有 16K 字节,最大的则达到了 1024K 字节。市面上 STM32F1 开发板使用的芯片是 STM32F103系列,其 FLASH 容量一般为 512K 字节,属于大容量芯片。
STM32F1 的闪存(Flash)模块由:主存储器、信息块和闪存存储器接口寄存器等 3 部分组成。下面我们就来介绍下这些组成部分:
①主存储器。该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。从上图可以看出主存储器的起始地址就是0X08000000, BOOT0、BOOT1 都接 GND 的时候,就是从 0X08000000 开始运行代码的。
②信息块。该部分分为 2 个小部分,其中启动程序代码,是用来存储 ST 自带的启动程序,用于串口下载代码,当 BOOT0 接 V3.3, BOOT1 接 GND 的时候,运行的就是这部分代码。用户选择字节,则一般用于配置写保护、读保护等功能,这里我们不做介绍,大家可以百度了解。
③闪存存储器接口寄存器。该部分用于控制闪存读写等,是整个闪存模块的控制机构。对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。
在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。
二、Flash地址空间的数据读取
1、题目要求
Flash地址空间的数据读取。stm32f103c8t6只有20KB 内存(RAM)供程序代码和数组变量存放,因此,针对内部Flash的总计64KB存储空间(地址从0x08000000开始),运行一次写入8KB数据,总计复位运行代码4次,将32KB数据写入Flash。并验证写入数据的正确性和读写速率。
2、CUbeMX工程建立
配置定时器:
管脚设置:
如图将PC13设置为GPIO OUT
系统时钟树:
RCC:
NVIC:
设置堆栈大小后输出工程:
3、Keil工程修改
首先在生成的工程中加入flash.c和flash.h文件。
链接:https://pan.baidu.com/s/11Tn8TocHT8qithneDyKFIQ
提取码:pmvn
记得将.c文件保存在Src中,将.h文件保存在Inc中。
在工程中右键添加:
在main.c中添加头文件:
#include "flash.h"
/* USER CODE BEGIN 0 */
uint8_t FlashWBuff[255];
uint8_t FlashRBuff[255];
/* USER CODE END 0 */
/* USER CODE BEGIN SysInit */
FlashWriteBuff( DEVICE_INFO_ADDRESS,FlashTest,sizeof(FlashTest)); //写入数据到Flash
for(i=0;i<255;i++)
FlashWBuff[i]=i;
FlashWriteBuff( DEVICE_INFO_ADDRESS+sizeof(FlashTest),FlashWBuff,255); //写入数据到Flash
FlashReadBuff ( DEVICE_INFO_ADDRESS+sizeof(FlashTest),FlashRBuff,255); //从Flash中读取数
/* USER CODE END SysInit */
编译调试:
看到没有错误。
4、STlink调试说明
接线
ST-LINK | STM32 |
---|---|
SWCLK/TCK | SWCLK/TCK |
SWDIO/TMS | SWDIO/TMS |
GND | GND |
VCC | VCC |
回到Keil下,在魔法棒Option选项卡进行设置
首先是选择调试器,如果使用的是 ST-Link,在 Debug 选项卡中,请选择ST-Link Debugger
安装好ST-Link驱动
选择好ST-Link Debugger后点击Setting进行设置:
看到如图中出现红框内的信息说明连接成功。
点击如图中的下载烧录即可。
5、调试运行
点击debug进入调试
在视图中选择内存窗口选择内存1,即memory窗口:
同样的在观测窗口点击观测1,然后添加两个变量FlashWBuff 和 FlashRBuff:
点击全速运行再关闭,看到芯片的PC13口由灭变亮。
看到FlashWBuff 和 FlashRBuff变量中分别写入了数据。
在memory窗口中输入FLASH地址0x0800C000,右键点击选择Ascii进行观察:
看到我们在main中的数据成功写入了该地址。
三、基于片内Flash的提示音播放程序
1、使用DAC输出周期2khz的正弦波
软件需要:Adobe Audition CS6
首先用Adobe Audition CS6产生正弦波进行测试,如果播放成功那么音乐是同样的原理就都可以成功。
首先新建音频文件:
在效果中点击生成基本音色:
然后选择正弦波,设置频率振幅等参数:
然后在文件中导出文件:
选择导出文件名,选择导出位置,然后这里默认是与导出类型与新建的类型和频率相同,我们也可以在这里更改:
用UltraEdit文本编辑器打开音频文件。
ctrl+A全选,右键点击十六进制复制选定视图,然后新建一个文件,将复制的内容粘贴进去。
ctrl+A全选后右键选择范围。
这样就选中了我们需要 的内容。
上面选中的内容复制粘贴到notepad++中。
在编辑中选择列块编辑。
输入0x
这里借用DAC生成正弦波的例程代码
链接:https://pan.baidu.com/s/18zsQG5mZXbjafPuAJEUkMg
提取码:706i
将红框内的数字替换:
之后,编译下载,看能否观察到预期的正弦波。
2、使用DAC输出数字音频歌曲数据转换为模拟音频波形输出
1.使用Audition截取一段喜欢的音乐
①选择文件->打开,找到对应的音乐
②选中一段,然后右键,选择存储选区,接着更改采用类型
编辑好代码后,烧录,借助音频模块听听看能否还原
四、总结
本次实验验证使用了Flash存储读取数据,理解了Flash的原理。
五、参考资料
https://www.cnblogs.com/yuanqiangfei/p/9400435.html
https://blog.csdn.net/lushoumin/article/details/87694389
https://blog.csdn.net/qq_43279579/article/details/111990896
https://blog.csdn.net/zhanglifu3601881/article/details/96632971