介绍使用HAL库对内部FLASH进行写操作
1、为什么要用FLASH存Code:FLASH有掉电保护功能
主存储器:存放代码和数据常量,平时说的芯片内部FLASH的大小就是指的主存储器的大小。起始地址0x08000000,Boot0、Boot1都接GND时从0x08000000开始运行代码
启动程序代码:存储ST自带的启动程序,用来通过串口下载代码。Boot0接3.3V,Boot1接GND时运行这里面的代码
用户选项字节区:配置Flash读写保护、复位、看门狗等功能,共16字节,由选项控制寄存器控制
接口寄存器:整个FLASH的控制机构
说起Flash肯定会提到扇区、页,其实页就是扇区。页的大小要在《STM32F10x闪存编程参考手册》里找。STM32F10x有256页,每页2KB。
向Flash写数据前必须先将页擦除,因为Flash只能将1置0不能把0置1。页为最小擦除单位。擦除后为0xFFFF…。
2、对内部Flash的写入流程
3、写FLASH时要注意不应覆盖原有的数据,所以要看好空间分布
查看工程空间分布:Keil的一般编译后在目录里的Listing文件中的.map文件里,翻到后面出现 “Memory Map of the image”
如下,ROM区域的内容就是Flash内的代码,Base是基地址
某工程的 ROM 存储器分布映像
Memory Map of the image //存储分布映像
Image Entry point : 0x08000131
/* 程序 ROM 加载空间 */
Load Region LR_IROM1 (Base: 0x08000000, Size: 0x0000124c, Max: 0x00010000, ABSOLUTE)
/* 程序 ROM 执行空间 */
Execution Region ER_IROM1 (Exec base: 0x08000000, Load base: 0x08000000, Size: 0x0000123c, Max: 0x00010000, ABSOLUTE)
/* 地址分布列表 */
Exec Addr Load Addr Size Type Attr Idx E Section Name Object
0x08000000 0x08000000 0x00000130 Data RO 3 RESET startup_stm32f103xe.o
0x08000130 0x08000130 0x00000000 Code RO 1758 * .ARM.Collect$$$$00000000 mc_w.l(entry.o)
0x08000130 0x08000130 0x00000004 Code RO 1765 .ARM.Collect$$$$00000001 mc_w.l(entry2.o)
0x08000134 0x08000134 0x00000004 Code RO 1768 .ARM.Collect$$$$00000004 mc_w.l(entry5.o)
0x08000138 0x08000138 0x00000000 Code RO 1770 .ARM.Collect$$$$00000008 mc_w.l(entry7b.o)
0x08000138 0x08000138 0x00000000 Code RO 1772 .ARM.Collect$$$$0000000A mc_w.l(entry8b.o)
0x08000138 0x08000138 0x00000008 Code RO 1773 .ARM.Collect$$$$0000000B mc_w.l(entry9a.o)
0x08000140 0x08000140 0x00000004 Code RO 1780 .ARM.Collect$$$$0000000E mc_w.