需要写入Flash的寄存器,需要先向Key寄存器写入密钥
关于双块存储模式,请查看STM32F4最新的英文参考手册

由于内部 FLASH 空间主要存储的是应用程序,是非常关键的数据,为了防止误操作修改了这些内容,芯片复位后默认会结 FLASH 上锁,这个时候不允许设置 FLASH 的控制寄存器,并且不能对修改 FLASH 中的内容。
复位后,Flash 控制寄存器 (FLASH_CR) 不允许执行写操作,以防因电气干扰等原因出现对 Flash 的意外操作。
解锁的操作步骤如下
通过软件将 FLASH_CR 寄存器中的 LOCK 位置为 1 来锁定 FLASH_CR 寄存器

在内部 FLASH 进行擦除及写入操作时,电源电压会影响数据的最大操作位数,该电源电压可通过配置 FLASH_CR 寄存器中的 PSIZE 位改变


大部分应用场合都是用32位的宽度。
在写入新的数据前,需要先擦除存储区域,STM32 提供了扇区擦除指令和整个 FLASH 擦除 (批量擦除) 的指令,批量擦除指令仅针对主存储区。
擦除完成后记得将SER/MER为复位
写/擦除操作进行期间不能从 Flash 中执行代码或数据获取操作



批量擦除


写/擦除操作进行期间不能从 Flash 中执行代码或数据获取操作
擦除完毕后即可写入数据,写入数据的过程并不是仅仅使用指针向地址赋值,赋值前还还需要配置一系列的寄存器,步骤如下:

使用指针读取数据内容
比如:
(__IO uint32_t*)addr;
(__IO uint16_t*)addr;
(__IO uint8_t*)addr;
最好检查下BUSY位是否置位,检查Flash是否忙碌

.map文件中,搜索Memory Map of the image
查看Load Region
Load Region LR_IROM1 (Base: 0x08000000, Size: 0x0006ebb4, Max: 0x00070000, ABSOLUTE, COMPRESSED[0x0006e638])
该工程文件写入Flash的起始地址为0x0800 0000,写入的字节长度为0x0006 ebb4
选项字节是一段特殊的 FLASH 空间,STM32 芯片会根据它的内容进行读写保护、复位电压等配置,选项字节的构成见表选项字节的构成


修改选项字节的 RDP 位的值可设置内部 FLASH 为以下保护级别:
也就是说,在级别 1 模式下,任何尝试从外部访问内部 FLASH 内容的操作都被禁止,例如无法通过下载器读取它的内容,或编写一个从内部 SRAM 启动的程序,若该程序读取内部 FLASH,会被禁止。而如果是芯片自己访问内部 FLASH,是完全没有问题的,例如前面的“读写内部 FLASH”实验中的代码自己擦写内部 FLASH 空间的内容,即使处于级别 1 的读保护,也能正常擦写。
当芯片处于级别 1 的时候,可以把选项字节的 RDP 位重新设置为 0xAA,恢复级别 0。在恢复到级别 0 前,芯片会自动擦除内部 FLASH 及备份 SRAM 的内容,即降级后原内部 FLASH 的代码会丢失。在级别 1 时使用 SRAM 自举的程序也可以访问选项字节进行修改,所以如果原内部 FLASH 的代码没有解除读保护的操作时,可以给它加载一个 SRAM 自举的程序进行保护降级,
不同级别下的访问限制见图不同级别下的访问限制 。

修改选项字节的内容可修改各种配置,但是,当应用程序运行时,无法直接通过选项字节的地址改写它们的内容,例如,接使用指针操作地址 0x1FFFC0000 的修改是无效的。要改写其内容时必须设置寄存器 FLASH_OPTCR 及 FLASH_OPTCR1 中的对应数据位。
默认情况下,FLASH_OPTCR 寄存器中的第 0 位 OPTLOCK 值为 1,它表示选项字节被上锁,需要解锁后才能进行修改,当寄存器的值设置完成后,对 FLASH_OPTCR 寄存器中的第 1 位 OPTSTRT值设置为 1,硬件就会擦除选项字节扇区的内容,并把 FLASH_OPTCR/1 寄存器中包含的值写入到选项字节。

在 STM32F42xx 及 STM32F43xx 系列的芯片中,除了可使用 RDP 对整片 FLASH 进行读保护外,还有一个专用的代码读出保护功能(Proprietary code readoutprotection,下面简称 PCROP),它可以为内部 FLASH 的某几个指定扇区提供保护功能,所以它可以用于保护一些 IP 代码,方便提供给另一方进行二次开发,
当 SPMOD 位设置为 0 时 (默认值),nWRPi 位用于指定要进行写保护的扇区,这可以防止错误的指针操作导致 FLASH 内容的改变,若扇区被写保护,通过调试器也无法擦除该扇区的内容;
当SPMOD 位设置为 1 时,nWRPi 位用于指定要进行 PCROP 保护的扇区。其中 PCROP 功能可以防止指定扇区的 FLASH 内容被读出,而写保护仅可以防止误写操作,不能被防止读出。
一般SPMOD = 0 即可,写保护
工程文件下载链接