第50章 读写内部FLASH
全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn
野火视频教程优酷观看网址:http://i.youku.com/firege
本章参考资料:《STM32F4xx 中文参考手册》、《STM32F4xx规格书》、库说明文档《stm32f4xx_dsp_stdperiph_lib_um.chm》。
50.1 STM32的内部FLASH简介
在STM32芯片内部有一个FLASH存储器,它主要用于存储代码,我们在电脑上编写好应用程序后,使用下载器把编译后的代码文件烧录到该内部FLASH中,由于FLASH存储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部FLASH中加载代码并运行,见图 501。
图 501 STM32的内部框架图
除了使用外部的工具(如下载器)读写内部FLASH外,STM32芯片在运行的时候,也能对自身的内部FLASH进行读写,因此,若内部FLASH存储了应用程序后还有剩余的空间,我们可以把它像外部SPI-FLASH那样利用起来,存储一些程序运行时产生的需要掉电保存的数据。
由于访问内部FLASH的速度要比外部的SPI-FLASH快得多,所以在紧急状态下常常会使用内部FLASH存储关键记录;为了防止应用程序被抄袭,有的应用会禁止读写内部FLASH中的内容,或者在第一次运行时计算加密信息并记录到某些区域,然后删除自身的部分加密代码,这些应用都涉及到内部FLASH的操作。
1. 内部FLASH的构成
STM32的内部FLASH包含主存储器、系统存储器、OTP区域以及选项字节区域,它们的地址分布及大小见表 501。
表 501 STM32内部FLASH的构成
区域 |
块 |
名称 |
块地址 |
大小 |
主存储器 |
块1 |
扇区0 |
0x0800 0000 - 0x0800 3FFF |
16 Kbytes |
扇区1 |
0x0800 4000 - 0x0800 7FFF |
16 Kbytes |
||
扇区2 |
0x0800 8000 - 0x0800 BFFF |
16 Kbytes |
||
扇区3 |
0x0800 C000 - 0x0800 FFFF |
16 Kbyte |
||
扇区4 |
0x0801 0000 - 0x0801 FFFF |
64 Kbytes |
||
扇区5 |
0x0802 0000 - 0x0803 FFFF |
128 Kbytes |
||
扇区6 |
0x0804 0000 - 0x0805 FFFF |
128 Kbytes |
||
扇区7 |
0x0806 0000 - 0x0807 FFFF |
128 Kbytes |
||
扇区8 |
0x0808 0000 - 0x0809 FFFF |
128 Kbytes |
||
扇区9 |
0x080A 0000 - 0x080B FFFF |
128 Kbytes |
||
扇区10 |
0x080C 0000 - 0x080D FFFF |
128 Kbytes |
||
扇区11 |
0x080E 0000 - 0x080F FFFF |
128 Kbytes |
||
块2 |
扇区12 |
0x0810 0000 - 0x0810 3FFF |
16 Kbytes |
|
扇区13 |
0x0810 4000 - 0x0810 7FFF |
16 Kbytes |
||
扇区14 |
0x0810 8000 - 0x0810 BFFF |
16 Kbytes |
||
扇区15 |
0x0810 C000 - 0x0810 FFFF |
16 Kbyte |
||
扇区16 |
0x0811 0000 - 0x0811 FFFF |
64 Kbytes |
||
扇区17 |
0x0812 0000 - 0x0813 FFFF |
128 Kbytes |
||
扇区18 |
0x0814 0000 - 0x0815 FFFF |
128 Kbytes |
||
扇区19 |
0x0816 0000 - 0x0817 FFFF |
128 Kbytes |
||
扇区20 |
0x0818 0000 - 0x0819 FFFF |
128 Kbytes |
||
扇区21 |
0x081A 0000 - 0x081B FFFF |
128 Kbytes |
||
扇区22 |
0x081C 0000 - 0x081D FFFF |
128 Kbytes |
||
扇区23 |
0x081E 0000 - 0x081F FFFF |
128 Kbytes |
||
系统存储区 |
0x1FFF 0000 - 0x1FFF 77FF |
30 Kbytes |
||
OTP区域 |
0x1FFF 7800 - 0x1FFF 7A0F |
528 bytes |
||
选项字节 |
块1 |
0x1FFF C000 - 0x1FFF C00F |
16 bytes |
|
块2 |
0x1FFE C000 - 0x1FFE C00F |
16 bytes |
各个存储区域的说明如下:
主存储器
一般我们说STM32内部FLASH的时候,都是指这个主存储器区域,它是存储用户应用程序的空间,芯片型号说明中的1M FLASH、2M FLASH都是指这个区域的大小。主存储器分为两块,共2MB,每块内分12个扇区,其中包含4个16KB扇区、1个64KB扇区和7个128KB的扇区。如我们实验板中使用的STM32F429IGT6型号芯片,它的主存储区域大小为1MB,所以它只包含有表中的扇区0-扇区11。
与其它FLASH一样,在写入数据前,要先按扇区擦除,而有的时候我们希望能以小规格操纵存储单元,所以STM32针对1MB FLASH的产品还提供了一种双块的存储格式,见表 502。(2M的产品按表 501的格式)
表 502 1MB产品的双块存储格式
1M字节单块存储器的扇区分配(默认) |
1M字节双块存储器的扇区分配 |
||||
DB1M=0 |
DB1M=1 |
||||
主存储器 |
扇区号 |
扇区大小 |
主存储器 |
扇区号 |
扇区大小 </ |