
想必大家都知道Flash的作用吧。Flash主要是用来存储程序代码的,内核可从内部Flash中加载代码的运行。首先我们来看一下STM32F103ZET6大容量产品内部的FLASH构成吧。如图FLASH结构图所示。 * D* K5 }" b" V' P! d 主存储器,该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。从上图可以看出主存储器的起始地址就是 0X08000000, B0、B1 都接 GND 的时候,就是从 0X08000000开始运行代码的。0 {* V( C/ _7 D' I2 q* Y2 m( c, Q 信息块,该部分分为 2 个小部分,其中启动程序代码,是用来存储 ST 自带的启动程序,用于串口下载代码,当 B0 接 V3.3,B1 接 GND 的时候,运行的就是这部分代码。用户选择字节,则一般用于配置写保护、读保护等功能。 4 y+ x- Z9 D7 n1 V- m* y2 S0 Q. G' l 闪存存储器接口寄存器,该部分用于控制闪存读写等,是整个闪存模块的控制机构。对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。9 E! u9 Q5 H' ^% s9 c# y- ` 系统存储区,系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动代码,它负责实现串口、USB以及CAN等ISP烧录功能。: N$ j' |8 ~; b. [4 m$ I3 G( z( A 选项字节,选项字节用于配置FLASH的读写保护、待机/停机复位,软件/硬件看门狗等功能,这部分共16字节。可以通过修改FLASH的选项控制寄存器修改。0 D5 R, t9 f; B" i" V; ^2 W4 u6 E- J 二,对FLASH的写入过程6 B0 T; y/ v3 ^4 z 在对FLASH写操作之前必须先要解锁,解锁操作也就是必须在FLASH_KEYR寄存器写入特定的序列(KEY1和KEY2)。调用库函数void FLASH_Unlock(void);就好,同理写入完成后还要锁住FLASH调用void FLASH_Lock(void)。固件库提供了三个写FLASH的函数: FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data);/ }& S; p* p- W. i. c! e FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);2 }0 d" u f2 I5 D/ a3 u5 R FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data); 既然有FLASH的写入函数也肯定有FLASH的擦除函数,对应的提供了三个固件库擦除函数:% r( O* }' h K9 Z FLASH_Status FLASH_ErasePage(uint32_t Page_Address);(页擦除,指定页): g, o9 o# |: y& c, ~ FLASH_Status FLASH_EraseAllPages(void);(擦除所有的页数据) FLASH_Status FLASH_EraseOptionBytes(void);(擦除用户选择字节数据) ; Q0 H4 [1 w+ G- [$ p6 @ 最后就是读取FLASH状态了。FLASH_Status FLASH_GetStatus(void);通过返回的枚举类型值来判断当前FLASH的状态。0 }4 a" m" K: f, Y& O: I+ P , G% G! G7 V8 I8 J 好了今天就说到这,后续再见!# s+ B- e! A' I! l 3 O+ h2 i" `7 S; ]! G |
å é¨FLASHç»æ
围观 |
谢谢分享![]() |
感谢分享~~ |
谢谢大家围观 |
谢谢分享 |
谢谢分享 |
感谢分享,正好在练习对片内flash的读写操作,学习了。 |