
想必大家都知道Flash的作用吧。Flash主要是用来存储程序代码的,内核可从内部Flash中加载代码的运行。首先我们来看一下STM32F103ZET6大容量产品内部的FLASH构成吧。如图FLASH结构图所示。0 }( k" D' [2 d) v! F8 f$ ?' O ! L0 z2 [" w% }' o, @ 主存储器,该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。从上图可以看出主存储器的起始地址就是 0X08000000, B0、B1 都接 GND 的时候,就是从 0X08000000开始运行代码的。 信息块,该部分分为 2 个小部分,其中启动程序代码,是用来存储 ST 自带的启动程序,用于串口下载代码,当 B0 接 V3.3,B1 接 GND 的时候,运行的就是这部分代码。用户选择字节,则一般用于配置写保护、读保护等功能。2 _- y( x) j$ g2 `- m# A, S4 A 7 ]. ] A c t% c( n 闪存存储器接口寄存器,该部分用于控制闪存读写等,是整个闪存模块的控制机构。对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。 W9 _! N. z- P F+ I( s! Z 8 e: B! M) o2 W2 y* m9 L8 i& a 系统存储区,系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动代码,它负责实现串口、USB以及CAN等ISP烧录功能。 3 G J+ @% y I* S: n( j! K L( S 选项字节,选项字节用于配置FLASH的读写保护、待机/停机复位,软件/硬件看门狗等功能,这部分共16字节。可以通过修改FLASH的选项控制寄存器修改。) P, R' h/ S. c 二,对FLASH的写入过程* S4 s1 K9 c$ ?9 }7 t 在对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); FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data); FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data); 既然有FLASH的写入函数也肯定有FLASH的擦除函数,对应的提供了三个固件库擦除函数:! u# q) u3 @6 @, l; U9 @% k FLASH_Status FLASH_ErasePage(uint32_t Page_Address);(页擦除,指定页) FLASH_Status FLASH_EraseAllPages(void);(擦除所有的页数据)% b% i; S4 K5 D8 P9 A, c n FLASH_Status FLASH_EraseOptionBytes(void);(擦除用户选择字节数据)+ P7 P( w1 w: m$ ? - g$ C) p/ ?: c 最后就是读取FLASH状态了。FLASH_Status FLASH_GetStatus(void);通过返回的枚举类型值来判断当前FLASH的状态。. n1 L4 e' q( w k' |8 ? ) ] o6 N) F. p4 W1 s( D: g% K 好了今天就说到这,后续再见! ; |, G8 @ \6 y* m |
å é¨FLASHç»æ
围观 |
谢谢分享![]() |
感谢分享~~ |
谢谢大家围观 |
谢谢分享 |
谢谢分享 |
感谢分享,正好在练习对片内flash的读写操作,学习了。 |