3653|6

16

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

【连载】【星光闪电STM32F407开发板】第十三章 FLASH数据存储实验 [复制链接]

本帖最后由 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原创,如需转载或用于商业用途需征得作者同意并注明出处


实验10 FLASH数据存储实验.zip

653.56 KB, 下载次数: 44

此帖出自stm32/stm8论坛

最新回复

如果你实在不想看这些。那么请参考st官方的参考AN2594.pdf这个文档  详情 回复 发表于 2018-11-24 18:41
点赞 关注(2)
 

回复
举报

1366

帖子

6

TA的资源

版主

沙发
 
这种擦写方式,每次如果数据不一样,就得擦除整个扇区。特别是128k的,还有寿命也就1万多次。你这样的暴力擦写方式实在不符合数据变化存储
此帖出自stm32/stm8论坛
 
 

回复

1366

帖子

6

TA的资源

版主

板凳
 
如果是存储相关固定得标志变量,擦写次数不多,这种暴力方式完全没意见。但是对于数据变化比较频繁的存储。建议均衡写法
此帖出自stm32/stm8论坛
 
 

回复

1366

帖子

6

TA的资源

版主

4
 
也就是说,Flash我们都知道,凡是ff的都可以进行写。那么假设需要存储10个字节,那么128k的扇区起码可以写一万三次才会擦除一次扇区。可能在效率上没有暴力写法高,但是从寿命保证上,能提高不是一个档次
此帖出自stm32/stm8论坛
 
 
 

回复

1366

帖子

6

TA的资源

版主

5
 
我说了那么多,你也许会问,有例子吗?那么github的easyflash了解下。或者自己写个算法
此帖出自stm32/stm8论坛
 
 
 

回复

1366

帖子

6

TA的资源

版主

6
 
发这种教程,所谓的百度大多都是这种教程。面对这么暴力的,实际项目可不给你这么操作。要么均衡要么搞个外部erprom
此帖出自stm32/stm8论坛
 
 
 

回复

1366

帖子

6

TA的资源

版主

7
 
如果你实在不想看这些。那么请参考st官方的参考AN2594.pdf这个文档
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表