STM32F429内部FLASH读写擦除操作流程和寄存器配置要点

一、STM32F429 FLASH总体介绍

  1. 双bank架构,容量高达2 Mbytes,支持read-while-write边读边写(RWW)
  2. 支持128位宽的数据读取
  3. Byte、half-word、word 、 double word 写入
  4. sector, bank, and mass erase (两个bank)
    Dual bank memory organization
    对于2M产品,一个bank(1 MB)分为4个16 KB的扇区,1个64 KB的扇区和7个128 KB的扇区。
    2Mbytes是两个完整的BANK。对1M产品,可以通过选项字配置为2个512K大小的bank。具体是将sector8-11,4个128K大小的扇区的重新划分为bank2。1Mbytes可以单独作为1个bank使用,也可以分成2个512K的bank使用。DB1M 选项位置1时,为Dual bank模式。如果启用双BANK模式,原来的扇区sector 8-11不再存在,擦除、编程和读取需要注意,此时使用 sector 12-19。
    在这里插入图片描述在这里插入图片描述

二、Read interface 读接口

要从FLASH中正确读取数据,必须根据CPU时钟(HCLK)频率和电源电压值,正确设置FLASH访问控制寄存器(FLASH_ACR)中等待状态数(LATENCY)。 当电源电压低于2.1 V时,必须禁用预取缓冲器。等待状态与CPU时钟频率之间的对应关系在见下表。
在这里插入图片描述MCU复位后,时钟频率为16 MHz,并在FLASH_ACR寄存器中配置了0个等待状态(WS)。用户需要使用软件来调整通过CPU访问闪存所需的等待状态数。

Unlocking the Flash control register
复位后,不允许在闪存控制寄存器(FLASH_CR)中进行写操作,以保护闪存免于因电干扰等可能引起的不良操作。 以下序列用于解锁该寄存器:
在这里插入图片描述
任何错误的顺序都会返回总线错误并锁定FLASH CR寄存器, 直到下一次复位为止 。通过将FLASH_CR寄存器中的LOCK位置1,可以通过软件再次锁定FLASH CR寄存器。
注意:当FLASH_SR寄存器中的BSY位置1时,无法在写模式下访问FLASH_CR寄存器。 尝试将BSY位置1进行写操作将导致AHB总线停顿,直到BSY位被清除为止。
Program/erase parallelism
编程和擦除的数据位宽是是通过FLASH_CR寄存器中的PSIZE字段配置的。 它表示每次对闪存进行写操作时要编程的字节数。 PSIZE受电源电压以及是否使用外部VPP电源限制。 因此,在进行任何编程/擦除操作之前,必须在FLASH_CR寄存器中对其进行正确配置。 闪存擦除操作只能按扇区,存储区或整个闪存(批量擦除)执行。 擦除时间取决于PSIZE编程值。 正确的PSIZE值见表12。
在这里插入图片描述注意:

  1. 任何以不一致的程序并行性/电压范围设置开始的编程或擦除操作都可能导致无法预料的结果。 即使随后的读取操作表明逻辑值已有效写入存储器,也可能不会保留该值。
  2. 要使用VPP,必须将外部高压电源(8至9 V之间)施加到VPPpad。
  3. 即使DC消耗超过10 mA,外部电源也必须能够维持该电压范围。
  4. 建议将VPP的使用限制为在工厂生产线上进行初始编程。
  5. VPP电源的使用时间不能超过一个小时,否则可能会损坏闪存

三、Erase 擦除

Sector Erase

  1. 通过检查FLASH_SR寄存器中的BSY位,确保没有正在进行的闪存操作。
  2. 将SER位置1,并在FLASH_CR中要擦除的主存储块(SNB)中从24个扇区(对于STM32F42xxx和STM32F43xxx)中选择扇区。
  3. 将FLASH_CR寄存器中的STRT位置1。
  4. 等待BSY位被清除。

Bank erase

  1. 通过检查FLASH_SR寄存器中的BSY位,确保没有正在进行的闪存操作。
  2. 相应地将FLASH_CR寄存器中的MER MER1位置1。
  3. 将FLASH_CR寄存器中的STRT位置1。
  4. 等待BSY位被重置。

Mass Erase

  1. 通过检查FLASH_SR寄存器中的BSY位,确保没有正在进行的闪存操作。
  2. 设置FLASH_CR寄存器中的MER MER1位(STM32F42xxx、STM32F43xxx)。
  3. 将FLASH_CR寄存器中的STRT位置1。
  4. 等待BSY位被清除。

注意:

  1. 如果将FLASH_CR寄存器中的MERx和SER位置1,则执行批量擦除。
  2. 如果MERx和SER均被复位并且STRT位置1,则可能发生不可预料的行为,且不会产生任何错误标志。 这种情况应该从程序上禁止发生。

四、Programming 编程

Standard programming

  1. 通过检查FLASH_SR寄存器中的BSY位,确保没有正在进行的闪存操作。
  2. 将FLASH_CR寄存器中的PG位置1。
  3. 对所需的存储器地址(在主存储器块或OTP区域内)执行数据写入操作:
    ––––如果是x8并行,则为字节访问
    ––––如果是x16并行,则为半字访问
    ––––如果是x32,则为字访问
    ––––在x64并行度的情况下双字访问(必须VPP加8-9V电压)。
  4. 等待BSY位被清除。

注意:

  1. 将位从“ 1”更改为“ 0”时,无需擦除操作即可进行成功的写操作。
  2. 写入“ 1”需要执行闪存擦除操作。如果同时需要擦除和编程操作,则需要先执行擦除操作。
    也即是说:闪存擦除后值全部为FFFF,如果想要改为0,则需要写操作。如果要将0改为1,必须先擦除再写。

Programming errors

  1. 不允许将数据越过128位行边界编程到Flash存储器中。 在这种情况下,不执行写操作,并且在FLASH_SR寄存器中设置了程序对齐错误标志(PGAERR)。
  2. 写访问类型(字节,半字,字或双字)必须与并行类型相对应 选择(x8,x16,x32或x64)。 如果没有,则不执行写操作,并且在FLASH_SR寄存器中设置程序并行错误标志(PGPERR)。
  3. 如果不遵守标准的编程顺序(例如,如果在以下情况下尝试写入Flash地址) (PG位未设置),操作将中止,并且FLASH_SR寄存器中的程序序列错误标志(PGSERR)被置位。

Programming and caches
如果闪存写入访问涉及数据缓存中的某些数据,则闪存写入访问会修改闪存中的数据和缓存中的数据。如果闪存中的擦除操作也涉及数据或指令缓存中的数据,则可以 必须确保在代码执行期间访问这些数据之前将其重写。 如果不能安全地完成此操作,建议通过将FLASH_CR寄存器中的DCRST和ICRST位置1来刷新高速缓存。注:仅当禁用I / D高速缓存(I / DCEN = 0)时,才应刷新I / D高速缓存。

Read-While-Write (RWW)
在STM32F42xxx和STM32F43xxx器件中,闪存分为两个存储区,允许同时读写操作。 此功能允许从一个存储体执行读取操作,同时对另一存储体执行擦除或编程操作。 注意:不允许边写边写操作。 例如,对一个存储体进行编程时不可对另一存储体执行擦除操作。

Read from bank 1 while erasing bank 2
在从bank1执行程序代码时,可以在bank2上执行擦除操作(反之亦然)。 请按照以下步骤操作:

  1. 通过检查FLASH_SR寄存器中的BSY位,确保没有正在进行的闪存操作。(在bank1或bank2上进行擦除/编程操作时,BSY位为1)
  2. 将FLASH_CR寄存器中的MER或MER1位置1。
  3. 将FLASH_CR寄存器中的STRT位置1。
  4. 等待BSY位被复位(或使用EOP中断)。

Read from bank 1 while programming bank 2
从bank1执行程序代码(通过I代码总线)时,可以对bank2执行编程操作(反之亦然)。 请按照以下步骤操作:

  1. 通过检查FLASH_SR寄存器中的BSY位,确保没有正在进行的闪存操作。(在bank1或bank2上进行擦除/编程操作时,BSY位为1)
  2. 将FLASH_CR寄存器中的PG位置1。
  3. 对主存储块或OTP区域内的所需存储地址执行数据写入操作。
  4. 等待BSY位被重置

Interrupts

  1. 设置FLASH_CR寄存器中的操作结束中断允许位(EOPIE)可以在擦除或编程操作结束时,即FLASH_SR寄存器中的忙位(BSY)被清除(操作完成,是否正确)时产生中断。在这种情况下,FLASH_SR寄存器中的操作结束(EOP)位置1。
  2. 如果在编程、擦除或读取操作请求期间发生错误,则FLASH_SR寄存器中将设置以下错误标志之一:
    ------PGAERR,PGPERR,PGSERR(程序错误标志)
    ------WRPERR(写保护错误标志)
    ------RDERR(读保护错误标志)。(仅用于STM32F42xxx和STM32F43xxx器件)
    在这种情况下,如果FLASH_CR中的错误中断允许位(ERRIE)被置位,将产生一个中断并将FLASH_SR寄存器中的操作错误位(OPERR)置为1。
    注意:
    如果检测到多个连续错误(例如,如果将DMA传输到闪存),则无法清除错误标志直到连续的写请求结束。

五、Programming user option bytes

选项字节由最终用户根据应用程序来配置。 表14显示了这些字节在用户配置扇区内的组织。
在这里插入图片描述在这里插入图片描述在这里插入图片描述要对该扇区执行任何操作,必须清除Flash选项控制寄存器(FLASH_OPTCR)中的选项锁定位(OPTLOCK)。 要允许清除该位,必须执行以下顺序:

  1. 在Flash选项密钥寄存器(FLASH_OPTKEYR)2中写入OPTKEY1 = 0x0819 2A3B。
  2. 在Flash选项密钥寄存器(FLASH_OPTKEYR)中写入OPTKEY2 = 0x4C5D 6E7F
    通过软件将OPTLOCK位置1,可以保护用户选项字节免受不必要的擦除/编程操作。

Modifying user option bytes on STM32F42xxx and STM32F43xxx

bank 1和bank 2的用户选项字节不能单独修改, 它们必须同时更新。 要修改用户选项字节值,需遵循以下顺序:
1.通过检查FLASH_SR寄存器中的BSY位,确保没有正在进行的闪存操作。
2.将bank2选项字节值写入 FLASH_OPTCR1 寄存器
3.将bank 1选项字节值写入 FLASH_OPTCR 寄存器。
4.设置FLASH_OPTCR寄存器中的选项起始位(OPTSTRT
5.等待BSY位被清除
注意:通过首先擦除用户配置扇区(存储区1和2),然后使用FLASH_OPTCR和FLASH_OPTCR1寄存器中包含的值对所有选项字节进行编程,将自动修改选项字节的值。

Write protections
最多可以保护24个用户扇区免受不必要的意外写操作。当FLASH_OPTCR或FLASH_OPTCR1寄存器中的非写保护nWRPi位(0≤i≤11)为低时,无法擦除或编程相应的扇区。因此,如果其中一个扇区被写保护,则无法执行MASS擦除。如果尝试对FLASH的写保护部分进行擦除/编程操作(该扇区受写保护位保护,OTP部分被锁定或对于永远无法像ICP一样写入的闪存,则在FLASH_SR寄存器中设置了写保护错误标志(WRPERR)。在STM32F42xxx和STM32F43xxx器件上,当设置了PCROP模式时,nWRPi的有效电平为高,并且当nWRPi为高时,相应的扇区i被写保护。 PCROP扇区是自动写保护的。
注意:选择FLASH读保护级别(RDP级别= 1)时,如果连接了CPU调试功能(JTAG或单线)或正在从RAM执行引导代码,则无法编程或擦除闪存扇区i,即使nWRPi = 1。
如果对闪存的写保护区域执行了擦除/编程操作,则FLASH_SR寄存器中的写保护错误标志(WRPERR)被置位;如果请求擦除操作,则在以下情况下WRPERR位置1:

  1. 配置了mass,bank,sector擦除(MER或MER / MER1和SER = 1)
  2. 请求擦除扇区,并且扇区编号SNB字段无效
  3. 在写入至少一个用户扇区时请求批量擦除 由选项位保护(MER或MER / MER1 = 1且FLASH_OPTCRx寄存器中的0≤i≤11位的nWRPi =0。
  4. 在写保护的扇区上请求扇区擦除。(SER = 1,SNB = i,nWRPi = 0,FLASH_OPTCRx寄存器中的0≤i≤11位)
  5. Flash存储器受读出保护,并检测到入侵。

如果请求编程操作,则在以下情况下将WRPERR位置1:

  1. 在系统内存或用户特定扇区的保留部分上执行写操作。
  2. 对用户配置扇区执行写操作。
  3. 对受选项位保护的扇区写操作执行写操作。
  4. 在已经锁定的OTP区域上请求写操作。
  5. 闪存受到读保护,并检测到入侵。

Proprietary code readout protection (PCROP)
专有的读取保护(PCROP)仅在STM32F42xxx和STM32F43xxx器件上可用。 使用专有的读取保护(PCROP),可以保护闪存用户扇区(0至23)免受D总线读取访问。 通过FLASH_OPTCR寄存器中的SPRMOD选项位来选择PCROP保护。
在这里插入图片描述
当扇区被读出保护(激活PCROP模式)时,只能通过Flash接口上的ICODE总线对其进行访问以获取代码。
在这里插入图片描述
在这里插入图片描述
仅当RDP级别从1更改为0时,才可以禁用SPRMOD和/或对PCROPed用户扇区进行保护。
如果不遵守此条件,则取消用户选项字节修改,并设置写错误WRPERR标志。
允许修改用户选项字节(BOR_LEV,RST_STDBY,…),因为没有激活的nWRPi位被复位并且SPRMOD保持激活状态。
注意:当PCROP模式有效(SPRMOD = 1)时,nWRPi位的有效值反转。如果SPRMOD = 1并且nWRPi = 1,则bank1的用户扇区i(bank2类似)受到读/写保护(PCROP)。

.
.

六、Flash interface registers 接口寄存器

flash access control register (FLASH_ACR)
闪存访问控制寄存器用于启用/禁用加速功能,并根据CPU频率控制闪存访问时间。因为主频较高,所以LANTENCY多了1bit,从7个CPU周期等待时间延长到15个CPU周期等待时间。
在这里插入图片描述.
.

Flash key registe(FLASH_KEYR)
闪存密钥寄存器用于允许访问闪存控制寄存器,因此可以进行编程和擦除操作。
在这里插入图片描述.
.

Flash option key register(FLASH_OPTKEYR)
Flash选项密钥寄存器用于允许用户配置扇区中的编程和擦除操作。
在这里插入图片描述

.

Flash status register (FLASH_SR) for STM32F42xxx and STM32F43xxx
闪存状态寄存器提供有关正在进行的编程和擦除操作的信息。
在这里插入图片描述在这里插入图片描述.

Flash control register (FLASH_CR) for STM32F42xxx and STM32F43xxx

闪存控制寄存器用于配置和启动闪存操作。

在这里插入图片描述
在这里插入图片描述.
.
Flash option control register (FLASH_OPTCR)
FLASH_OPTCR寄存器用于修改用户选项字节。
在这里插入图片描述在这里插入图片描述在这里插入图片描述.
.
**Flash option control register (FLASH_OPTCR1)for STM32F42xxx and STM32F43xxx **
该寄存器仅在STM32F42xxx和TM32F43xxx上可用。FLASH_OPTCR1寄存器用于修改bank2的用户选项字节。
在这里插入图片描述PCROP 为Proprietary code readout protection 的缩写,也就是说这是一个专有代码读出保护的功能。与RDP 对整片Flash读保护不同的是,它只是针对Flash 的某些特定区域进行代码的读写保护。所以它可以被用来保护一些IP代码,方便进行二次开发。它存在于多个STM32系列中,比如STM32F4,STM32L4,STM32F7等。
Write protectionon sector i和PCROP protection on sector i不同时存在,通过FLASH_OPTCR的SPRMOD位进行选择,置0为选择Write protectionon ,置1为选择PCROP protection 。该位影响FLASH_OPTCR和FLASH_OPTCR1两个寄存器的第16-27位配置的0-11扇区保护方式。
.
.
FLASH寄存器map和复位值

在这里插入图片描述在这里插入图片描述

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
GD32芯片中的Bank1是指Flash存储器的第一区域,可以用于存储应用程序代码。下面介绍一下如何进行GD32 Bank1的操作: 1. 首先需要在代码中定义Bank1的起始地址和大小,可以通过以下方式进行定义: ``` #define BANK1_START_ADDR ((uint32_t)0x08008000) // Bank1的起始地址 #define BANK1_SIZE ((uint32_t)0x00008000) // Bank1的大小为32KB ``` 2. 然后需要在代码中对Flash进行解锁操作,才能进行写入操作。解锁操作代码如下: ``` FLASH_Unlock(); // 解锁Flash FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); // 清除Flash状态标志位 ``` 3. 然后进行Flash擦除操作,将Bank1区域的Flash擦除擦除操作代码如下: ``` FLASH_ErasePage(BANK1_START_ADDR); // 擦除Bank1区域的Flash ``` 4. 接下来可以进行数据的写入操作,将应用程序代码写入Bank1区域。写入操作代码如下: ``` uint32_t *pSrc = (uint32_t *)APP_CODE_ADDR; // 应用程序代码的起始地址 uint32_t *pDest = (uint32_t *)BANK1_START_ADDR; // Bank1的起始地址 uint32_t len = BANK1_SIZE / 4; // 数据长度 for (uint32_t i = 0; i < len; i++) { FLASH_ProgramWord((uint32_t)pDest++, *pSrc++); // 将数据写入Flash } ``` 5. 最后需要对Flash进行锁定操作,以保护写入的数据不被修改。锁定操作代码如下: ``` FLASH_Lock(); // 锁定Flash ``` 以上就是对GD32 Bank1的操作流程,需要注意的是,在进行Flash写入操作时,需要确保数据的正确性和可靠性,避免因为写入错误而导致系统发生不可预知的错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydgd118

您的鼓励是我最大的动力!谢赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值