基于STM32F0芯片的代码实现及几点提醒

发布者:祝福的4号最新更新时间:2023-09-05 来源: elecfans关键字:存储区 手机看文章 扫描二维码
随时随地手机看文章

‍STM32系列的芯片里都有个特别的存储区---FLASH选项字区域,这里简单聊下该话题并顺便给出基于STM32F0芯片的代码实现及几点提醒。


这块特定的FLASH存储区域,通常用来存放有关芯片内部FLASH读保护、写保护、看门狗使能方式、芯片启动、RAM校验、电源监控等配置信息。具体内容以及格式因不同的STM32系列可能有差异。


一般来讲,各个选项字由选项字节组成,各选项字节由原始字节项和互补字节项组成。如下图存储方式,‍绿色栏为原始选项字节,黄色栏代码互补选项字节。不同系列可能有差异。【下文中截图如无特别说明,均是来自STM32F0芯片的参考手册。】

FLASH选项字一般安排在某固定地址起始的一块连续的地址空间。下图就是STM32FO芯片内部FLASH选项字的地址及内容结构安排。这里包括读保护选项字节、用户选项字节、扇区写保护选项字节。

对于出厂的芯片,FLASH选项字往往具有初始出厂值。下图就是STM32F0芯片出厂时FLASH选项字的初始值。

但在我们的实际应用中往往需要结合实际应用情况,对FLASH选项字进行重新配置。而对FLASH选项字进行重新配置一般有两种方式:

第一种,通过编程烧录工具进行选项字的配置并写入。

比方使用STLinkUtiliy或STM32CubeProgrammer或其它类似编程工具来实现。这种方式相对较为简单,一般对操作人员往往有些要求。尤其在有意或无意弄错配置选项的情况下,没法快速发现并及时纠正。

另外一种方式就是用户在应用代码里根据应用需求做FLASH选项字的配置编程。

这种方式,对开发人员来讲会增加了一些工作量。但烧录时只管烧录FLASH执行代码即可,关于芯片配置方面的信息在代码里自行完成。即使烧录时出现选项字的误操作,用户程序代码也可以将其自动纠正过来。

不论使用哪种方式修改FLASH选项字的配置,要想新的选项字信息真正起作用,还有个对FLASH选项字信息进行加载的环节,即将FLASH选项字的配置信息加载到选项字寄存器,从而作用于芯片的相关功能,也就是上面提到过的读保护、写保护、看门狗使能、电源控制、启动选择等功能信息。一般来说,将FLASH选项字信息加载到选择字寄存器需要借助系统复位或上电复位来完成。【当在调试状态下修改FLASH选项字时,它的加载需借助上电复位】

在进行FLASH选项字加载之前,芯片硬件会先对选项字信息进行基本地判断与确认,即将各个原始选项字节与互补选项字节的进行匹配比对。如果比对失败将产生出错事件,并将比对失败的选项字节【原始字节和互补字节】强制修改为0xFF或其它指定值,视不同的STM32系列而定。

比方,下面就是STM32L4系列做选项字加载前发生原始项与互补项信息比对不匹配时的处理原则:

关于FLASH选项字信息地编程修改,这里特别提醒几点:

第1点,当准备好要修改的选项字信息,在对FLASH选项字进行编程修改之前,需先对FLASH选项字区域进行擦除。发出擦除指令即可。擦除完毕之后再将新的选项字信息写入选项字区域。

那么为了保障选项字正确有序的编程写人,在做FLASH选项字的编程时,一定要保持电源的稳定。【比方说,代码里稍作延时等上电稳定后再操作】如果正在做FLASH选项字编程时发生电源电压剧烈波动或重启,很可能发生FLASH选项字区域被擦除了但又没有正确写入新的选项字信息的情况。而且,前面也提到了,如果选项字因为没有被完整地正确写入,在做FLASH选项字加载前,还会由于原始项与互补项做信息比对失败而被强行修改为OxFF或其它指定值。

下面两幅截图就是使用烧录工具软件【STM32CubeProgrammer】,在做flash选项字编程时通过模拟芯片被强行断电所发生的情形。

本来,开始做FLASH选项字编程时,RDP保护配置都是选择的LEVEL_0。在选项字编程时芯片被中途断电重新后连接所看到结果却是芯片被读保护了,其它配置字也被擦除了。从截图中可以看到,此时RDP=0xFF,既不是0xAA也不是0xCC,那么芯片的读保护等级就相应地变成了LEVEL_1读保护状态了。有人碰到此情形时往往感到纳闷不解,明明自己没有修改RDP的配置怎么RDP的保护等级变了呢?就是因为中途断电,选项字区域刚被擦除又还没来得及完整、正常写入。

当然,做FLASH选项字编程时除了要求电源稳定外,编程时序也需遵照手册介绍的来操作,以保证选项字编程的正确性。

第2点‍,对于某些双BANK的STM32芯片,比如STM32L4,STM32F42X等系列,在做选项字编程调整时,也是先将两个BANK的用户选项页的内容进行擦除,然后依据用户准备好的选项寄存器的内容对所有选项字内容重新编程更新。

这里要注意的是,我们不能只是单独地针对双BANK其中的某一个BANK进行用户选项字调整,而是需要将BANK1和BANK2的配置信息都准备好并写入相应的选项字寄存器,从而实现对两个BANK的选项字信息的编程修改。

第3点‍,在做选项字编程过程中,如果修改读保护选项时,一定要清楚-----如果是从LEVEL_1调整为LEVEL_0将会发生整个芯片内部的FLASH内容被全部擦除的情况。另外,很多STM32系列支持LEVEL_2读保护,该保护等级具有不可逆性。如果选择该等级,除非你自己在芯片内部准备好了升级引导代码,否则你是不能再对片内代码内容做任何更新,更不可能基于该芯片再做调试了。

好,关于STM32芯片的选项字的编程提醒就聊到这里。感觉上内容应该不多,但由于STM32家族拥有众多系列,同时各个系列间在选项字这部分内容又或多或少存在着差异,让内容突然庞杂了很多。这里只能抛砖引玉似地给些提醒,具体应用时请参考各个STM32系列的参考手册及编程手册。

下面就以STM32F072芯片为核心的Nucleo板,给出一个实现用户选项字编程的示例。

先看看STM32F072片内选项字区域的基本内容框架,如下图:

一、选项字内容的规划与准备:

这里我将RDP选项字节配置为0xbb,即LEVEL_1,则其互补选项字节内容就是0x44;将USER选项字节下面红色方框内的三个选项置1,另外两个保留位置1,那么USER选项字节的内容就是OxEA,它的互补字节就是0x15.

选项域中的Data0字节配置为0x99,则其互补字节nData0则为0x66;

选项域中的Data1字节配置为0x88,则其互补字节nData0则为0x77;

按照上面规划准备好数据,如下图所示。各选项数据按原项和互补项组成半字写入。

【顺便说下,这里没有对扇区写保护做配置。当然要做也是完全可以的】

二、编写相应程序代码,编译后下载到芯片:

相关代码不长,较为简单。按照手册描述的来编写。我将上述代码分成6部分。

第1部分,做有关选项字节内容的判断,是否均为预期的选项配置内容。

第2部分,对FLASH、OPTION编程做开锁操作。

第3部分,对选项域进行擦除,然后退出擦除状态。

第4部分,对欲修改的选项字节进行编程修改。

第5部分,完成选项字的修改与编程后,上锁并退出。

第6部分,触发系统复位,将新的选择域内容加载到选项控制寄存器。

三、运行程序,验证结果

运行用户程序实现选项域的编程修改操作。可连接到STLINK Utlity之类的工具查看选项配置结果,看看是否跟预期规划的一致。

上图是通过STLINK Utility工具查看到的STM32F072芯片运行用户程序后的选项域的结果。不难看出,跟我们预期的结果一样【打勾的选项表示置1的选项】。我们还可以基于STLINK_Utility工具随意修改RDP选项字以外的其它选项内容,通过它做选项字的修改编程。然后再次运行用户程序,可以发现各个选项字内容又会回归到用户预设的配置内容。

关键字:存储区 引用地址:基于STM32F0芯片的代码实现及几点提醒

上一篇:利用STM32F334的HRTIM实现PWM输出的实现原理
下一篇:STM32单片机是怎样执行中断函数中的应用的

推荐阅读最新更新时间:2024-11-08 15:40

单片机里EEPROM与flash有什么区别?
flash是用来存储代码的,在运行过程中不能改;EEPROM是用来保存用户数据,运行过程中可以改变,比如一个时钟的闹铃时间初始化设定为12:00,后来在运行中改为6:00,这是保存在EEPROM里,不怕掉电,就算重新上电也不需要重新调整到6:00
[单片机]
STM32 使用 Flash 存储数据时的一种管理办法
使用 stm32f3xx,需要存储一些掉电不丢失的校准信息,查阅手册得知:1、stm32 写 flash 的长度是固定的 16bit;2、擦除时必须整块(2Kbytes)擦除,给出某 flash 块内的地址,执行擦除命令就可以了;3、参考手册给出了最小擦写次数为 10K。 以上三点对于实际使用时的影响,首先,写数据必须以 16bit 为单位,很多 32bit 长度的值就不能直接使用类似 A = B 的赋值语句的方法去操作了,可以统一转化为指向 16bit 无符号整形值的指针来处理。举例,有一个 32bit 长度的 float 变量 v_float,要存入地址为 (FLASH_ADDRESS)的 flash中: #define
[单片机]
如何从片外flash启动
实现片外flash启动,需要在__main()函数之前初始化EMC,即静态EMC控制器的初始化。同时需要在引导程序完成之后,进入__main之前把主程序转移到RAM中运行。 对于复杂情况,如RO段被分成几部分并映射到存储空间的多个地方时,需要创建一个称为 分布装载描述文件 的文本文件,通知连接器把程序的某一部分连接在存储器的某个地址空间。需要指出的是,分布装载描述文件中的定义要按照系统重定向后的存储器分布情况进行。在引导程序完成初始化的任务后(此处注意:必须要等到引导程序运行完毕),应该把主程序(也就是中断向量表中的前64个字节,一般复制到SDRAM中,同时设置MEMMAP=0x02,lpc2478中也就是内存映射到SDRAM
[单片机]
msp430 内存Flash 读写
  1、msp430的存储结构采用冯。依曼结构,即RAM和Flash在同一个寻址空间内统一编址,没有代码空间和数据空间之分。   2、Flash是以段为为基本结构进行存储的。总体上分三部分:   Flash主存储区: 用于存储程序代码,被分成4个扇区,每个扇区分128seg, 每个seg段 大小为 64 * 1024 / 128 = 512B。 Flash控制器可以以位、字节、或者字的格式写入Flash控制器。但是控制器最小的擦除单位是段 。   BSL存储区: 是存储器的引导加载存储器,可以用于存储引导加载程序,分4段,每段512B,每段可以单独擦除、信息存储区: 主要用于存储需要掉电后永久保存的数据,分4段,每段128
[单片机]
msp430 内存<font color='red'>Flash</font> 读写
淡季影响销售,NAND Flash 供应商 Q1 将供过于求
    根据 TrendForce 旗下记忆体储存事业处 DRAMeXchange 最新报告显示,第四季 NAND Flash 市况虽依旧维持健康水准,但在三星电子、东芝与晟碟各自面临价格与产销端的压力影响营收、及第三季呈现微幅衰退的情况下,品牌供应商营收仅较第三季成长 2% 至 87.5 亿美元。DRAMeXchange 研究协理杨文得表示,因需求端面临淡季效应,2015 年第一季整体市况将转为供过于求,在价格滑落幅度转趋明显的情况下,业者将藉由加速先进制程的转进,改善成本架构,以减低价格跌幅的冲击。   NAND Flash 三星电子 三星电子第四季 NAND Flash 位元出货量较上季
[手机便携]
TQ2440 学习笔记—— 20、NAND Flash 控制器
一、NAND Flash控制器 1、地址空间 SRAM,DM9000 的地址总线接到了S3C2440的地址总线上;而NAND Flash 没有地址总线,与前者相比它的寻址方式是不同的。 故必须分清楚地址。 2、NAND 的编址 3、NAND 的命令 4、使用S3C2440 的NAND Flash 控制器 访问NAND Flash 从硬件上: 1、发出命令 CLE DATA BUS 2、Addr ALE DATA BUS 3、传输数据 S3C2440: 1、命令寄存器 NFCMMD 2、地址寄存器 NFADDR 3、数据寄存器 NFDATA 4、状态寄存器 NFSTAT 二
[单片机]
分页烧写Flash的多页程序并行自举方法
摘 要:以TMS320VC5410为例,介绍对Am29LV200B Flash存储器进行程序分页烧写以及上电后多页用户程序并行自举的方法。对多页Flash存储器的烧写,须在烧写过程中对已烧写的数据长度进行动态判断,当达到预定烧写长度后对Flash进行换页,然后继续烧写,重复上述换页过程,直到程序烧写完为止。对多页程序的并行自举,在系统上电后,利用TI提供的自举程序,将一个用户自己编写的前导程序载入DSP,利用该前导程序将多页程序载入DSP来实现程序的自举。此方法适用于多种FIash芯片和C5000系列DSP。 关键词:TMS320VC5410 Am29LV200B DSP 多页并行自举 TI公司的DSP芯片TMS320Vc5
[应用]
nand flash学习笔记一
Nand flash 原理图上有data0-data7 共8个引角 容量为256M*8bit ,所以地址位应该有28位,原理图上只有data0-data7,所以需要发出多次地址信号 1命令、地址、数据复用 2地址多次发出 Nand flash与内存不同,不能直接读写,要先发出命令,再发出地址,再读写数据 CLE 为高电平 data0-data7传输的是命令 ALE 为高电平 data0-data7传输的是地址 CLE和ALE两者都为低电平时,data0-data7传输的为数据 nWE=0,为低电平时,表示写 Nand flash 读取信息 查看K9F2G08U0A数据手册: Function 1st Cycle 2nd
[单片机]
nand <font color='red'>flash</font>学习笔记一
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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