STM32学习笔记 | 片内FLASH读写失败问题分析

2023-10-07 08:20

本文主要是介绍STM32学习笔记 | 片内FLASH读写失败问题分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关注+星标公众,不错过精彩内容

FLASH,指Flash Memory,是一种非易失性存储器(闪存),掉电能正常保存数据。

STM32的存储器通常包含内部SRAM、内部FLASH,部分系列还包含EEPROM。其中FLASH通常用于存储代码或数据,可被读写访问。

嵌入式专栏

1

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存储器组织结构默认为小端格式:数据的低字节保存在内存的低地址。

更多内容请查阅芯片对应的参考手册。

嵌入式专栏

2

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选项字节可能略有差异。

嵌入式专栏

3

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都有基本例程)

嵌入式专栏

4

FLASH 常见问题

STM32内部Flash主要用途是存储程序代码和数据。操作内部Flash要慎重,一旦操作不当就有可能会破坏整个程序。

问题一:编程(写数据)地址非对齐

写数据时,我们要指定写入的地址,如果写入地址为非对齐,则会出现编程对齐错误。

比如:

遵循32位(4字节)地址对齐,你的地址只能是4的倍数。0x08001000正确,0x08001001错误。

提示:不同型号对齐宽度可能不同,有的32位、有的128位等。

解决办法:通过“取余”判断地址。

问题二:编程地址数据未擦除

写数据之前需要擦除对应地址数据才能正常写入,否则会出现失败。

我们擦除数据通常是页,或扇区,写入某个地址数据,就可能影响其他地址的数据,如果直接覆盖就会出现问题。

解决办法:通常的做法是读出整页(或扇区)数据并缓存,再擦除整页,再写入。

问题三:擦除时读取数据

STM32内部Flash在进行写或擦除操作时,总线处于阻塞状态,此时读取Flash数据就会出现失败。【双BANK模式除外】

解决办法:通过标志判断写/擦除操作是否完成。

问题四:电压不稳定写入失败

处于外界干扰较大的环境,供电就有暂降的可能,而对STM32内部Flash进行操作时,如果低于特定电压就会出现编程失败。

操作Flash的最低电压既与工作频率有关,也与STM32型号有关(具体需要看数据手册)。

解决办法:通过完善硬件电路保证电压稳定。电源电压不够或不稳导致隐患往往不易觉察!!

复盘一下

▼FLASH 基础内容:结构、常规操作、容量、大小端格式;

▼FLASH 选项字节:通过软件编码和编程工具配置;

▼FLASH 读写擦除操作:常规程序读写操作、工具的读写操作;

▼FLASH 常见问题:编程地址非对齐、数据未擦除、擦除同时读取数据、电压不稳定写入失败。

------------ END ------------

后台回复『STM32』『STM32学习笔记』相关文章。

欢迎关注我的公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

欢迎关注我的视频号:

点击“阅读原文”查看更多分享。

这篇关于STM32学习笔记 | 片内FLASH读写失败问题分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/157168

相关文章

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

MySQ中出现幻读问题的解决过程

《MySQ中出现幻读问题的解决过程》文章解析MySQLInnoDB通过MVCC与间隙锁机制在可重复读隔离级别下解决幻读,确保事务一致性,同时指出性能影响及乐观锁等替代方案,帮助开发者优化数据库应用... 目录一、幻读的准确定义与核心特征幻读 vs 不可重复读二、mysql隔离级别深度解析各隔离级别的实现差异

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基