基于STM32F103芯片的音频数据的Flash读取与DAC播放

基于STM32F103芯片的音频数据的Flash读取与DAC播放

1 Flash 概述

1.1 单片机内存映射

在这里插入图片描述

  1. STM32的flash地址起始于0x0800 0000结束地址是0x0800
    0000加上芯片实际的Flash大小,不同的芯片Flash大小不同。
    Flash中的内容一般用来存储代码和一些定义为 const 的数据,断电不丢失。 STM32将外设等都映射为地址的形式,对地址的操作就是对外设的操作。
  2. stm32的外设地址从0x4000 0000开始,可以看到在库文件中,是通过基于0x4000 0000地址的偏移量来操作寄存器以及外设的。
  3. 一般情况下,程序文件是从 0x0800 0000 地址写入,这个是STM32开始执行的地方,0x0800 0004是STM32的中断向量表的起始地址。

1.2 Flash 构成

STM32F103的中容量内部 FLASH 包含主存储器系统存储器OTP 区域以及选项字节区域。他们的作用如下:

  • 主存储器:一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域它是存储用户应用程序的空间,芯片型号说明中的 1M
    FLASH、 2M FLASH 都是指这个区域的大小。与其它 FLASH 一样,在写入数据前,要先按扇区擦除,
  • 系统存储区:系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动代码,它负责实现串口、 USB 以及 CAN 等 ISP
    烧录功能。
  • OTP 区域:OTP(One Time Program),指的是只能写入一次的存储区域,容量为 512 字节,写入后数据就无法再更改,
    OTP 常用于存储应用程序的加密密钥。
  • 选项字节:选项字节用于配置 FLASH 的读写保护、电源管理中的 BOR 级别、软件/硬件看门狗等功能,这部分共 32 字节。可以通过子修改FLASH 的选项控制寄存器修改。

stm32根据FLASH主存储块容量、页面的不同,系统存储器的不同,分为小容量、中容量、大容量、互联型,共四类产品。

小容量产品:主存储块1-32KB, 每页1KB。系统存储器2KB
中容量产品:主存储块64-128KB, 每页1KB。系统存储器2KB
大容量产品:主存储块256KB以上, 每页2KB。系统存储器2KB
互联型产品:主存储块256KB以上, 每页2KB。系统存储器18KB

Flash 各部分的地址分布及大小如下(例如中容量产品):
在这里插入图片描述

1.3 Flash 写入流程

解锁——页擦除——写入数据

  1. 解锁
    往 FPEC 键寄存器 FLASH_KEYR 中写入 KEY1 = 0x45670123;
    再往 FPEC 键寄存器 FLASH_KEYR 中写入 KEY2 = 0xCDEF89AB
  2. 页擦除
    检查 FLASH_SR 寄存器中的“忙碌寄存器位 BSY”,以确认当前未执行任何 Flash 操作;
    在 FLASH_CR寄存器中,将“激活页擦除寄存器位 PER ”置 1;
    用 FLASH_AR 寄存器选择要擦除的页;
    将 FLASH_CR寄存器中的“开始擦除寄存器位 STRT ”置 1,开始擦除;
    等待 BSY 位被清零时,表示擦除完成。
  3. 写入数据
    检查 FLASH_SR 中的 BSY 位,以确认当前未执行任何其它的内部 Flash 操作;
    将 FLASH_CR寄存器中的 “激活编程寄存器位 PG” 置 1;
    向指定的 FLASH 存储器地址执行数据写入操作,每次只能以 16 位的方式写入;
    等待 BSY 位被清零时,表示写入完成。

2 读取Flash内存的实例

要求:
1)在SD卡创建一个test-speed.txt文件,循环(不加延时)分批一次写入256字节,累计写入不少于64KB字节;然后读取此文件数据,通过串口显示出来。分析写入和读取的速率。
2)Flash地址空间的数据读取。stm32f103c8t6只有20KB 内存(RAM)供程序代码和数组变量存放,因此,针对内部Flash的总计64KB存储空间(地址从0x08000000开始),运行一次写入8KB数据,总计复位运行代码4次,将32KB数据写入Flash。并验证写入数据的正确性和读写速率。

2.1 STM32CubeMX 配置

链接:https://pan.baidu.com/s/11Tn8TocHT8qithneDyKFIQ
提取码:pmvn

  1. 时钟配置
    在这里插入图片描述
  2. SYS 配置
    在这里插入图片描述
  3. GPIO_OUT 及配置
    在这里插入图片描述
    在这里插入图片描述
  4. 中断配置
    在这里插入图片描述

2.2 keil 配置

  1. INC文件夹中的flash.h 添加到工程文件中。
    在这里插入图片描述
    在这里插入图片描述

  2. main.c文件中添加头文件 #include "flash.h"

  3. main.c文件中添加如下语句语句:

    /* USER CODE BEGIN 0 */
    uint8_t FlashWBuff [255];
    uint8_t FlashRBuff [255];
    /* USER CODE END 0 */
    

    在这里插入图片描述

      /* USER CODE BEGIN 1 */
    	uint8_t i;
    	uint8_t FlashTest[] = "Hello ,welcom to my world!";
      /* USER CODE END 1 */
    

    在这里插入图片描述

     /* 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. 编译构建:没有错误
    在这里插入图片描述

2.3 调试

2.3.1 硬件调试

电路连线:

ST-Link STM32F103
SWCLK/TCK SWCLK/TCK
SWDIO/TMS SWDIO/TMS
GND GND
VCC VCC

连接好后,如果之前没有安装好ST-Link驱动,要先安装。
安装连接:https://pan.baidu.com/s/1cmreV0

安装好驱动后,查看设备管理器:检测到驱动,没有问题。
在这里插入图片描述

进入 keil 配置,点击 Option
在这里插入图片描述
Setting 中设置:
在这里插入图片描述
点击 Flash Download,勾选图中对应选项。
在这里插入图片描述

2.3.2 软件调试

点击下载:
在这里插入图片描述
Debug——视图——内存窗口——内存1

在这里插入图片描述
输入0x800C000,回车。
在这里插入图片描述

视图——观测窗口——观测1,进行变量的观测。
在这里插入图片描述

main.c文件中,找到变量FlashWBuffFlashRBuff,右击,单击 ‘Add FlashWBuff’ to watch1 。找到如下界面:
在这里插入图片描述

勾选菜单栏 视图——定期窗口更新,点击全速运行:
在这里插入图片描述

观察两个flash,内容相同:
在这里插入图片描述
在这里插入图片描述

3 DAC 概述

  1. DA转换器是把数字量转变成模拟量的器件,按模拟量输出类型通常分为:电流和电压输出类型。常见的DAC是电压输出型,在STM32中集成的DAC转换模块为电压输出型数模转换器。

  2. STM32的DAC模块主要特点有:

    2个DAC转换器:每个转换器对应1个输出通道。
    8位或12位单调输出。
    12位模式下数据左对齐或右对齐。
    同步更新功能。
    噪声波形形成。
    三角波形形成。
    双DAC通道同时或者分别转换。
    

    在这里插入图片描述
    在这里插入图片描述

4 DAC 播放实例

基于片内Flash的提示音播放程序。
1)实验数据准备:用Adobe audition或goldwave等音频编辑软件录制“您好欢迎光临!”的几秒钟的声音(8khz采样、8bit量化编码的单声道wav格式),确保音频数据尽量小(最大不超64KB)。然后编程将其分批次写入stm32f103c8t6芯片内部flash区域。
2)数字音频还原播放任务:编程读取此段音频,分别通过 (a)stm32f103c8t6自带的DAC通道,转换为模拟音频进行播放,并用示波器观察波形,用耳机/喇叭收听,评判音乐还原效果;
提示:建议先用单音音频(比如2000Hz的正弦波)的wav数据进行实验,通过DAC或PCM音频模块能够基本还原出原始正弦波声音后,再用语音和音乐信号进行实验。

4.1 实验准备与测试

4.1.1 用Audition输出一个周期2kHz的正弦波

工程链接:https://pan.baidu.com/s/1gEATonRXK7km3yf-Mu0eEQ
提取码:1234

  1. 打开Adobe Audition CS6,单击:文件——新建——音频文件
    在这里插入图片描述

  2. 效果——生成基本音色
    在这里插入图片描述

  3. 文件——导出——文件
    在这里插入图片描述

  4. 打开WavToC软件。生成代码后记得保存在这里插入图片描述

  5. 打开 keil 工程(上面的连接),打开bsp_dac.c文件,将波形数据 修改为上述保存的 .h 文件中的内容,如图:
    在这里插入图片描述
    修改后:
    在这里插入图片描述

  6. 编译无措,即可烧录观察。
    在这里插入图片描述

4.2 数字音频还原

4.2.1 用DAC将数字音频歌曲转换为模拟音频波形输出

  1. 用上述类似的方法,将 .MP3 文件转换成.wav 文件,并将.wav文件生成代码。
    在这里插入图片描述在这里插入图片描述

5 总结

  • keil在进行软件仿真的时候,不能输出flash对应的内容。因此,到实验室用ST-Link 进行调试。同时,了解了ST-Link 的使用。
  • 音频播放因为缺少示波器,再加上本身没有足够的时间去做,就没有查看波形。
  • 引脚PA4、5可以仿真调试。
  • Flash 对于单片机的应用格外重要,只有掌握了它的读写方式,才能更好地运用它。

6 参考

  1. STM32学习笔记:读写内部Flash
  2. STM32 进阶教程 13 –FLASH的读写操作
  3. 读写内部Flash
  4. STM32F103的DAC——输出声音效果
  5. STM32F103DAC实验

版权声明:本文为CSDN博主「通信小咸鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_46470208/article/details/122223117

基于STM32F103芯片的音频数据的Flash读取与DAC播放

1 Flash 概述

1.1 单片机内存映射

在这里插入图片描述

  1. STM32的flash地址起始于0x0800 0000结束地址是0x0800
    0000加上芯片实际的Flash大小,不同的芯片Flash大小不同。
    Flash中的内容一般用来存储代码和一些定义为 const 的数据,断电不丢失。 STM32将外设等都映射为地址的形式,对地址的操作就是对外设的操作。
  2. stm32的外设地址从0x4000 0000开始,可以看到在库文件中,是通过基于0x4000 0000地址的偏移量来操作寄存器以及外设的。
  3. 一般情况下,程序文件是从 0x0800 0000 地址写入,这个是STM32开始执行的地方,0x0800 0004是STM32的中断向量表的起始地址。

1.2 Flash 构成

STM32F103的中容量内部 FLASH 包含主存储器系统存储器OTP 区域以及选项字节区域。他们的作用如下:

  • 主存储器:一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域它是存储用户应用程序的空间,芯片型号说明中的 1M
    FLASH、 2M FLASH 都是指这个区域的大小。与其它 FLASH 一样,在写入数据前,要先按扇区擦除,
  • 系统存储区:系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动代码,它负责实现串口、 USB 以及 CAN 等 ISP
    烧录功能。
  • OTP 区域:OTP(One Time Program),指的是只能写入一次的存储区域,容量为 512 字节,写入后数据就无法再更改,
    OTP 常用于存储应用程序的加密密钥。
  • 选项字节:选项字节用于配置 FLASH 的读写保护、电源管理中的 BOR 级别、软件/硬件看门狗等功能,这部分共 32 字节。可以通过子修改FLASH 的选项控制寄存器修改。

stm32根据FLASH主存储块容量、页面的不同,系统存储器的不同,分为小容量、中容量、大容量、互联型,共四类产品。

小容量产品:主存储块1-32KB, 每页1KB。系统存储器2KB
中容量产品:主存储块64-128KB, 每页1KB。系统存储器2KB
大容量产品:主存储块256KB以上, 每页2KB。系统存储器2KB
互联型产品:主存储块256KB以上, 每页2KB。系统存储器18KB

Flash 各部分的地址分布及大小如下(例如中容量产品):
在这里插入图片描述

1.3 Flash 写入流程

解锁——页擦除——写入数据

  1. 解锁
    往 FPEC 键寄存器 FLASH_KEYR 中写入 KEY1 = 0x45670123;
    再往 FPEC 键寄存器 FLASH_KEYR 中写入 KEY2 = 0xCDEF89AB
  2. 页擦除
    检查 FLASH_SR 寄存器中的“忙碌寄存器位 BSY”,以确认当前未执行任何 Flash 操作;
    在 FLASH_CR寄存器中,将“激活页擦除寄存器位 PER ”置 1;
    用 FLASH_AR 寄存器选择要擦除的页;
    将 FLASH_CR寄存器中的“开始擦除寄存器位 STRT ”置 1,开始擦除;
    等待 BSY 位被清零时,表示擦除完成。
  3. 写入数据
    检查 FLASH_SR 中的 BSY 位,以确认当前未执行任何其它的内部 Flash 操作;
    将 FLASH_CR寄存器中的 “激活编程寄存器位 PG” 置 1;
    向指定的 FLASH 存储器地址执行数据写入操作,每次只能以 16 位的方式写入;
    等待 BSY 位被清零时,表示写入完成。

2 读取Flash内存的实例

要求:
1)在SD卡创建一个test-speed.txt文件,循环(不加延时)分批一次写入256字节,累计写入不少于64KB字节;然后读取此文件数据,通过串口显示出来。分析写入和读取的速率。
2)Flash地址空间的数据读取。stm32f103c8t6只有20KB 内存(RAM)供程序代码和数组变量存放,因此,针对内部Flash的总计64KB存储空间(地址从0x08000000开始),运行一次写入8KB数据,总计复位运行代码4次,将32KB数据写入Flash。并验证写入数据的正确性和读写速率。

2.1 STM32CubeMX 配置

链接:https://pan.baidu.com/s/11Tn8TocHT8qithneDyKFIQ
提取码:pmvn

  1. 时钟配置
    在这里插入图片描述
  2. SYS 配置
    在这里插入图片描述
  3. GPIO_OUT 及配置
    在这里插入图片描述
    在这里插入图片描述
  4. 中断配置
    在这里插入图片描述

2.2 keil 配置

  1. INC文件夹中的flash.h 添加到工程文件中。
    在这里插入图片描述
    在这里插入图片描述

  2. main.c文件中添加头文件 #include "flash.h"

  3. main.c文件中添加如下语句语句:

    /* USER CODE BEGIN 0 */
    uint8_t FlashWBuff [255];
    uint8_t FlashRBuff [255];
    /* USER CODE END 0 */
    

    在这里插入图片描述

      /* USER CODE BEGIN 1 */
    	uint8_t i;
    	uint8_t FlashTest[] = "Hello ,welcom to my world!";
      /* USER CODE END 1 */
    

    在这里插入图片描述

     /* 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. 编译构建:没有错误
    在这里插入图片描述

2.3 调试

2.3.1 硬件调试

电路连线:

ST-Link STM32F103
SWCLK/TCK SWCLK/TCK
SWDIO/TMS SWDIO/TMS
GND GND
VCC VCC

连接好后,如果之前没有安装好ST-Link驱动,要先安装。
安装连接:https://pan.baidu.com/s/1cmreV0

安装好驱动后,查看设备管理器:检测到驱动,没有问题。
在这里插入图片描述

进入 keil 配置,点击 Option
在这里插入图片描述
Setting 中设置:
在这里插入图片描述
点击 Flash Download,勾选图中对应选项。
在这里插入图片描述

2.3.2 软件调试

点击下载:
在这里插入图片描述
Debug——视图——内存窗口——内存1

在这里插入图片描述
输入0x800C000,回车。
在这里插入图片描述

视图——观测窗口——观测1,进行变量的观测。
在这里插入图片描述

main.c文件中,找到变量FlashWBuffFlashRBuff,右击,单击 ‘Add FlashWBuff’ to watch1 。找到如下界面:
在这里插入图片描述

勾选菜单栏 视图——定期窗口更新,点击全速运行:
在这里插入图片描述

观察两个flash,内容相同:
在这里插入图片描述
在这里插入图片描述

3 DAC 概述

  1. DA转换器是把数字量转变成模拟量的器件,按模拟量输出类型通常分为:电流和电压输出类型。常见的DAC是电压输出型,在STM32中集成的DAC转换模块为电压输出型数模转换器。

  2. STM32的DAC模块主要特点有:

    2个DAC转换器:每个转换器对应1个输出通道。
    8位或12位单调输出。
    12位模式下数据左对齐或右对齐。
    同步更新功能。
    噪声波形形成。
    三角波形形成。
    双DAC通道同时或者分别转换。
    

    在这里插入图片描述
    在这里插入图片描述

4 DAC 播放实例

基于片内Flash的提示音播放程序。
1)实验数据准备:用Adobe audition或goldwave等音频编辑软件录制“您好欢迎光临!”的几秒钟的声音(8khz采样、8bit量化编码的单声道wav格式),确保音频数据尽量小(最大不超64KB)。然后编程将其分批次写入stm32f103c8t6芯片内部flash区域。
2)数字音频还原播放任务:编程读取此段音频,分别通过 (a)stm32f103c8t6自带的DAC通道,转换为模拟音频进行播放,并用示波器观察波形,用耳机/喇叭收听,评判音乐还原效果;
提示:建议先用单音音频(比如2000Hz的正弦波)的wav数据进行实验,通过DAC或PCM音频模块能够基本还原出原始正弦波声音后,再用语音和音乐信号进行实验。

4.1 实验准备与测试

4.1.1 用Audition输出一个周期2kHz的正弦波

工程链接:https://pan.baidu.com/s/1gEATonRXK7km3yf-Mu0eEQ
提取码:1234

  1. 打开Adobe Audition CS6,单击:文件——新建——音频文件
    在这里插入图片描述

  2. 效果——生成基本音色
    在这里插入图片描述

  3. 文件——导出——文件
    在这里插入图片描述

  4. 打开WavToC软件。生成代码后记得保存在这里插入图片描述

  5. 打开 keil 工程(上面的连接),打开bsp_dac.c文件,将波形数据 修改为上述保存的 .h 文件中的内容,如图:
    在这里插入图片描述
    修改后:
    在这里插入图片描述

  6. 编译无措,即可烧录观察。
    在这里插入图片描述

4.2 数字音频还原

4.2.1 用DAC将数字音频歌曲转换为模拟音频波形输出

  1. 用上述类似的方法,将 .MP3 文件转换成.wav 文件,并将.wav文件生成代码。
    在这里插入图片描述在这里插入图片描述

5 总结

  • keil在进行软件仿真的时候,不能输出flash对应的内容。因此,到实验室用ST-Link 进行调试。同时,了解了ST-Link 的使用。
  • 音频播放因为缺少示波器,再加上本身没有足够的时间去做,就没有查看波形。
  • 引脚PA4、5可以仿真调试。
  • Flash 对于单片机的应用格外重要,只有掌握了它的读写方式,才能更好地运用它。

6 参考

  1. STM32学习笔记:读写内部Flash
  2. STM32 进阶教程 13 –FLASH的读写操作
  3. 读写内部Flash
  4. STM32F103的DAC——输出声音效果
  5. STM32F103DAC实验

版权声明:本文为CSDN博主「通信小咸鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_46470208/article/details/122223117

生成海报
点赞 0

通信小咸鱼

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

将音频编解码器添加到嵌入式系统的 5 个技巧

嵌入式系统播放音频的能力正在成为一个相当普遍的功能。音频为用户提供了很好的反馈,但如今有如此多的高保真音频可用,使用哔哔声和啁啾声不再削减它。开发人员当然可以使用分立组件和 DAC 从系统中获得不错的音频&#xff0