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 常见问题:编程地址非对齐、数据未擦除、擦除同时读取数据、电压不稳定写入失败。
原文标题:stm32学习笔记 | 片内flash读写失败问题分析
文章出处:【微信公众号:strongerhuang】欢迎添加关注!文章转载请注明出处。
芯片短缺问题再次引发业界广泛关注
Counterpoint:预计2024年移远、日海和广和通将占蜂窝物联网模块出货量的45%
美国得州电网崩溃的解决方案
一文读懂图像识别,真的前景不可限量?
苹果iPad即将大规模量产_或将推出Apple News订阅服务
结合F4系列描述关于FLASH的相关内容
汽车大灯内出现雾水怎么办?
全球LED照明灯具十大认证标准
HD哈默纳科谐波减速机轻量组合型在工业机器人中的应用
紫光展锐的发展成果介绍
小米扫地机器人拆解图及数据详细
LG在印度发布全新W系列手机 均内建4000mAh电池运行安卓9.0系统
通过单个PMIC为您的计算密集型应用处理器供电
水质检测器电路
在Java中如何使用API来完成邮件的接收与发送
视频结构化怎样实现突破
芯动科技风华系列芯片填补国内高性能数据中心显卡空白
张量类Tensor的实现
半入耳式蓝牙耳机推荐,半入耳蓝牙耳机推荐高性价比
Qualcomm推出面向Windows 10 PC的骁龙850移动计算平台