0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅析STM32F207内部Flash编程

GReq_mcu168 来源:CSDN技术社区 作者: Firefly_cjd 2021-04-07 14:14 次阅读

本文将根据ST官方Flashprogramming manual,文档编号:PM0059,讲解STM32F207内部Flash编程

b0e3104e-9404-11eb-8b86-12bb97331649.png

01概述

这里的flash是指STM32F207内部集成的Flash

Flash存储器有以下特点

最大1M字节的能力

128位,也就是16字节宽度的数据读取

字节,半字,字和双字写入

扇区擦除和批量擦除

存储器的构成

主要存储区块包含4个16K字节扇区,1个64K字节扇区和7个128K字节扇区。

系统存储器是用于在系统boot模式启动设备的。这一块是预留给ST的。包括bootloader程序,boot程序用于通过以下接口对Flash进行编程。USART1、USART3、CAN2、USB OTG FS设备模式(DFU:设备固件升级)。boot程序由ST制造期间编写,用于保护防止错误写入和擦除操作。

512OTP(一次性编程)字节用于用户数据。OTP区域包含16个附加的字节,用于锁定响应的OTP数据。

选项字节,读写保护,BOR水平,软件/硬件看门狗和复位当设置处于待机和停机状态。

低功耗模式(参考参考手册的PWR部分)

b0f006f0-9404-11eb-8b86-12bb97331649.png

对比参考手册的boot部分

b122e638-9404-11eb-8b86-12bb97331649.png

当BOOT0为0是运行主存储区

当BOOT0为1,BOOT1为0时运行系统存储区

系统存储区运行的是ST出厂的bootloader代码,跳过过了用户的代码。如果在应用层代码锁定了JTAG管脚(将JTAG管脚用于普通GPIO),我们可以通过修改boot管脚状态,进入系统存储中,再进行debug。

02Flash操作

2.1、读取

内置的Flash是处于CortexM3的数据总线上的,所以可以在通用地址空间之间寻址,任何32位数据的读操作都能访问Flash上的数据。

data32 = *(__IO uint32_t*)Address;

将Address强制转化为32位整型指针,然后取该指针所指向的地址的值,就得到了Address地址上的32位数据。

2.2、擦除

Flash 擦除操作可针对扇区或整个Flash(批量擦除)执行。执行批量擦除时,不会影响OTP扇区或配置扇区。

扇区擦除步骤

1、检查FLASH_SR 寄存器中的BSY 位,以确认当前未执行任何Flash 操作

2、在FLASH_CR 寄存器中将SER 位置1 并选择要擦除的扇区(SNB)(主存储器块中的12个扇区之一)

3、将FLASH_CR 寄存器中的STRT 位置1

4、等待BSY 位清零

批量擦除步骤

1、检查FLASH_SR 寄存器中的BSY 位,以确认当前未执行任何Flash 操作

2、将FLASH_CR 寄存器中的MER 位置1

3、将FLASH_CR 寄存器中的STRT 位置1

4、等待BSY 位清零

ST提供相应的库函数接口

FLASH_Status FLASH_EraseSector(uint32_t FLASH_Sector, uint8_tVoltageRange)FLASH_Status FLASH_EraseAllSectors(uint8_tVoltageRange)

注意到,有个特殊的参数VoltageRange,这是因为

b13ea486-9404-11eb-8b86-12bb97331649.png

这里就不再翻译了,就是在不同电压下数据访问的位数不同,我们是3.3V,所以是32位数据,这也就是在读数据是为什么要读取32位的原因。

2.3、写入

写入之前必须擦除,这里和NorFlash操作是相同的

复位后,Flash控制器寄存器(FLASH_CR)不允许写入的,去保护Flash闪存因为电气原因出现的以外操作,以下是解锁的步骤

1、在Flash 密钥寄存器(FLASH_KEYR) 中写入KEY1 = 0x45670123

2、在Flash 密钥寄存器(FLASH_KEYR) 中写入KEY2 = 0xCDEF89AB

将FLASH_CR 寄存器中的LOCK 位置为1 后,可通过软件再次锁定FLASH_CR 寄存器

ST提供了库函数

FLASH_Unlock();//解锁FLASH_Lock();//重新上锁

备注:

当FLASH_SR 寄存器中的BSY 位置为1 后,将不能在写模式下访问FLASH_CR 寄存器。BSY 位置为1 后,对该寄存器的任何写操作尝试都会导致AHB 总线阻塞,直到BSY位清零

这要求我们在写入前必须判断下FLASH_SR寄存器中的BSY位。

ST提供了对用的库函数

FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR| FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);

写入步骤

1、检查FLASH_SR 中的BSY 位,以确认当前未执行任何主要Flash 操作

2、将FLASH_CR 寄存器中的PG 位置1。

3、通过不同的位宽对指定地址写入

4、等待BSY 位清零

对于写入接口,ST提供相应的库函数,提供了8位,16位,32位的操作,因为我们是3.3V电压,所以使用32位写入接口

FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data)

2.4、中断

如果对于写入要求较高,可以使能中断,对于写入完成,写入错误都会有响应的中断响应。我也没有详细研究,参看Flash编程手册的15.5章节

03Flash保护

3.1概述

Flash具有读写保护机制,主要是用过选项地址实现的。还有一次性编程保护

b166aba2-9404-11eb-8b86-12bb97331649.png

这讲述了选项字节的构成

b19a8c42-9404-11eb-8b86-12bb97331649.png

用户修改选项字节

To run any operation on this sector, the option lock bit (OPTLOCK) inthe Flash option control register (FLASH_OPTCR) must be cleared. Tobe allowed to clear this bit, you have to perform the followingsequence:

1. Write OPTKEY1 = 0x0819 2A3B in the Flash option key register(FLASH_OPTKEYR)

2. Write OPTKEY2 = 0x4C5D 6E7F in the Flash option key register(FLASH_OPTKEYR)

The user option bytes can be protected against unwanted erase/programoperations by setting the OPTLOCK bit by software.

这个上面讲述的解锁Flash相同,就是要写入不能的数值

ST提供相应的库函数

void FLASH_OB_Unlock(void)void FLASH_OB_Lock(void)

修改用户字节的步骤

1、检查FLASH_SR 寄存器中的BSY 位,以确认当前未执行任何Flash 操作

2、在FLASH_OPTCR 寄存器中写入所需的选项值

3、将FLASH_OPTCR 寄存器中的选项启动位(OPTSTRT) 置1

4、等待BSY 位清零

3.2 读保护

从上面概述中得知,Flash读保护共分三个等级

1等级0:没有保护

将0xAA 写入读保护选项字节(RDP) 时,读保护级别即设为0。此时,在所有自举配置(Flash用户自举、调试或从RAM 自举)中,均可执行与Flash 或备份SRAM 相关的所有读/写操作(如果未设置写保护)。

2等级1:闪存读保护

这是擦除选项字节后的默认读保护级别。将任意值(分别用于设置级别0 和级别2 的0xAA和0xCC 除外)写入RDP 选项字节时,即激活读保护级别1。设置读保护级别1 后:

-在连接调试功能或从RAM 进行自举时,将不执行任何Flash 访问(读取、擦除和编程)。Flash 读请求将导致总线错误。而在使用Flash 用户自举功能或在系统存储器自举模式下操作时,则可执行所有操作

-激活级别1 后,如果将保护选项字节(RDP) 编程为级别0,则将对Flash 和备份SRAM执行批量擦除。因此,在取消读保护之前,用户代码区域会清零。批量擦除操作仅擦除用户代码区域。包括写保护在内的其它选项字节将保持与批量擦除操作前相同。OTP 区域不受批量擦除操作的影响,同样保持不变。

只有在已激活级别1 并请求级别0 时,才会执行批量擦除。当提高保护级别(0-》1,1-》2, 0-》2) 时,不会执行批量擦除。

3等级2:禁止调试/芯片读保护

注意:

在注意中写道,如果使能了等级2的读保护,永久禁止JTAG端口(相当于JTAG熔丝)ST也无法进行分析,说白了就是没办法再debug了,目前我没有使用到这个水平的读保护

读保护库函数

void FLASH_OB_RDPConfig(uint8_t OB_RDP)

查询读保护状态库函数

FlagStatus FLASH_OB_GetRDP(void)

3.3 写保护

Flash 中的用户扇区(0到11)具备写保护功能,可防止因程序计数器(PC) 跑飞而发生意外的写操作。当扇区i 中的非写保护位(nWRPi, 0 ≤ i ≤ 11) 为低电平时,无法对扇区i 执行擦除或编程操作。因此,如果某个扇区处于写保护状态,则无法执行批量擦除。如果尝试对Flash 中处于写保护状态的区域执行擦除/编程操作(由写保护位保护的扇区、锁定的OTP 区域或永远不能执行写操作的Flash 区域,例如ICP),则FLASH_SR 寄存器中的写保护错误标志位(WRPERR) 将置1。

写保护库函数

void FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState)

查询写保护状态库函数

uint16_t FLASH_OB_GetWRP(void)

04一次性可编程字节

没有使用过,使用了芯片就废了吧,没有做过这个等级等保护,可以参看Flash编程手册的2.7章节

05代码

关于读写保护代码如何调用的问题,在stm32f2xx_flash.c文件中有调用说明。

/** @defgroup FLASH_Group3 Option Bytes Programming functions * @brief Option Bytes Programming functions *@verbatim =============================================================================== Option Bytes Programming functions =============================================================================== This group includes the following functions: - void FLASH_OB_Unlock(void) - void FLASH_OB_Lock(void) - void FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState) - void FLASH_OB_RDPConfig(uint8_t OB_RDP) - void FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY) - void FLASH_OB_BORConfig(uint8_t OB_BOR) - FLASH_Status FLASH_ProgramOTP(uint32_t Address, uint32_t Data) - FLASH_Status FLASH_OB_Launch(void) - uint32_t FLASH_OB_GetUser(void) - uint8_t FLASH_OB_GetWRP(void) - uint8_t FLASH_OB_GetRDP(void) - uint8_t FLASH_OB_GetBOR(void) Any operation of erase or program should follow these steps: 1. Call the FLASH_OB_Unlock() function to enable the FLASH option control register access

2. Call one or several functions to program the desired Option Bytes: - void FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState) =》 to Enable/Disable the desired sector write protection - void FLASH_OB_RDPConfig(uint8_t OB_RDP) =》 to set the desired read Protection Level - void FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY) =》 to configure the user Option Bytes. - void FLASH_OB_BORConfig(uint8_t OB_BOR) =》 to set the BOR Level

3. Once all needed Option Bytes to be programmed are correctly written, call the FLASH_OB_Launch() function to launch the Option Bytes programming process. @note When changing the IWDG mode from HW to SW or from SW to HW, a system reset is needed to make the change effective.

4. Call the FLASH_OB_Lock() function to disable the FLASH option control register access (recommended to protect the Option Bytes against possible unwanted operations) @endverbatim * @{ */
编辑:lyn

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FlaSh
    +关注

    关注

    10

    文章

    1634

    浏览量

    147994
  • 存储器
    +关注

    关注

    38

    文章

    7488

    浏览量

    163810
  • STM32
    +关注

    关注

    2270

    文章

    10899

    浏览量

    355886

原文标题:STM32 Flash详解

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何将stm32f207的以太网库中lwip1.3.2升级到1.4.1?

    如何将stm32f207的以太网库中lwip1.3.2升级到1.4.1
    发表于 05-17 08:04

    把外围电路电源都关闭了,只给stm32f207供电遇到的电流问题求解

    我把外围电路电源都关闭了,只给 stm32f207供电。 进入STOP模式后电流还有6.5mA。 但是禁用外围时钟后返而电流变大了8.6mA了! RCC_AHB1PeriphClockCmd
    发表于 05-17 07:08

    请问STM32F207STM32F407,100pin的能同时使用以太网和FSMC吗?

    RT, 请问大家,我想选择100pin的207或者407的MCU,想同时以太网和驱动RA8875,最好再支持NORFALSH,不知道STM32上有没有什么限制。
    发表于 05-15 07:49

    请问STM32F207的MCO是否比STM32F107差?

    我用STM32F107做一个带以太网通讯功能的产品,超频到100MHz左右,一切工作正常。于是换成STM32F207,我拿了两个STM32F207样品,一个没问题,另一个MCO输出的50MHz不准,导致以太PHY(LAN8720
    发表于 05-14 08:05

    STM32F207网络接收数据,为什么看不到接收的数据?

    我手里有STM32F207的开发板,正在试验TCP ECHO SERVER. static err_t tcp_echoserver_recv(void *arg, struct tcp_pcb
    发表于 05-13 06:23

    STM32F207利用DMA功能能实现串口1与串口6之间双向通信吗?

    请问一下大家,STM32F207利用DMA功能能实现串口1与串口6之间双向通信么?建立通信桥梁不需要CPU参与。
    发表于 04-29 08:53

    关于STM32F207VF外设USB接口遇到的问题求解

    ,PA11,PA10 上吗? (2)STM32F207VF IC 如果作为USB device 使用,必须要接外部晶振吗?如果没有外部晶振知识通过设置内部时钟可以吗?
    发表于 04-29 07:29

    STM32F103VCT6 J-LINK V8选用Secure ship加密时,芯片无法运行怎么解决?

    ;project settings->production->Secure ship时,设备能正常运行,反正则不能运行。 该加密方式在之前的项目STM32F207上面执行
    发表于 04-26 07:42

    STM32L475VE内部Flash编程出现ECCD错误的原因?

    使用的芯片型号 STM32L475VE,使用 HAL 库 `HAL_FLASH_Program` API 对 内部 Flash 进行编程,出
    发表于 04-26 07:21

    STM32F207 CubeMx FreeRtos Lwip无法建立多个端口怎么解决?

    刚刚转入Freertos阵营,就遇到了问题,卡住了,在此悬赏200-500大洋求助。 项目信息: CPU:STM32F207VC PHY:KSZ8041NL 协议栈:LWIP OS:Freertos
    发表于 04-23 07:40

    stm32f207片内flash的前114个字节莫名其妙的变成了0x00的原因?

    stm32f207片内flash的前114个字节莫名其妙的变成了0x00,这是什么问题??会有哪些原因呢?没有对0x8000000 开始的地址操作,因为这段地址是放应用程序的。
    发表于 04-22 07:00

    请问STM32F207不支持作为TFTP客户端吗?

    STM32F207不支持作为TFTP客户端吗
    发表于 04-16 07:29

    STM32F207死机PC跑飞的原因?怎么解决?

    STM32F207ZET6,使用过程发现有死机跑飞,分析了一下过程,是在正常刷屏的过程中触发了一次ADC的DMA完成中断,中断中执行了一些保存数据到对应结构体的任务,然后中断返回的时候,pc指针跑飞,进了HardFault中断,就死机了。是否有大佬有兴趣协助排查分析,可以带费用沟通
    发表于 03-19 07:04

    stm32f207为什么无法同时接上两个不同串口的数据?

    stm32f207ve芯片,使用rtthread操作系统,同时使用uart2、uart4、uart5同时发送数据,下一级设备接收到数据后立马回复数据,三条数据几乎同时接收,大概率会丢失数据,往往只能
    发表于 03-12 07:29

    stm32f103 flash模拟eeprom

    STM32F103的Flash存储器可以模拟EEPROM的功能,在本文中我们将详细介绍如何使用STM32F103的Flash存储器来实现EEPROM。 概述 EEPROM(Elect
    的头像 发表于 01-09 11:21 2032次阅读