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

本文介绍了如何在STM32单片机上利用片内Flash存储音频数据,并通过DAC(数模转换器)进行播放。首先讲解了Flash的读取和编程擦除操作,然后通过CUBEMX创建工程,配置定时器、GPIO和中断。在编程过程中,强调了Flash必须被擦除后才能写入,并展示了如何将wav文件数据转换为适合Flash存储的格式。最后,通过DAC输出正弦波和实际音频数据,实现了音频播放功能。
摘要由CSDN通过智能技术生成

目录

一、Flash简介

1、闪存的读取

2、闪存的编程和擦除

二、创建工程文件

1、CUBEMX工程建立

2.修改代码

2、STLink连接

 3.仿真结果

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

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

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

四、总结

五、参考资料


一、Flash简介

1、闪存的读取

STM32F1 可通过内部的 I-Code 指令总线或 D-Code 数据总线访问内置闪存模块,本章我们主要讲解数据读写,即通过 D-Code 数据总线来访问内部闪存模块。为了准确读取 Flash 数据,必须根据 CPU 时钟 (HCLK) 频率和器件电源电压在 Flash 存取控制寄存器 (FLASH_ACR)中正确地设置等待周期数(LATENCY)。当电源电压低于 2.1V 时,必须关闭预取缓冲器。

等待周期通过 FLASH_ACR 寄存器的 LATENCY[2:0]三个位设置。系统复位后, CPU 时钟频率为内部 16M RC 振荡器, LATENCY 默认是 0,即 1 个等待周期。供电电压,我们一般是 3.3V,所以,在我们设置 72Mhz 频率作为 CPU 时钟之前,必须先设置 LATENCY 为 3,否则 FLASH 读写可能出错,导致死机。STM23F1 的 FLASH 读取是很简单的。例如,我们要从地址 addr,读取一个字(字节为 8 位,半字为 16 位,字为 32 位),可以使用如下方法来读取:data=*(vu32*)addr;

将 addr 强制转换为 vu32 指针,然后取该指针所指向的地址的值,即得到了 addr 地址内的值。类似的,将上面的 vu32 改为 vu16,即可读取指定地址的一个半字。

2、闪存的编程和擦除

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

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 位将得到一个警告。
 

二、创建工程文件

1、CUBEMX工程建立

定时器设置

 引脚配置

GPIO配置

中断设置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值