【嵌入式】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)管理;编程与擦除的高电压由内部产生。

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

二、Flash数据读取

1.工程创建

同往常一样,新建工程需要设置的那些东西不在叙述,这里额外配置:
定时器配置
在这里插入图片描述
管脚配置,对应外设c8t6本身设计好的PC13 LED灯
在这里插入图片描述
对应的GPIO设置
在这里插入图片描述
设置堆栈大小
在这里插入图片描述
之后导出工程

2.代码修改

首先需要下载flash.c文件,我直接把整个工程放在文后,点击下载即可
在这里插入图片描述
在main.c文件中添加部分代码
在这里插入图片描述
编译无错即可

3.调试

这里需要用到ST-link
连线方式:
在这里插入图片描述
回到Keil下,在魔法棒Option选项卡进行设置
首先是选择调试器,如果使用的是 ST-Link,在 Debug 选项卡中,请选择ST-Link Debugger
在这里插入图片描述
在选择完调试器之后,点击右边的 Setting 按钮
在这里插入图片描述
如果右侧IDCODE有显示的话就是连接成功了。然后点击下载按钮可以将程序下载到我们的板子中
在这里插入图片描述
View->memory windows->memory 1打开内存观察窗口,并在地址栏中输入:0x800c000,观察将要修改的flash区间区容:
在这里插入图片描述
点击全速运行,可以看到板子上的PC13 LED亮起,然后Memory 1窗口中出现之前存储的数据,证明数据成功写入。断电之后再次上电进行调试,可以看到上次写入的数据还在其中,证明已经将数据写入到flash中
在这里插入图片描述

三、基于片内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里面所以我们的选取的音乐片段不能太长,建议2s
在这里插入图片描述
编辑好代码后,烧录,借助音频模块听听看能否还原。

参考

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

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

Flash工程下载
链接:https://pan.baidu.com/s/1M93unn38SGlfXo4JwVbj0A

提取码:qwer

<think>嗯,用户问的是STM32F103C8T6有没有DAC。首先,我需要确认这款MCU的型号和它的规格。STM32F103C8T6属于STM32F103系列中的中等容量产品,通常称为“小容量”或“中容量”型号。根据我之前的学习,STM32F103系列的某些型号确实带有DAC模块,但并不是所有型号都有。 接下来,我需要查阅STM32F103C8T6数据手册或者参考手册。根据记忆,STM32F103C8T6的资源配置包括定时器、ADC、USART、SPI、I2C等,但DAC可能不在其中。不过,为了确保准确性,我需要确认官方资料。 在数据手册中,DAC模块通常会在外设列表中出现。如果该型号有DAC,手册里会说明其通道数量、分辨率等参数。例如,STM32F103CBT6可能有DAC,而C8T6可能没有,因为它们的Flash和RAM大小不同,可能对应不同的外设配置。 另外,STM32F103系列中,只有部分大容量型号(如144引脚或更高)才包含DAC。C8T6属于48引脚的封装,属于中容量,可能没有内置DAC。此外,查看引脚分配图,DAC输出通常位于特定引脚,比如PA4和PA5,但在C8T6的引脚描述中,这些引脚可能被其他功能占用或未标注为DAC输出。 如果用户需要DAC功能,可以建议他们使用替代方案,比如PWM加滤波电路,或者更换带有DAC的型号,如STM32F103CBT6STM32F4系列。同时,需要确保这些替代方案的可行性和具体实现方法。 总结一下,STM32F103C8T6很可能没有内置DAC模块,用户需要考虑其他方法实现模拟输出。</think>根据STM32F103C8T6的硬件资源配置,以下是分步说明: $$STM32F103C8T6 \text{无内置DAC模块}$$ 1. **型号定位** STM32F103C8T6属于中容量产品线(Flash:64KB,RAM:20KB),其产品型号编码规则中: - "C8"代表64KB Flash容量 - "T6"代表LQFP48封装 2. **外设清单验证** 根据ST官方数据手册: - 包含3个12位ADC(支持16通道模拟输入) - 包含2个12位DAC的型号为STM32F103xC/XD/XE系列(如STM32F103RCT6) - C8T6属于STM32F103x8/xB系列,DAC模块在硬件层面被裁剪 3. **引脚功能对照** 该芯片的48个引脚中: - PA4和PA5引脚在带DAC的型号中标记为DAC_OUT1/DAC_OUT2 - 在C8T6的引脚描述中,这两个引脚仅标注为GPIO或SPI1_NSS/I2C1_SMBA功能 4. **替代方案建议** 若无DAC需求不可更改,可考虑: - **PWM+RC滤波**:利用定时器输出PWM(如TIM2_CH3),通过低通滤波器生成模拟电压 - **外部DAC芯片**:如PCF8591(8位I2C DAC)或MCP4725(12位I2C DAC) - **型号替换**:选择STM32F103CBT6(128KB Flash版本含2个DAC)或STM32F303系列(含12位DAC) 5. **代码验证方法** 若仍存疑,可通过CubeMX工具检测: ```c HAL_DAC_Start(&hdac, DAC_CHANNEL_1); // 在无DAC的型号上编译会触发外设未定义错误 ``` 建议最终确认时以ST官方数据手册(Document ID: DS5312)第27章"Digital-to-analog converter (DAC)"为参考依据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值