STM32F103基于片内flash的数据读取与音乐播放

目录

一、前言

本文是基于STM32F103C8T6的片内flash数据读取,由于目前还没有音频播放模块,所以说还不知道播放效果,如果有什么问题,还请大家多多指正。

二、题目要求

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

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

三、什么是片内flash

不同型号的 STM32,其 FLASH 容量也有所不同,最小的只有 16K 字节,最大的则达到了 1024K 字节。市面上 STM32F1 开发板使用的芯片是 STM32F103系列,其 FLASH 容量一般为 512K 字节,属于大容量芯片。而我们的C8T6flash大小为64KB。
STM32F1 的闪存(Flash)模块由:主存储器、信息块和闪存存储器接口寄存器等 3 部分组成。下面我们就来介绍下这些组成部分:

①主存储器。该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。从上图可以看出主存储器的起始地址就是0X08000000, BOOT0、BOOT1 都接 GND 的时候,就是从 0X08000000 开始运行代码的。

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

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

在进行闪存写操作时,对闪存的任何读操作都会锁定总线,直到写操作完成后才能正确进行读操作,在写操作或擦除操作期间不能进行代码或数据读操作。

[En]

When performing a flash write operation, any read operation to the flash memory will lock the bus, and the read operation can not be carried out correctly until the write operation is completed, and the code or data reading operation cannot be carried out during the write or erase operation.

具体可以参考:STM32之内部FLASH原理

四、闪存的编程和擦除

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

① FPEC 键寄存器(FLASH_KEYR)

② 选择字节键寄存器(FLASH_OPTKEYR)

③ 闪存控制寄存器(FLASH_CR)

④ 闪存状态寄存器(FLASH_SR)

⑤ 闪存地址寄存器(FLASH_AR)

⑥ 选择字节寄存器(FLASH_OBR)

⑦ 写保护寄存器(FLASH_WRPR)

其中 FPEC 键寄存器总共有 3 个键值:

RDPRT 键=0X000000A5

KEY1=0X45670123

KEY2=0XCDEF89AB

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 位将得到一个警告。STM32 的 FLASH 编程过程如下:

STM32F103基于片内flash的数据读取与音乐播放

闪存的编程顺序如下图所示:

[En]

The programming order of flash memory can be obtained from the above figure as follows:

① 检查 FLASH_CR 的 LOCK 是否解锁,如果没有则先解锁

② 检查 FLASH_SR 寄存器的 BSY 位,以确认没有其他正在进行的编程操作

③ 设置 FLASH_CR 寄存器的 PG 位为’1′

④ 在指定的地址写入要编程的半字

⑤ 等待 BSY 位变为’0′

⑥ 读出写入的地址并验证数据

; 五、基于flash的数据读取

1、工程创建

创建一个CubeMX,其他配置就如我们往常那样配置,现在主要讲几个:
由于我们要设置一个标志来表示我们的程序已经开始执行了,所以这里我选择板子上自带的LED(PC13)。

STM32F103基于片内flash的数据读取与音乐播放
设置堆栈的大小,这里设置为4K(也可设置为2K)。
STM32F103基于片内flash的数据读取与音乐播放
紧接着我们导出工程就OK了。

; 2、修改代码

首先咱们需要下载flash.c文件,这里我直接把我整个工程都放进来,点击下载。提取码:1111
或者我们可以直接将我的文件夹中flash.c由于flash.h文件添加到自己的工程中:

STM32F103基于片内flash的数据读取与音乐播放
接着打开main.c文件,看到我们存储数据的数组,在里面我们可以修改需要存储的数据
STM32F103基于片内flash的数据读取与音乐播放
然后进行编译无错即可。

; 3、烧录

在这里需要用到ST-link,之前我们都是用FlyMCU直接进行烧录的,但是如果我们还是像之前一样的话我们就将无法进行测试,因为这次实验的现象是将数据写进内存,并没有配置串口输出。所以我们需要用ST-link直接在Keil中观察测试结果(数据是否存储进去)。
ST-link连线:

ST-linkSTM32SWCLKSWCLKSWDIOSWDIOGNDGNDVCCVCC

连线结果如图所示:

STM32F103基于片内flash的数据读取与音乐播放
紧接着我们回到Keil工程中,点击”仙女棒”,在”Debug”选项卡中选择ST-link
STM32F103基于片内flash的数据读取与音乐播放
在选择完之后查看右边的”SWDIO”,如果显示了”IDCODE”就表示ST-link连接成功:
STM32F103基于片内flash的数据读取与音乐播放
然后点击下载按钮将程序下载到我们的主板上。
[En]

Then click the download button to download the program to our board.

STM32F103基于片内flash的数据读取与音乐播放
注意我们一定要选择正确自己板子的型号,因为ST-link在烧录的时候会严格地检查STM32型号,如果板子型号选择错误就会报错。

4、调试

在调试的时候为了方便我们观察,首先需要我们在main函数中的while循环前设置一个断点。

STM32F103基于片内flash的数据读取与音乐播放
一直连接上板子然后进入debug,千万不要选择仿真调试,点击视图—>观测窗口—>随便选择一个窗口
STM32F103基于片内flash的数据读取与音乐播放
紧接着在右下角的Memory1窗口中输入我们存储数据的地址0x0800C000
STM32F103基于片内flash的数据读取与音乐播放
点击全速运行,可以看到板子上的PC13 LED亮起,然后Memory 1窗口中出现之前存储的数据,证明数据成功写入
STM32F103基于片内flash的数据读取与音乐播放
断电之后再次上电进行调试,程序依然停在while循环前,可以看到上次写入的数据还在其中,证明已经将数据写入到flash中
STM32F103基于片内flash的数据读取与音乐播放
实验完成

; 六、基于flash的提示音播放

由于提示音的波形比较复杂,这里我们用正弦波来模拟。

[En]

Because the waveform of the cue tone is more complex, here we use sine wave to simulate.

1、生成正弦波数据

使用Adobe Audition生成正弦波数据:
首先新建一个音频文件

STM32F103基于片内flash的数据读取与音乐播放
设置采样率和位深度,八位采样
[En]

Set sampling rate and bit depth, eight-bit sampling

STM32F103基于片内flash的数据读取与音乐播放
插入基本音色(正弦波)
STM32F103基于片内flash的数据读取与音乐播放
导出为wab文件
STM32F103基于片内flash的数据读取与音乐播放
生成wav文件之后,用UltraEdit将其打开,Ctrl+A选择全部然后右键点击选择选择范围,输入12-59列
STM32F103基于片内flash的数据读取与音乐播放
STM32F103基于片内flash的数据读取与音乐播放
这里我们直接用DAC生成正弦波的工程提取码:1111,然后将生成得到的数据粘贴进入数组即可(记得修改数组大小)
STM32F103基于片内flash的数据读取与音乐播放
将数据粘贴到其中,然后编译、下载和刻录。
[En]

Paste the data into it and compile, download and burn it.

用示波器观察PB5输出的波形

STM32F103基于片内flash的数据读取与音乐播放
实验成功

; 2、使用DAC转换播放音频

操作与正弦波相同,但是由于存在flash里面所以我们的选取的音乐片段不能太长,建议2s

STM32F103基于片内flash的数据读取与音乐播放
用同样的步骤生成数据,将得到的数据粘贴到对应Keil工程的数组中,借助音频模块看是否能还原。由于我这里目前没有音频模块,所以目前不清楚结果。

参考资料

STM32之内部FLASH原理
DAC工程下载
flash文件下载
提取码:1111

Original: https://blog.csdn.net/txmnQAQ/article/details/122224274
Author: 甜心猛男
Title: STM32F103基于片内flash的数据读取与音乐播放

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/498383/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球