0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

茶话MCU 来源:ST MCU 信息交流 2020-06-15 09:24 次阅读

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选项字以外的其它选项内容,通过它做选项字的修改编程。然后再次运行用户程序,可以发现各个选项字内容又会回归到用户预设的配置内容。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    454

    文章

    50475

    浏览量

    422053
  • STM32
    +关注

    关注

    2266

    文章

    10877

    浏览量

    354984

原文标题:STM32选项字编程示例及几点提醒

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    stm32f0的定时器如何单独开启关闭某通道?

    最近在学习stm32f0的定时器,想单独开启关闭某通道,还不是很清楚。望大家指点下。 打个比方: 在使用TIM3时,用了通道1和2,中断方式,在使用中有时需要关闭能道1而只用通道2,如何让通道1不工作?
    发表于 05-16 07:07

    STM32F0扩展TFT屏(1.8寸以上)时一般都用什么接口的?

    大家用STM32F0扩展TFT屏(1.8寸以上)时一般都用什么接口的?
    发表于 05-16 06:12

    STM32F0系列单片机,指针取整型值错误的原因?

    STM32F0系列单片机,指针取整型值错误,用F0的进来看下,代码如下,附件里也有个工程可以下来单步运行下,这是什么问题如何解决. uint8_t a
    发表于 05-15 07:46

    STM32F0标准库中缺失core_cm0.0是怎么回事?

    STM32F0xx_StdPeriph_Lib_V1.5.0LibrariesCMSISDeviceSTSTM32F0xxInclude目录下找到了core_cm0.h的头文件。 是STM32F0系列不需要core_cm
    发表于 05-15 06:39

    stm32f0系列的芯片怎么样?

    大家用没有 stm32f0系列的芯片呢,用的怎么样?
    发表于 05-10 06:59

    STM32F0外部中断容易误触发怎么解决?

    STM32F0的外部中断抗干扰能力太差了,经常误触发。旁边电烙铁开关按钮只要切换一次都会引起误触发,当然外部中断IO口有阻容RC滤波的,也照样误触发。真的怕了。大家有没有解决办法?
    发表于 05-06 06:33

    使用MDK调试STM32F0时会突然全速运行的原因?

    使用芯片STM32F030CCT6 系统:win7 MDK版本:5.21a 仿真器:秉火DAP 使用MDK调试STM32F0时会突然全速运行。
    发表于 04-23 07:42

    STM32F0设置了FALSH写保护后不能下载程序是什么原因导致的?

    开发环境用KEIL5+JLINK进行程序调试,STM32F0根据选项字节进行FALSH写保护后,下次不能再程序下载了,现已用STM32 ST-LINK Utility进行解除。能不能在KEIL或程序
    发表于 04-18 07:51

    使用STM32F0控制BLDC电机,需要在停机时对电机进行自锁,怎么实现

    如题,使用STM32F0控制BLDC电机,需要在停机时对电机进行自锁,不外加机械部件。施加其中一相一定电压时要保持电机卡住不动的状态,但手动转动电机超过一定角度时,还是保持不了原位。有什么办法比较好呢?
    发表于 04-16 08:12

    STM32F0 stop模式WFI和WFE区别是什么?

    同题:STM32F0 stop模式WFI和WFE区别?求大神指点,谢谢!
    发表于 04-16 06:39

    STM32F0的SPL库能在STM32G0上用吗?

    原来用的STM32F0系列,使用的V3.5.0的标准外设库。现在改用STM32G0系列,发现官网提供的固件库是STM32CubeG0,里面是HAL和LL库。为了节省开发时间,想还是用SPL库,有对应的SPL吗?
    发表于 04-08 08:29

    STM32F0系列TIM1内部刹车源,LOCKUP如何应用?

    STM32F0系列 TIM1 内部刹车源有5种,求大佬们解答下: 1、请问LOCKUP 如何应用?我制造错误进入hardfault后,并没有刹住。 2、F0全系列都有LOCKUP刹车源吗?其他几种
    发表于 04-03 07:21

    STM32F0内核的总中断是默认开的吗?

    STM32F0STM32F1, 用 CubeMx生成初始化代码,只有外设的中断使能代码,没有找到总中断的使能代码,请问内核的总中断默认是开
    发表于 04-03 06:14

    KEIL下如何实现代码的加密?

    STM32F0STM32F4,用了有好几款芯片,都是在KEIL编译,之前没有关注到加密的问题,突然想到这个问题,不知道大家都是怎么来实现加密的。
    发表于 03-20 07:06

    使用CUBEAI部署tflite模型到STM32F0中,模型创建失败怎么解决?

    看到CUBE_AI已经支持到STM32F0系列芯片,就想拿来入门嵌入式AI。 生成的模型很小,是可以部署到F0上的,但是一直无法创建成功。 查阅CUBE AI文档说在调用create函数前,要启用
    发表于 03-15 08:10