关于STM32内部flash闪存的总结和配置

存储器的概述:(源于数电教材)

分类:        只读存储器(ROM)   只写存储器(RAM)

只读存储器(ROM):

 只写存储器(RAM):


嵌入式 Flash:(以STM32f407为例)

内存容量:  stmf407内存512k

Flash 具有以下主要特性:

● 对于 STM32F40x 和 STM32F41x,容量高达 1 MB;对于 STM32F42x 和 STM32F43x,
容量高达 2 MB
● 128 位宽数据读取
● 字节、半字、字和双字数据写入
● 某个扇区擦除与全部擦除
● 存储器组织结构
● 低功耗模式(有关详细信息,请参见参考手册的“电源控制 (PWR)”部分)

Flash 结构:
— 主存储器块,分为 4 个 16 KB 扇区、1 个 64 KB 扇区和 7 个 128 KB 扇区
— 系统存储器,器件在系统存储器自举模式下从该存储器启动
— 512 字节 OTP(一次性可编程),用于存储用户数据
OTP 区域还有 16 个额外字节,用于锁定对应的 OTP 数据块。
— 选项字节,用于配置读写保护、BOR 级别、软件/硬件看门狗以及器件处于待机或
停止模式下的复位。 

注意:我们的f407只有3个128kb的沙扇区,对扇区进行访问或者擦除的时候需要计算出其实地址和结束地址,用户下载数据时候,是从起始地址下载进去的;

注意:

              用户在存储自定义的数据时候,尽量从后面开始存储数据;避免对用户数据进行干扰

内部FLASH使用方法:

1.flash解锁-->2.flash擦除-->3.flash写入-->4.flash上锁-->5.flash读取

第一步:Flash 控制寄存器解锁:

        原因:复位后,Flash 控制寄存器 (FLASH_CR) 不允许执行写操作,以防因电气干扰等原因出现对Flash 的意外操作。

寄存器的解锁顺序如下:
1. 在 Flash 密钥寄存器 (FLASH_KEYR) 中写入 KEY1 = 0x45670123
2. 在 Flash 密钥寄存器 (FLASH_KEYR) 中写入 KEY2 = 0xCDEF89AB

注意:如果顺序出现错误,将返回总线错误并锁定 FLASH_CR 寄存器,直到下一次复位。

具体步骤:

第二步:flash擦除:

        擦除扇区之前需要设计编程/擦除并行位数,决定了写入的时间,Flash 擦除操作可针对扇区或整个 Flash(批量擦除)执行。执行批量擦除时,不会影响OTP 扇区或配置扇区。

扇区擦除的具体步骤如下:

1. 检查 FLASH_SR 寄存器中的 BSY 位,以确认当前未执行任何 Flash 操作
2. 在 FLASH_CR 寄存器中,将 SER 位置 1,并从主存储块的 12 个 (STM32F405xx/07xx
和 STM32F415xx/17xx) 或 24 个 (STM32F42xxx 和 STM32F43xxx) 扇区中选择要擦除
的扇区 (SNB) 需要指定扇区号(0~7),通过扇区地址计算,本芯(STM32F407)片只有7个扇区
3. 将 FLASH_CR 寄存器中的 STRT 位置 1开始擦除扇区
4. 等待 BSY 位清零 等待擦除完成

 

通过扇区地址判断扇区号的自定义函数:

//获取flash的扇区号   通过扇区地址进行获取
uint32_t GetSector(uint32_t Address)
{
  uint32_t sector = 0;
  
  if((Address < ADDR_FLASH_SECTOR_1) && (Address >= ADDR_FLASH_SECTOR_0))
  {
    sector = FLASH_Sector_0;  
  }
  else if((Address < ADDR_FLASH_SECTOR_2) && (Address >= ADDR_FLASH_SECTOR_1))
  {
    sector = FLASH_Sector_1;  
  }
  else if((Address < ADDR_FLASH_SECTOR_3) && (Address >= ADDR_FLASH_SECTOR_2))
  {
    sector = FLASH_Sector_2;  
  }
  else if((Address < ADDR_FLASH_SECTOR_4) && (Address >= ADDR_FLASH_SECTOR_3))
  {
    sector = FLASH_Sector_3;  
  }
  else if((Address < ADDR_FLASH_SECTOR_5) && (Address >= ADDR_FLASH_SECTOR_4))
  {
    sector = FLASH_Sector_4;  
  }
  else if((Address < ADDR_FLASH_SECTOR_6) && (Address >= ADDR_FLASH_SECTOR_5))
  {
    sector = FLASH_Sector_5;  
  }
  else if((Address < ADDR_FLASH_SECTOR_7) && (Address >= ADDR_FLASH_SECTOR_6))
  {
    sector = FLASH_Sector_6;  
  }
  else if((Address < ADDR_FLASH_SECTOR_8) && (Address >= ADDR_FLASH_SECTOR_7))
  {
    sector = FLASH_Sector_7;  
  }
  else if((Address < ADDR_FLASH_SECTOR_9) && (Address >= ADDR_FLASH_SECTOR_8))
  {
    sector = FLASH_Sector_8;  
  }
  else if((Address < ADDR_FLASH_SECTOR_10) && (Address >= ADDR_FLASH_SECTOR_9))
  {
    sector = FLASH_Sector_9;  
  }
  else if((Address < ADDR_FLASH_SECTOR_11) && (Address >= ADDR_FLASH_SECTOR_10))
  {
    sector = FLASH_Sector_10;  
  }
  
  else/*(Address < FLASH_END_ADDR) && (Address >= ADDR_FLASH_SECTOR_11))*/
  {
    sector = FLASH_Sector_11;  
  }

  return sector; //把计算出来的扇区号返回
}

具体步骤:

 

第三/四步:flash写入flash上锁:

可通过软件将 FLASH_CR 寄存器中的 LOCK 位置为 1 来锁定 FLASH_CR 寄存器。

具体步骤:

第五步:flash读取

具体步骤:

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32F429是意法半导体(STMicroelectronics)推出的一款高性能32位微控制器,它具有内部闪存存储器,用于程序代码的存储和执行。 STM32F429的内部闪存存储器可以被分为两个区域:系统存储器(SRAM)和闪存存储器(Flash)。 在进行内部闪存操作之前,需要确保Flash被正确地初始化。初始化过程包括对Flash存储器的解锁和擦除。 在对Flash进行操作之前,首先需要对其进行解锁。在解锁之前,无法对Flash进行读写操作。解锁的方法是使用FLASH解锁函数,例如:FLASH_Unlock()。 然后可以对Flash进行擦除操作。Flash擦除是指将存储空间恢复到初始状态的操作。擦除操作可以是整个Flash的擦除,也可以是指定地址范围的擦除。擦除的方法是使用FLASH擦除函数,例如:FLASH_Erase()。 完成解锁和擦除后,就可以对Flash进行写入操作了。写入操作是将数据写入Flash存储器中的特定地址处。写入的方法是使用FLASH编程函数,例如:FLASH_Program()。 在进行Flash操作时,需要注意的是,每个Flash单元都有一定的擦除和编程次数的限制。因此,在进行频繁的Flash操作时,应该尽量避免过度擦除和编程,以延长Flash的使用寿命。 总而言之,对STM32F429的内部Flash进行操作包括解锁、擦除和写入三个主要步骤。这些操作可通过使用相应的Flash操作函数来完成,以实现对程序代码的存储和执行。在进行Flash操作时,需要注意保护Flash的寿命以及合理使用Flash存储空间。 ### 回答2: STM32F429是意法半导体(STMicroelectronics)推出的一款32位微控制器,具有内置的Flash存储器。下面我将简要介绍STM32F429内部Flash的操作。 STM32F429的内部Flash存储器具有较大的存储容量,通常分为多个扇区(Sector),每个扇区的大小为16KB或128KB。用户可以按照需求选择适当的扇区进行存储。 在进行内部Flash操作之前,需要确保这些地址空间未被写保护。一旦Flash被写保护,将无法进行任何写操作。用户可以使用相关的寄存器来进行写保护设置。 在以编程方式操作STM32F429内部Flash时,需要按照特定的步骤进行。首先,需要擦除待写入数据的扇区。可以选择一次性擦除整个Flash存储器,也可以选择逐扇区擦除。擦除操作将会将扇区的数据全部擦除为0xFF。 接下来,可以将数据写入擦除后的Flash扇区。写操作是对指定地址的数据进行写入,可以是单个字节,也可以是多个字节。写操作通常需要在软件中进行错误检查,以确保数据写入的正确性。 在写入数据后,还可以对已写入的数据进行读取操作,以验证数据的正确性。读操作可以一次读取单个字节,也可以一次读取多个字节。读取操作通常需要在软件中进行错误检查。 值得注意的是,STM32F429的Flash存储器具有有限的擦写寿命。如果频繁地进行擦写操作,可能会导致Flash存储器的寿命缩短。因此,在进行内部Flash操作时要合理选择操作频率和扇区擦写次数。 总之,STM32F429的内部Flash存储器具有较大的存储容量,并通过特定的步骤实现擦除、写入和读取操作。合理地使用内部Flash存储器可以为嵌入式系统提供有效的存储支持。 ### 回答3: STM32F429是意法半导体(STMicroelectronics)推出的一款32位ARM Cortex-M4处理器的微控制器。它具有内置的Flash存储器,可以用于储存程序和数据STM32F429内部Flash存储器分为两部分:主存储区和系统存储区。主存储区的大小通常为2MB,而系统存储区的大小通常为16KB。用户可以将程序和数据存储在这两个区域中。 为了进行内部Flash操作,我们需要使用适当的编程工具和技术。这些工具包括STM32Cube程序包、STM32CubeProgrammer、ST-Link调试接口等。 用户可以使用STM32CubeMX图形化配置工具生成初始化代码,用于配置STM32F429内部Flash存储器的读、写和擦除操作。该工具可以帮助用户选择适当的时钟频率、存储器映射方案和读/写保护功能。 在编程时,我们可以使用标准库提供的函数来进行内部Flash操作。例如,将程序从外部存储器读取到内部Flash存储器的主存储区中,可以使用HAL库提供的函数"HAL_FLASH_Program()"。该函数将数据按字编程到内部Flash存储器的指定地址中。 除了编程操作外,还可以使用擦除操作来清除内部Flash存储器中的数据。HAL库提供了"HAL_FLASH_Erase()"函数来擦除指定地址的内部Flash存储器。 需要注意的是,内部Flash存储器的读/写操作是有限制的。在进行写操作之前,需要先将“写保护位”禁用。此外,还需要确保内部Flash存储器的电压供应在适当的范围内。 总之,STM32F429微控制器具有内置的Flash存储器,可以用于储存程序和数据。用户可以使用适当的工具和技术来进行内部Flash操作,包括编程和擦除操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值