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

发布者:数据梦想最新更新时间:2023-02-15 来源: zhihu关键字:STM32  片内FLASH 手机看文章 扫描二维码
随时随地手机看文章

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  片内FLASH 引用地址:STM32学习笔记—片内FLASH读写失败问题分析

上一篇:STM32信息安全—密码学基本原理(上)
下一篇:STM32学习笔记—通信容易出错的情况

推荐阅读最新更新时间:2024-11-10 20:27

STM32 时钟RCC相关配置参考stm32f10x_rcc.h
1. 时钟使能配置: RCC_LSEConfig()、RCC_HSEConfig()、 RCC_HSICmd()、RCC_LSICmd()、RCC_PLLCmd()...... 2. 时钟源相关配置: RCC_PLLConfig()、RCC_SYSCLKConfig()、 RCC_RTCCLKConf()..... 3. 分频系数选择配置: RCC_HCLKConfig()、RCC_PCLK1Config()、RCC_PCLK2Config()...... 4. 外设时钟使能: RCC_APB1PeriphClockCmd(); // APB1线上外设时钟使能 RCC_APB2PeriphC
[单片机]
<font color='red'>STM32</font> 时钟RCC相关配置参考stm32f10x_rcc.h
嵌入式技术的智能闭环反馈增氧系统
摘要: 传统经验养殖法的增氧存在人力物力严重浪费和养殖风险高的问题。本文以嵌入式技术为基础,拟开发一种将传感器、自动化、无线通信和单片机等技术融为一体的嵌入式智能闭环反馈增氧系统。 本系统以机智云物联网平台为云端数据服务器,以STM32微处理器为控制节点,采用WiFi无线传输实时将溶解氧、pH、温度值、设备状态传输给机智云服务器,用户可通过手机远程查看水质参数及设备运行状态,微处理器通过PID算法进行智能反馈来调节溶解氧值,代替人工检测水质及控制增氧机,实现鱼塘的智能闭环反馈增氧。该系统不仅减少了人力物力成本,还有效降低了养殖风险。 随着水产养殖业的不断发展,我国养殖产量持续且稳步增长。目前,虽然我国水产品产量稳居世界前列
[单片机]
嵌入式技术的智能闭环反馈增氧系统
STM32单线串口对总线舵机的控制
1 总线舵机的介绍 总线伺服舵机即串行总线智能舵机,实际上可以理解为 数字舵机 的衍生品,数字舵机与模拟 舵机 相比而言是控制系统设计上的颠覆,而总线伺服舵机对于舵机而言则是在功能和运用上的颠覆。舵机的运用方式实际上只能发挥出总线伺服舵机非常小的一部分功能。这款TS-315是通过单线的串口通信对旋转进行控制的,控制字符串协议如下: 字符串协议: #1P1500T100 控制舵机旋转,无返回 (1P是ID为1的舵机,中间的1500是参数,范围是500-2500,控制舵机范围,后面的参数100,表示舵机旋转的时间参数,也就是速度,意思是舵机从当前角度达到命令中的1500的位置,所需要的时间为100ms,时间的范围是1-50000
[单片机]
<font color='red'>STM32</font>单线串口对总线舵机的控制
牛人对STM32的NVIC_PriorityGroupConfig使用及优先级分组方式理解
STM32有43个channel的settable的中断源;AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4 bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下 /* Preemption Priority Group -------------------------------------------------*/ #define NVIC_PriorityGroup_0 ((u32)0x700) /* 0 bits for pre-emption priority
[单片机]
STM32入门开发: NEC红外线协议解码(超低成本无线传输方案)
一、环境介绍 MCU: STM32F103ZET6 编程软件环境: keil5 红外线传输协议: NEC协议---38KHZ载波:。NEC协议是红外遥控协议中常见的一种。 解码思路: 外部中断 + 定时器方式 代码风格: 模块化编程,寄存器直接操作方式 完整keil工程源码下载(解压即可编译运行测试): https://download.csdn.net/download/xiaolong1126626497/19863275 二、NEC协议与解码思路介绍 2.1 采用的相关硬件 图1: 这是NEC协议的红外线遥控器: 如果自己手机没有红外线遥控器的功能,可以淘宝上买一个小遥控器来学习测试,成本不高
[单片机]
<font color='red'>STM32</font>入门开发: NEC红外线协议解码(超低成本无线传输方案)
STM32再学习——集成开发环境IDE
嵌入式系统是一个软件和硬件相结合的计算机系统。软件代码经编写、编译、汇编、链接,生成可执行文件,然后将可执行文件加载到嵌入式系统的ROM或flash中,通过嵌入式系统的MCU来控制、检测外部的装置。 软件的编辑需要文本编辑器,编译需要编译器,汇编需要汇编器,链接需要编译器,可执行文件需要软件工具来加载文件,同时软件还需要一些函数库,中间件等。为了使开发更便捷,简单,几乎所有的MCU芯片都会有对应的集成开发环境(IDE),该环境囊括了软件开发从编辑到可执行文件的所有工具,同时还包括常用的库,调试工具,在线调试工具链等。 STM32主流的集成开发环境有两种:IAR和MDK。我在这里不想讨论哪一种IDE好,谈论这个没有意义,就像你认为版
[单片机]
<font color='red'>STM32</font>再学习——集成开发环境IDE
FlyMcu串口ISP下载STM32程序教程
开始写之前也是不能用的,但是为了使用,决定边探索怎么使用边写一篇博客! 最开始用过正点原子的开发板进行ISP下载,感觉挺好用,按照说明就好。 但是正点原子的板子用的是如下的一块电路: 这个电路很简单使用,但是如果你不懂,也很纠结,这里感觉有篇帖子写的很详细,可供大家参考,就不自己解释了,链接如下: http://www.51hei.com/bbs/dpj-35947-1.html 但是,很多人会想用一个USB转串口的小模块下载程序,怎么弄呢? 首先有一个小串口模块,注意转换为的电平是3.3V,不是标准的232电平那种的,东西如下 之后呢,将RXD,TXD,GND,VCC缺一不可的连接到你的STM32板子
[单片机]
FlyMcu串口ISP下载<font color='red'>STM32</font>程序教程
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved