STM32F103C8T6的内部Flash以及实例

文章目录

  • 〇、EEPROM与Flash(知识储备)
  • 一、STM32F103内部
  • 二、SD卡的读写
    • 1. 说明
    • 2.实验过程
    • 3.从SD卡里读出数据
      • 3.1 代码修改
      • 3.2 结果显示
  • 三、将内容写入flash
    • 1.CubeMX设置
    • 2.代码部分
    • 3.硬件连接以及环境配置
    • 4.调试程序
  • 四、实例——基于片内Flash的提示音播放程序
    • 1.音频准备
    • 2.录制“您好欢迎光临 ”
    • 3.生成wav文件
    • 4.将.wav文件转换成十六进制
    • 5.将生成的音频十六进制写入FLASH
  • 总结
  • 参考资料

〇、EEPROM与Flash(知识储备)

什么是EEPROM?

EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片。
再次强调:它是一种掉电后数据不丢失的存储芯片!
换句话就是说,如果你这次使用断电后,下次使用时,上一次储存的代码依然存在!

在开发项目的时候,总会有需要掉电存储一些配置信息的时候。不过,ST公司为了节约成本,没有加入 EEPROM,但是许多场合下我们需要用EEPROM,怎么办呢?
有一种方法是利用FLASH模拟EEPROM

什么是Flash?

Flash 是存储芯片的一种,通过特定的程序可以修改里面的数据。Flash 存储器又称闪存,它结合了ROM 和RAM 的长处,不仅具备电子可擦除可编程(EEPROM)的性能——不会断电丢失数据,同时可以快速读取数据(NVRAM 的优势)。
再次重申:Flash的巨大特点就是:不会断电丢失数据、快速读取数据!!
那么我们可以基于Flash的这两大优点进行利用。

一、STM32F103内部

补充完EEPROM和Flash的基础知识,下面我们来说说STM32F103的内部结构

  • STM32F103内部结构图
    STM32F103C8T6的内部Flash以及实例_第1张图片
    通过结果图我们可以看到,右上角的就是Flash接口和Flash设备了,除此之外我们还需要注意一个地方,就是在Flash下方的SRAM。

什么是SRAM?

SRAM,全名Static Random-Access Memory,译为静态随机存取存储器,是随机存取存储器的一种。所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。与之相对应的是DRAM,也就是动态随机存取存储器,其里面所储存的数据就需要周期性地更新。然而,当电力供应停止时,SRAM储存的数据是会消失的。

下面我们总结对比一下RAM和Flash:

Flash RAM
地址 flash地址起始于0x0800 0000,结束地址是0x0800 0000+芯片实际的flash大小,不同的芯片flash大小不同 RAM起始地址是0x2000 0000,结束地址是0x2000 0000+芯片的RAM大小。不同的芯片RAM也不同
作用 一般用来存储代码和一些定义为const的数据,断电不丢失 可以理解为内存,用来存储代码运行时的数据,变量等等。掉电数据丢失

相对之下,Flash不会断电丢失数据的特性就被无限放大。

二、SD卡的读写

1. 说明

将64K数据分250次,每次256字节,写入SD卡,测试速度
具体操作,如:硬件连接,协议分析介绍等,可以参考博主前面的博客:SD卡协议原理并用STM32F103 完成对SD卡的数据读取(FAT文件模式)

2.实验过程

STM32F103C8T6的内部Flash以及实例_第2张图片
总共用了13分钟,共写入了64K字节

  • 查看hello.txt文档
    STM32F103C8T6的内部Flash以及实例_第3张图片
    一共有250行数据

3.从SD卡里读出数据

利用FATS从SD卡读出数据,并且串口输出

3.1 代码修改

  • 因为要进行读取,所以将写入部分的函数改为读出函数
    STM32F103C8T6的内部Flash以及实例_第4张图片
  • 声明读出函数,定义双字节数据类型s,用来保存地址(或者存放指针),再定义字节类型格式的变量和一个存储读取的数组
    STM32F103C8T6的内部Flash以及实例_第5张图片
  • ① 修改f_open函数的第三个参数设置为打开状态为FA_READ模式。②文件指针移至相应位置,否则无输出。③指针加地址④使用FATS的read函数,第一个参数是指针,第二个是存储数组,第三个是数组大小,第四个是强制转换br为UINT格式。⑤输出
    STM32F103C8T6的内部Flash以及实例_第6张图片

3.2 结果显示

STM32F103C8T6的内部Flash以及实例_第7张图片

三、将内容写入flash

源码链接:
链接:https://pan.baidu.com/s/1jJ6_YlAI9W81w7h6c7FVBw
提取码:qwer

1.CubeMX设置

  • 将定时器设置成Sys Tick
    STM32F103C8T6的内部Flash以及实例_第8张图片
  • 将引脚PC13配置为输出模式,并使能该引脚
    STM32F103C8T6的内部Flash以及实例_第9张图片
    STM32F103C8T6的内部Flash以及实例_第10张图片
  • 时钟配置
    STM32F103C8T6的内部Flash以及实例_第11张图片
  • 设置堆栈大小
    STM32F103C8T6的内部Flash以及实例_第12张图片

2.代码部分

生成工程文件后,进入MDK,进入代码部分,对代码做如下修改

  • 在main.c中加入如下代码
    STM32F103C8T6的内部Flash以及实例_第13张图片

  • 修改数据内容( 将数组中写入要存储的数据)
    STM32F103C8T6的内部Flash以及实例_第14张图片
    STM32F103C8T6的内部Flash以及实例_第15张图片

3.硬件连接以及环境配置

  • STM32与ST-link连接方式
ST-LINK STM32
SWCLK/TCK SWCLK/TCK
SWDIO/TMS SWDIO/TMS
GND GND
VCC VCC

STM32F103C8T6的内部Flash以及实例_第16张图片

  • 设置debug为st-link debugger
    STM32F103C8T6的内部Flash以及实例_第17张图片

  • 点进去后可以看到要检测出SWDIO有信息即可烧录
    STM32F103C8T6的内部Flash以及实例_第18张图片

4.调试程序

  • 编译工程无错误后,点击download下载程序
    STM32F103C8T6的内部Flash以及实例_第19张图片
    注意,download后,要将STM32调整至工作模式,并按下复位键

  • 进行程序调试,全速运行
    STM32F103C8T6的内部Flash以及实例_第20张图片

  • View->memory windows->memory 1打开内存观察窗口,并在地址栏中输入:0x800c000,观察将要修改的flash区间区容
    STM32F103C8T6的内部Flash以及实例_第21张图片

  • 在Memory 1窗口中可以看到在FLASH地址0x0800C000区成功写入对应内容
    STM32F103C8T6的内部Flash以及实例_第22张图片

  • View->Watch windows->Watch 1打开一个变量观察窗口,将变量FlashWBuff 和 FlashRBuff加入到 Watch 1 观察窗口
    STM32F103C8T6的内部Flash以及实例_第23张图片

  • 全速运行程序,可以看到数组FlashRBuff中内容与数组FlashWBuff中内容一样了
    STM32F103C8T6的内部Flash以及实例_第24张图片

四、实例——基于片内Flash的提示音播放程序

1.音频准备

  • 安装音频处理软件

百度安装网盘:
链接:https://pan.baidu.com/s/1FgJ8f_XZflNWyB_T2SX3sA
提取码:qwer

2.录制“您好欢迎光临 ”

  • 点击录制按钮选择录音时间为2s
    注意:如果没打开麦克风权限,会开始失败!
    STM32F103C8T6的内部Flash以及实例_第25张图片
  • 录音波形如图
    STM32F103C8T6的内部Flash以及实例_第26张图片

3.生成wav文件

  • 打开后一直点着拖动可以选取截取音频范围,然后点击修剪
    STM32F103C8T6的内部Flash以及实例_第27张图片
  • 点击效果->重取样,将采样频率改成8000HZ
    STM32F103C8T6的内部Flash以及实例_第28张图片
  • 点击文件→保存转换→编辑预设→选择8bit 单→设置名称
    STM32F103C8T6的内部Flash以及实例_第29张图片
    STM32F103C8T6的内部Flash以及实例_第30张图片
  • 点击文件->保存转换->Wave->8*8
    STM32F103C8T6的内部Flash以及实例_第31张图片
  • 将修建好的音频以.wav格式保存
    STM32F103C8T6的内部Flash以及实例_第32张图片

4.将.wav文件转换成十六进制

用ultraEdit打开刚刚生成的.wav文件
STM32F103C8T6的内部Flash以及实例_第33张图片

  • CTRL+A,接着鼠标右键,选择 十六进制复制选定视图,将内容粘贴到一个新建文件中
    STM32F103C8T6的内部Flash以及实例_第34张图片
  • 全选后,右键选择范围,选中十六进制的范围
    STM32F103C8T6的内部Flash以及实例_第35张图片
  • 将复制的数据粘贴到notePad++中
    STM32F103C8T6的内部Flash以及实例_第36张图片
  • 采用列编辑,在每一列前面加上0x
    STM32F103C8T6的内部Flash以及实例_第37张图片
    STM32F103C8T6的内部Flash以及实例_第38张图片

5.将生成的音频十六进制写入FLASH

使用野火例程代码
链接:https://pan.baidu.com/s/1n6D4TDhnKX2DxjeOgsxBqQ
提取码:qwer

  • 将生成的音频十六进制放入到Sine12bit中
    STM32F103C8T6的内部Flash以及实例_第39张图片
    将代码烧入到STM32芯片中,再通过PCM模块,接到一个蜂鸣器上即可听到声音。

总结

本篇博客介绍了Flash的特点,并通过实例初步讲解了如何合理的使用它,写入Flash的过程并不复杂,但是将音频文件写入Flash的过程确实繁多,因为首先在写入Flash时,要先将音频转成16进制。注意一点,在数据写不进Flash时,有可能是因为你的芯片没有设置成工作模式。

参考资料

EEPROM——百度百科
STM32F103C8T6使用内部Flash的第63页保存参数
STM32 进阶教程 13 – FLASH的读写操作
STM32F103的DAC——输出声音效果

你可能感兴趣的:(stm32,单片机)