你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第三十九章 FLASH模拟EEPROM实验

[复制链接]
正点原子-90136 提问时间:2013-3-28 23:09 /
  
<div style="layout-grid:  15.6pt 0pt">
<a name="_Toc342394310">39.1 STM32 FLASH简介

不同型号的STM32,其FLASH容量也有所不同,最小的只有16K字节,最大的则达到了1024K字节。战舰STM32开发板选择的STM32F103ZET6的FLASH容量为512K字节,属于大容量产品(另外还有中容量和小容量产品),大容量产品的闪存模块组织如图39.1.1所示:

图39.1.1 大容量产品闪存模块组织STM32的闪存模块由:主存储器、信息块和闪存存储器接口寄存器等3部分组成。
主存储器,该部分用来存放代码和数据常数(如const类型的数据)。对于大容量产品,其被划分为256页,每页2K字节。注意,小容量和中容量产品则每页只有1K字节。从上图可以看出主存储器的起始地址就是0X08000000, B0、B1都接GND的时候,就是从0X08000000开始运行代码的。
信息块,该部分分为2个小部分,其中启动程序代码,是用来存储ST自带的启动程序,用于串口下载代码,当B0接V3.3,B1接GND的时候,运行的就是这部分代码。用户选择字节,则一般用于配置写保护、读保护等功能,本章不作介绍。
闪存存储器接口寄存器,该部分用于控制闪存读写等,是整个闪存模块的控制机构。
对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。
在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。
       闪存的读取
内置闪存模块可以在通用地址空间直接寻址,任何32位数据的读操作都能访问闪存模块的内容并得到相应的数据。读接口在闪存端包含一个读控制器,还包含一个AHB接口与CPU衔接。这个接口的主要工作是产生读闪存的控制信号并预取CPU要求的指令块,预取指令块仅用于在I-Code总线上的取指操作,数据常量是通过D-Code总线访问的。这两条总线的访问目标是相同的闪存模块,访问D-Code将比预取指令优先级高。
这里要特别留意一个闪存等待时间,因为CPU运行速度比FLASH快得多,STM32F103的FLASH最快访问速度≤24Mhz,如果CPU频率超过这个速度,那么必须加入等待时间,比如我们一般使用72Mhz的主频,那么FLASH等待周期就必须设置为2,该设置通过FLASH_ACR寄存器设置。
例如,我们要从地址addr,读取一个半字(半字为16为,字为32位),可以通过如下的语句读取:
                    data=*(vu16*)addr;
将addr强制转换为vu16指针,然后取该指针所指向的地址的值,即得到了addr地址的值。类似的,将上面的vu16该位vu8,即可读取指定地址的一个字节。相对FLASH读取来说,STM32 FLASH的写就复杂一点了,下面我们介绍STM32闪存的编程和擦除。
       闪存的编程和擦除
STM32的闪存编程是由FPEC(闪存编程和擦除控制器)模块处理的,这个模块包含7个32位寄存器,他们分别是:
l FPEC键寄存器(FLASH_KEYR)
l 选择字节键寄存器(FLASH_OPTKEYR)
l 闪存控制寄存器(FLASH_CR)
l 闪存状态寄存器(FLASH_SR)
l 闪存地址寄存器(FLASH_AR)
l 选择字节寄存器(FLASH_OBR)
l 写保护寄存器(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位将得到一个警告。
STM23的FLASH编程过程如图39.1.2所示:

图39.1.2 STM32闪存编程过程       从上图可以得到闪存的编程顺序如下:
l 检查FLASH_CR的LOCK是否解锁,如果没有则先解锁
l 检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作
l 设置FLASH_CR寄存器的PG位为’1’
l 在指定的地址写入要编程的半字
l 等待BSY位变为’0’
l 读出写入的地址并验证数据
前面提到,我们在STM32的FLASH编程的时候,要先判断缩写地址是否被擦除了,所以,我们有必要再绍一下STM32的闪存擦除,STM32的闪存擦除分为两种:页擦除和整片擦除。页擦除过程如图39.1.3所示

图39.1.3 STM32闪存页擦除过程
 

从上图可以看出,STM32的页擦除顺序为:
l 检查FLASH_CR的LOCK是否解锁,如果没有则先解锁
l 检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作
l 设置FLASH_CR寄存器的PER位为’1’
l 用FLASH_AR寄存器选择要擦除的页
l 设置FLASH_CR寄存器的STRT位为’1’
l 等待BSY位变为’0’
l 读出被擦除的页并做验证
本章,我们只用到了STM32的页擦除功能,整片擦除功能我们在这里就不介绍了。通过以上了解,我们基本上知道了STM32闪存的读写所要执行的步骤了,接下来,我们看看与读写相关的寄存器说明。
第一个介绍的是FPEC键寄存器:FLASH_KEYR。该寄存器各位描述如图39.1.4所示:

图39.1.4 寄存器FLASH_KEYR各位描述该寄存器主要用来解锁FPEC,必须在该寄存器写入特定的序列(KEY1和KEY2)解锁后,才能对FLASH_CR寄存器进行写操作。
第二个要介绍的是闪存控制寄存器:FLASH_CR。该寄存器的各位描述如图39.1.5所示:

图39.1.5 寄存器FLASH_CR各位描述       该寄存器我们本章只用到了它的LOCK、STRT、PER和PG等4个位。
       LOCK位,该位用于指示FLASH_CR寄存器是否被锁住,该位在检测到正确的解锁序列后,硬件将其清零。在一次不成功的解锁操作后,在下次系统复位之前,该位将不再改变。
       STRT位,该位用于开始一次擦除操作。在该位写入1 ,将执行一次擦除操作。
       PER位,该位用于选择页擦除操作,在页擦除的时候,需要将该位置1。
       PG位,该位用于选择编程操作,在往FLASH写数据的时候,该位需要置1。
       FLASH_CR的其他位,我们就不在这里介绍了,请大家参考《STM32F10xxx闪存编程参考手册》第18页。
       第三个要介绍的是闪存状态寄存器:FLASH_SR。该寄存器各位描述如图39.1.6所示:
 

图39.1.6 寄存器FLASH_SR各位描述       该寄存器主要用来指示当前FPEC的操作编程状态。
       最后,我们再来看看闪存地址寄存器:FLASH_AR。该寄存器各位描述如图39.1.7所示:

图39.1.7 寄存器FLASH_AR各位描述       该寄存器在本章,我们主要用来设置要擦除的页。
       关于STM32 FLASH的介绍,我们就介绍到这。更详细的介绍,请参考《STM32F10xxx闪存编程参考手册》。
<a name="_Toc342394312">39.3 软件设计
打开上一章的工程,首先在HARDWARE文件夹下新建一个STMFLASH的文件夹。然后新建一个stmflash.c和stmflash.h的文件保存在STMFLASH文件夹下,并将这个文件夹加入头文件包含路径。
       打开stmflash.c文件,输入如下代码:
#include "stmflash.h"
#include "delay.h"
#include "usart.h"
//解锁STM32的FLASH
void STMFLASH_Unlock(void)
{
  FLASH->KEYR=FLASH_KEY1;//写入解锁序列.
  FLASH->KEYR=FLASH_KEY2;
}
//flash上锁
void STMFLASH_Lock(void)
{
  FLASH->CR|=1

《STM32开发指南》第三十九章 FLASH模拟EEPROM实验.rar

下载

828 KB, 下载次数: 49, 下载积分: ST金币 -1

实验34 FLASH模拟EEPROM实验.rar

下载

170.53 KB, 下载次数: 42, 下载积分: ST金币 -1

收藏 1 评论1 发布时间:2013-3-28 23:09

举报

1个回答
83012290-203319 回答时间:2013-8-13 15:38:02

回复:【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第三十九章 FLASH模拟EEPROM实验

谢谢!

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版