FLASH,指Flash Memory,是一种非易失性存储器(闪存),掉电能正常保存数据。
STM32的存储器通常包含内部SRAM、内部FLASH,部分系列还包含EEPROM。其中FLASH通常用于存储代码或数据,可被读写访问。
STM32 FLASH 基础内容
STM32的FLASH组织结构,可能因不同系列、型号略有不同。比如大家熟悉的STM32F1中小容量一页大小只有1K,而F1大容量一页有2K。
还比如有些系列以扇区为最小单元,有的扇区最小16K,有的128K不等。
本文主要结合F4系列来描述关于FLASH的相关内容。
1.Flash 结构
通常Flash包含几大块,这里以F40x为例:
主存储器:用来存放用户代码或数据。
系统存储器:用来存放出厂程序,一般是启动程序代码。
OTP 区域:一小段一次性可编程区域,供用户存放特定的数据。
选项字节:存放与芯片资源或属性相关的配置信息。
2.Flash 常规操作
Flash 读、写(编程)、擦除:
128 位宽数据读取
字节、半字、字和双字数据写入
扇区擦除与全部擦除
(提示:不同系列可能存在差异,比如还有字节读取,页擦除等)
Flash 读、写保护:通过配置选项字节实现。
3.Flash 容量
STM32的Flash容量出厂已经决定,可根据型号得知容量大小。
4.存储器端格式
目前STM32存储器组织结构默认为小端格式:数据的低字节保存在内存的低地址。
更多内容请查阅芯片对应的参考手册。
FLASH 选项字节
STM32内部Flash具有读写保护功能,想要对Flash进行读写操作,首先要去除读写保护,读写保护通过配置选项字节完成。
配置选项字节,常见两种方式:1.软件编码;2.编程工具;
1.软件编码
比如STM32F4系列标准外设库库提供函数:
void FLASH_OB_Unlock(void); void FLASH_OB_Lock(void); void FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState); void FLASH_OB_WRP1Config(uint32_t OB_WRP, FunctionalState NewState); void FLASH_OB_PCROPSelectionConfig(uint8_t OB_PcROP); void FLASH_OB_PCROPConfig(uint32_t OB_PCROP, FunctionalState NewState); void FLASH_OB_PCROP1Config(uint32_t OB_PCROP, 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); void FLASH_OB_BootConfig(uint8_t OB_BOOT); FLASH_Status FLASH_OB_Launch(void); uint8_t FLASH_OB_GetUser(void); uint16_t FLASH_OB_GetWRP(void); uint16_t FLASH_OB_GetWRP1(void); uint16_t FLASH_OB_GetPCROP(void); uint16_t FLASH_OB_GetPCROP1(void); FlagStatus FLASH_OB_GetRDP(void); uint8_t FLASH_OB_GetBOR(void);
软件编码通过调用这些函数接口就可以配置选项字节。
2.编程工具
比如STM32CubeProg编程工具:
配置STM32选项字节,还可通过ST-LINK Utility、STVP等类似工具进行配置。
提示:不同型号的STM32选项字节可能略有差异。
FLASH 读写擦除操作
STM32内部Flash和其他外部Flash类似,支持读、写、擦除等常规操作。对内部Flash操作之前通常需要解锁、去保护等操作。
比如:
FLASH_OB_Lock(); FLASH_OB_WRPConfig(OB_WRP_Sector_All, ENABLE); FLASH_OB_PCROPConfig(OB_PCROP_Sector_All, ENABLE);
1.读数据
读取内部Flash数据通常有两种方式:
通过程序(编码)读取
通过外部(编程)工具读取
程序(编码)读取:
uint32_t uwData32 = 0; uint32_t uwAddress = 0x08001000; uwData32 = *(__IO uint32_t*)uwAddress;
外部编程工具读取:读取前提:没有读保护,设置好读取地址,长度、数据宽度等。
2.写数据
往STM32内部Flash写数据和读数据类似,但写数据地址不能有数据,也就是写之前要擦除数据。
所以,相对读数据,通常写之前需要一些额外操作,比如:
FLASH_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);
通过工具写数据,就是我们量产时说的下载数据,正式一点说法叫编程。
3.擦除数据
擦除数据通常分擦除页、扇区、整块,擦除时间也因型号不同、速度不同有差异。
提示:该部分内容建议参考官方提供的Demo(标准外设库和HAL都有基本例程)
FLASH 常见问题
STM32内部Flash主要用途是存储程序代码和数据。操作内部Flash要慎重,一旦操作不当就有可能会破坏整个程序。
问题一:编程(写数据)地址非对齐
写数据时,我们要指定写入的地址,如果写入地址为非对齐,则会出现编程对齐错误。
比如:
遵循32位(4字节)地址对齐,你的地址只能是4的倍数。0x08001000正确,0x08001001错误。
提示:不同型号对齐宽度可能不同,有的32位、有的128位等。
解决办法:通过“取余”判断地址。
问题二:编程地址数据未擦除
写数据之前需要擦除对应地址数据才能正常写入,否则会出现失败。
我们擦除数据通常是页,或扇区,写入某个地址数据,就可能影响其他地址的数据,如果直接覆盖就会出现问题。
解决办法:通常的做法是读出整页(或扇区)数据并缓存,再擦除整页,再写入。
问题三:擦除时读取数据
STM32内部Flash在进行写或擦除操作时,总线处于阻塞状态,此时读取Flash数据就会出现失败。【双BANK模式除外】
解决办法:通过标志判断写/擦除操作是否完成。
问题四:电压不稳定写入失败
处于外界干扰较大的环境,供电就有暂降的可能,而对STM32内部Flash进行操作时,如果低于特定电压就会出现编程失败。
操作Flash的最低电压既与工作频率有关,也与STM32型号有关(具体需要看数据手册)。
解决办法:通过完善硬件电路保证电压稳定。电源电压不够或不稳导致隐患往往不易觉察!!
上一篇:STM32信息安全—密码学基本原理(上)
下一篇:STM32学习笔记—通信容易出错的情况
推荐阅读最新更新时间:2024-11-10 20:27
设计资源 培训 开发板 精华推荐
- STEVAL-IHM025V1,具有 IGBT SLLIMM STGIPL14K60 1kW 三相电机控制的演示板
- BD-SL-i.MX6、i.MX6x SABRE Lite 开发平台具有强大的 i.MX 6Quad 应用处理器
- RT7236GCP-同步整流降压方案模块
- SG117 1.5A 三端可调稳压器的典型应用,用于 2816 EEPROM 电源编程器,用于读/写控制
- Air101开发板
- ESP32 S3 12K入门刷屏小摆件 NT5510
- 触摸传感器“棒棒糖”
- MC34071DR2G 单位增益缓冲器 TTL 驱动器的典型应用
- DC782A-S,LTC2255IUH 演示板,高速 ADC,VDD = +3.0V,125 Msps,14 位 10MHz <艾因< 170MHz
- 使用 PAM8124 15W D 类音频功率放大器进行桥接负载 (BTL) 配置的典型应用电路
- 【双11特别推荐】新产品,新方案,#TI“芯”世界#之电机驱动器
- 【已结束】力源直播【安森美 25KW 充电桩模块方案】(9:30入场)
- 有奖直播|大唐恩智浦半导体 | 电池管理芯片方案设计和注意事项
- 红外战高温,下载预测性维护手册,预约热像仪、测温仪有好礼!
- 开发板芯币竞拍,每日一款!今日竞拍开发板:Banana PI D1
- Mentor线上研讨会 | 教你在设计工具中进行DFM分析,轻松兼顾效率、成本和质量
- 【有奖直播】 聚焦语音识别核心技术,走进Microchip Timberwolf™音频处理器研讨会
- 激情六月!手把手教你用WEBENCH
- 有奖直播:英飞凌工业半导体在电机驱动行业中的应用 2020年4月21日 上午10:00-11:30 准时开启!