本帖最后由 hejecu 于 2018-11-24 17:09 编辑
第十三章 FLASH数据存储实验
13.1 实验目的
学习STM32的IAP(在应用编程功能),可以把没有用到的片上FLASH用作数据存储。数据手册请参看第2章。
13.2 实验简介
不同型号的STM32F4,其FLASH容量也有所不同,最小的只有128K字节,最大的则达到1024K字节。星光的闪电F407开发板选择的STM32F407ZGT6的FLASH容量为 1024K字节,属于大容量产品(另外还有中容量和小容量产品),其闪存结构图如下:
图13.2.1
STM32F4 的闪存模块由:主存储器、系统存储器、 OPT区域和选项字节等4 部分组成。主存储器,该部分用来存放代码和数据常数(如 const 类型的数据)。分为12个扇区,前个扇区为16KB大小,然后扇区4是64KB大小,扇区5~11 是128K大小,不同容量的STM32F4,拥有的扇区数不一样,比如我们的 STM32F407ZGT6,则拥有全部12个扇区。从上图可以看出主存储器的起始地址就是 0X08000000,B0、B1都接GND的时候,就是从0x08000000 开始运行代码的。
系统存储器,这个主要用来存放 STM32F4 的bootloader 代码,此代码是出厂的时候就固化在STM32F4里面了,专门来给主存储器下载代码的。当B0接 V3.3,B1接GND的时候,从该存储器启动(即进入串口下载模式)。
OTP区域,即一次性可编程区域,共528字节,被分成两个部分,前面 512 字节(32 字节为 1 块,分成16块),可以用来存储一些用户数据(一次性的,写完一次,永远不可以擦除!),后面16字节,用于锁定对应块。
选项字节,用于配置读保护、BOR 级别、软件/硬件看门狗以及器件处于待机或停止模式下的复位。
闪存存储器接口寄存器,该部分用于控制闪存读写等,是整个闪存模块的控制机构。
在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。
编程和擦除闪存
闪存编程一次可以写入8位、16位、32位。
闪存擦除操作可以按页面擦除或完全擦除(全擦除)。全擦除不影响信息块。
为了确保不发生过度编程, 闪存编程和擦除控制器块是由一个固定的时钟控制的。
写操作(编程或擦除)结束时可以触发中断。仅当闪存控制器接口时钟开启时,此中断可以用来从WFI模式退出。
闪存读取
STM32F4 可通过内部的I-Code指令总线或D-Code数据总线访问内置闪存模块,本章我们主要讲解数据读写,即通过D-Code数据总线来访问内部闪存模块。 为了准确读取Flash数据,必须根据CPU时钟(HCLK) 频率和器件电源电压在 Flash 存取控制寄存器 (FLASH_ACR)中正确地设置等待周期数 (LATENCY)。当电源电压低于 2.1V 时,必须关闭预取缓冲器。 Flash等待周期与 CPU 时钟频率之间的对应关系,如表13.2.1 所示:
表13.2.1 CPU时钟(HCLK)频率对应的FLASH等待周期表
具体寄存器内容,请参看数据手册中第2章节的内容。
13.3 电路设计
用到的硬件资源有串口,电路图前面章节介绍过,IAP编程属于片上资源,所以电路图这里略过。
13.4 软件设计
打开光盘目录下的3、程序源码->1、基础实验->下的“实验10 FLASH数据存储实验”工程,打开左侧目录树BSP下的stm32_flash.c文件,此为STM32的FLASH的读写驱动程序文件,工程目录如下图所示:
图13.4.1
打开stm32_flash.c文件,代码如下:
打开main.c,代码如下:
13.5 下载验证
用MINI USB线通过CN3的USB口连接电脑和开发板,拨动电源开关给开发板上电,D3电源指示灯点亮,连接好JLINK/ST-LINK下载调试器,打开“实验10 FLASH数据存储实验”工程代码,编译下载,打开串口调试助手,串口波特率115200,程序功能是向STM32F407ZGT6的FLASH扇区5和6,即地址0x08020000开始处写入250字节数据,然后再读出来,比较读出和写入是否一致,正确串口打印STM32 FLASH ReadWrite OK,错误串口打印STM32 FLASH ReadWrite ERROR。
此内容由EEWORLD论坛网友hejecu原创,如需转载或用于商业用途需征得作者同意并注明出处