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

一、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)管理;编程与擦除的高电压由内部产生。

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

二、创建STM32CUBEMX工程

芯片选择F103C8
STM32F103C8T6音频数据的Flash读取与DAC播放
配置定时器
STM32F103C8T6音频数据的Flash读取与DAC播放
打开外部时钟
STM32F103C8T6音频数据的Flash读取与DAC播放
配置时钟
STM32F103C8T6音频数据的Flash读取与DAC播放
配置PC13为output对应板子上的LED
STM32F103C8T6音频数据的Flash读取与DAC播放
设置堆栈大小为4K,导出
STM32F103C8T6音频数据的Flash读取与DAC播放

三、KEIL下的配置

1、代码修改。

将flash.c 和flash.h添加到工程中
STM32F103C8T6音频数据的Flash读取与DAC播放

在main.c文件中添加部分代码
STM32F103C8T6音频数据的Flash读取与DAC播放
添加自己的想输入信息,编译无错即可

2、调试

这里需要用到ST-link
连线方式:
STM32F103C8T6音频数据的Flash读取与DAC播放
回到Keil下,在魔法棒Option选项卡进行设置
首先是选择调试器,如果使用的是 ST-Link,在 Debug 选项卡中,请选择ST-Link Debugger
STM32F103C8T6音频数据的Flash读取与DAC播放
在选择完调试器之后,点击右边的 Setting 按钮
将程序下载到单片机中

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

如果右侧IDCODE有显示的话就是连接成功了。然后点击下载按钮可以将程序下载到我们的板子中
STM32F103C8T6音频数据的Flash读取与DAC播放
板子连线如下
STM32F103C8T6音频数据的Flash读取与DAC播放

STM32F103C8T6音频数据的Flash读取与DAC播放
如图所示成功。
现在点击dubug按钮,进入硬件仿真调试
STM32F103C8T6音频数据的Flash读取与DAC播放

View->memory windows->memory 1打开内存观察窗口,并在地址栏中输入:0x800c000,观察将要修改的flash区间区容:
STM32F103C8T6音频数据的Flash读取与DAC播放
点击全速运行,可以看到板子上的PC13 LED亮起,然后Memory 1窗口中出现之前存储的数据,证明数据成功写入。断电之后再次上电进行调试,可以看到上次写入的数据还在其中,证明已经将数据写入到flash中
STM32F103C8T6音频数据的Flash读取与DAC播放

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

1、DAC简介

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

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

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

点击左上角的文件,新建,音频文件
采样率2000Hz,声道单声道,位深度16位
STM32F103C8T6音频数据的Flash读取与DAC播放
点击效果,生成,音调
设置如下

STM32F103C8T6音频数据的Flash读取与DAC播放
点击文件,导出,文件
格式设置如下
STM32F103C8T6音频数据的Flash读取与DAC播放
完成

3,截取音乐中的音频

随便找一首音乐,点击截取一段音频
STM32F103C8T6音频数据的Flash读取与DAC播放

右键,点击存储选取为
点击更改,配置如下
STM32F103C8T6音频数据的Flash读取与DAC播放
点击确定完成。
打开软件WavToC,这是一个将WAV文件转化成C语言代码的文件
点击右下角的打开文件
选择我们刚才生成的wav文件
点击生成代码,便自动生成出代码
STM32F103C8T6音频数据的Flash读取与DAC播放
STM32F103C8T6音频数据的Flash读取与DAC播放

打开原子哥的DAC输出正弦波的程序
在bsp_dac.c下的函数中,替换内容,就可以输出不同的波形,
STM32F103C8T6音频数据的Flash读取与DAC播放

总结

这此实验用AU生成了wav文件,也是参考了大部分的博客,条件有限,也没有用示波器进行观察。但因该是对的。

参考博客

https://blog.csdn.net/m0_58414679/article/details/122221730?spm=1001.2014.3001.5501

上一篇:交换机练习的心得


下一篇:窗口函数更新