目录

  • 一、前言
  • 二、题目要求
  • 三、什么是片内flash
  • 四、闪存的编程和擦除
  • 五、基于flash的数据读取
    • 1、工程创建
    • 2、修改代码
    • 3、烧录
    • 4、调试
  • 六、基于flash的提示音播放
    • 1、生成正弦波数据
    • 2、使用DAC转换播放音频
  • 参考资料

一、前言

本文是基于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)管理;编程与擦除的高电压由内部产生。

在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。
具体可以参考: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 编程过程如下:

从上图可以得到闪存的编程顺序如下:

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

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

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

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

⑤ 等待 BSY 位变为’0’

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

五、基于flash的数据读取

1、工程创建

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

设置堆栈的大小,这里设置为4K(也可设置为2K)。

紧接着我们导出工程就OK了。

2、修改代码

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

接着打开main.c文件,看到我们存储数据的数组,在里面我们可以修改需要存储的数据

然后进行编译无错即可。

3、烧录

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

ST-link STM32
SWCLK SWCLK
SWDIO SWDIO
GND GND
VCC VCC

连线结果如图所示:

紧接着我们回到Keil工程中,点击“仙女棒”,在“Debug”选项卡中选择ST-link

在选择完之后查看右边的“SWDIO”,如果显示了“IDCODE”就表示ST-link连接成功:

然后点击下载按钮可以将程序下载到我们的板子中

注意我们一定要选择正确自己板子的型号,因为ST-link在烧录的时候会严格地检查STM32型号,如果板子型号选择错误就会报错。

4、调试

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

一直连接上板子然后进入debug,千万不要选择仿真调试,点击视图—>观测窗口—>随便选择一个窗口

紧接着在右下角的Memory1窗口中输入我们存储数据的地址0x0800C000

点击全速运行,可以看到板子上的PC13 LED亮起,然后Memory 1窗口中出现之前存储的数据,证明数据成功写入

断电之后再次上电进行调试,程序依然停在while循环前,可以看到上次写入的数据还在其中,证明已经将数据写入到flash中

实验完成

六、基于flash的提示音播放

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

1、生成正弦波数据

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

设置采样率和位深度,八位的八比特采样

插入基本音色(正弦波)

导出为wab文件

生成wav文件之后,用UltraEdit将其打开,Ctrl+A选择全部然后右键点击选择选择范围,输入12-59列

这就选中需要的数据了,紧接着右键点击然后十六进制复制选定视图,再将十六进制数赋值到notepad++中,选中要添加的行然后Alt+C添加0x即可
这里我们直接用DAC生成正弦波的工程提取码:1111,然后将生成得到的数据粘贴进入数组即可(记得修改数组大小)

将数据粘贴进去过后编译下载并烧录。
用示波器观察PB5输出的波形

实验成功

2、使用DAC转换播放音频

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

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

参考资料

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

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

  1. 基于stm32f103c8t6的flash的数据读取以及提示音播放程序

    文章目录 一. 题目 二. 所使用软件硬件 三. 基于flash的数据读取 四. 基于片内Flash的提示音播放程序 1. 使用DAC输出周期2khz的正弦波 2. 使用DAC输出数字音频歌曲数据转换 ...

  2. 基于STM32F103完成对SD卡的数据读取(fat文件模式)

    文章目录 实验内容 一.SD卡协议 (一).SD卡简介 (二).SD 卡物理结构 (三).SD卡总线 二.基于STM32F103完成对SD卡的数据读取 (一).创建工程 (二).修改代码 (三).串口 ...

  3. STM32利用flash读取音频数据读取与DAC播放

    目录 一.博客内容 二.Flash地址空间的读取 2.1 Flash原理 2.2 软.硬件准备 2.3 利用CubeMX建立工程 2.4 工程代码 2.5 ST-Link的使用 ​2.6 仿真调试 三 ...

  4. STM32F103完成对SD卡的数据读取(fat文件模式)

    目录 一.关于SD卡 1.简介 2.SD卡的寄存器 3.SD卡读取与写入(SPI模式) 二.实验操作 1.仪器 2.代码 3.连线 4.烧录程序 5.串口调试助手初始化并写入文件 6.sd卡里hell ...

  5. STM32F103完成对SD卡的数据读取

    目录 一.SD卡介绍 1.概述 2.SD模式 3.SD卡读取与写入(SPI模式) 二. STM32F103完成对SD卡的数据读取 1.代码部分 2.U盘格式化 3.电路连接 4.具体实现 三.参考资料 ...

  6. 【嵌入式20】STM32F103完成对SD卡的数据读取详细操作

    本文主要利用STM32F103完成对SD卡的数据读取,介绍该实验的详细操作 一.题目要求 二.SD卡协议原理 1.SD卡简述 2.SD卡物理结构 3.SD卡寄存器 4.SD卡操作模式 5.SD卡初始化 ...

  7. 使用Altium Designer 绘制原理图并且使用STM32F103完成对SD卡的数据读取

    使用Altium Designer 绘制原理图并且使用STM32F103完成对SD卡的数据读取 前言 实验要求 一. 电路原理图绘制 软件安装配置过程 (一)绘制stm32最小系统的电路原理图 1.新 ...

  8. 树莓派云音乐c语言,基于树莓派的红外遥控版网易云音乐播放器

    基于树莓派的红外遥控版网易云音乐播放器.下面是遥控键盘示意图: CH- CH CH+ << >> || - + EQ 0 100+ 200+ 1 2 3 4 5 6 7 8 9 ...

  9. linux树莓派网易云音乐,基于树莓派的红外遥控版网易云音乐播放器

    基于树莓派的红外遥控版网易云音乐播放器.下面是遥控键盘示意图: CH- CH CH+ << >> || - + EQ 0 100+ 200+ 1 2 3 4 5 6 7 8 9 ...

最新文章

  1. some learning
  2. 【建议收藏】复盘:2021年最新、最全、最实用的Android岗学习资料/面试真题
  3. mysql释放练级_面试官:谈谈Mysql事务隔离级别?
  4. springboot 得到端口_带你入门SpringBoot
  5. python进阶书籍的推荐-Python 入门到进阶书籍推荐
  6. python 加注拼音-Python 获取中文字拼音首个字母的方法
  7. Java排序算法之——希尔排序
  8. strtus2改成springboot_jdk1.6环境下struts2改spring boot方案
  9. netty冲突 play sbt_netty4 实现一个断点上传大文件功能
  10. 产品小白的知识点1——用户周期
  11. 新闻事件报道重要性判定项目
  12. 视频+笔记+能够跑通的代码,《李宏毅机器学习完整笔记》发布!
  13. VMware中安装Centos 7
  14. 跨境电商适合做独立站吗?是入平台好还是独立站好?
  15. Linux 命令tar的简单用法
  16. 联想g485服务器未能登陆,Lenovo G485 USB3.0驱动程序安装不上的解决方法
  17. FPGA-小梅哥时序分析
  18. linux关闭3389端口,如何修改云服务器(Windows、Linux)的默认3389远程端口?
  19. WorkFusion智能文档处理IDP系统介绍
  20. Linux中配置RAID磁盘阵列

热门文章

  1. 英特尔官方发布Atom N435芯片
  2. 2022年广西二级建造师建设工程安全生产法律制度多选题及答案
  3. android 从相册选取图片在小米手机报错的解决办法
  4. 使用verdaccio搭建私有npm仓库
  5. Java多店版会员管理系统全套源码,后端springMVC+前端Uni-app
  6. javascript实现图片轮播(一次显示多图片)
  7. oracle 所有字母大写,Oracle函数(把每个单词首个字母变为大写)
  8. E3-1230和E3-1230 V2有多神?
  9. Python-用动漫小姐姐实现马赛克拼图
  10. MySQL设置主键、联合主键、外键、唯一约束、非空约束、默认约束