datasheet

STM8 选项字节的写入

2017-11-14来源: eefocus 关键字:STM8  选项字节

STM8的EEPROM在复位后,要想要写入数据,必须先解锁,必然无法写入数据。解锁就是向  FLASH_DUKR 中先后写入:

第一个硬件秘钥:0xAE

第二个硬件秘钥:0x56

两个字节的数据。

此时 FLASH_IAPSR 中的 DUL 位将会变为1,表示 EEPROM 已经成功解锁,可以进行写入操作了。如果发现 DUL 位不为 1 ,是可以按顺序重复写入秘钥的,直到 DUL 位为 1 为止。

但手册上是这么说的:

中文手册:

2.  如果密钥输入错误,应用程序可以尝试重新输入这两个MASS密钥来对DATA区域进行解
锁。

4.  如果密钥输入错误,DATA EEPROM区域在下一次系统复位之前将一直保持写保护状态。

在下一次复位前,再向该寄存器进行的任何写操作都会被系统忽略掉。

英文手册:

2.  If the key available on the data bus is incorrect, the FLASH_PUKR register remains 
locked until the next reset. Any new write commands sent to this address are 
discarded. 

4.  If the key available on the data bus is incorrect, the data EEPROM area remains write 
protected until the next reset. Any new write command sent to this address is ignored.


这些说明,给人的感觉是:如果第一个秘钥输入错误,那么可以重复输入,直到解锁,但如果第一个秘钥输入正确,而第二个秘钥输入错误,则将永久锁定,任何对该寄存器的写入操作都会被忽略掉,直到复位后下一次解锁前。


事实上,我经过试验,无论第一个秘钥错误,还是第二个秘钥错误,均可以重复操作直到解锁为止。




这里要注意的是,2个密钥的顺序,与STM8的用户手册上是相反的,如果按照手册上的顺序,就会停留在do…while循环中。具体原因,也不是很清楚,也可能是我拿到的手册(中文和英文的都一样)太旧了,或者是理解有误。

注:
参考资料说的解锁顺序的问题:
我们来看看官方给的库函数stm8s_flash.c文件中

void FLASH_Unlock(FLASH_MemType_TypeDef MemType)

{

    /* Check parameter */

    assert_param(IS_MEMORY_TYPE_OK(MemType));

    /* Unlock program memory */

    if (MemType == FLASH_MEMTYPE_PROG)

    {

        FLASH->PUKR = FLASH_RASS_KEY1;//KEY1:0x56

        FLASH->PUKR = FLASH_RASS_KEY2;//KEY2:0xAE

    }

    /* Unlock data memory */

    else

    {

        FLASH->DUKR = FLASH_RASS_KEY2; /* Warning: keys are reversed on data memory !!! */

        FLASH->DUKR = FLASH_RASS_KEY1;

    }

}

从上面的函数可以看到解锁FLASH和DATA EEPROM时的顺序是不一样的,中文手册上没体现这一点。当然我们要做的就是直接拿官方的库来用就行了!!


关键字:STM8  选项字节

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/article_2017111435940.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:小记-STM8S003F3端口复用和端口开漏
下一篇:STM8S---选项字节(Option Byte)写操作之IO复用

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32双堆栈及其在uC/OS-II中的使用

,进入中断程序后就开始使用MSP,如果还有一个高优先级的中断难么就继续的使用MSP,在程序推出最后一级中断的时候就用用户堆栈恢复寄存器。下面以uCOS-II为例进行说明:首先建立一个堆栈  OS_STK   AppTaskStartStk[1024]  //32位STM32是向下生长的满栈,初始化堆栈后(在没有使用PSP以前,一直使用的是MSP)。                 |    
发表于 2018-12-03
STM32双堆栈及其在uC/OS-II中的使用

关于STM32中的assert_param()

在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义;在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。所谓有效的参数是指满足规定范围的参数,比如某个参数的取值范围只能是小于3的正整数,如果给出的参数大于3,则这个assert_param()可以在运行的程序调用到这个函数时报告错误,使程序员可以及时发现错误,而不必等到程序运行结果的错误而大费周折。这是一种常见的软件技术,可以在调试阶段帮助程序员快速地排除那些明显的错误。它确实在程序的运行上牺牲了效率(但只是在调试阶段
发表于 2018-12-03

stm32启动文件相关说明

说的直白点就是以下区别,在选择启动文件的时候有选择性区别!startup_stm32f10x_cl.s互联型的STM32F105xx,STM32F107xxstartup_stm32f10x_hd.s 大容量的STM32F101xx,STM32F102xx,STM32F103xxstartup_stm32f10x_hd_vl.s 大容量的STM32F100xxstartup_stm32f10x_ld.s 小容量的STM32F101xx,STM32F102xx,STM32F103xxstartup_stm32f10x_ld_vl.s 小容量
发表于 2018-12-03
stm32启动文件相关说明

STM32定时器相关介绍(主要是有UEV更新事件介绍)

;                                  @note This parameter is valid only for TIM1 and TIM8. */} TIM_TimeBaseInitTypeDef;以上是从库stm32f10x_tim.h中 截取的代码,整体的数据结构可以中这段注释中得知,不懂E文的要么翻字典要么翻库函数中文翻译版本(当然这个是2.0的库,有部分
发表于 2018-12-03

stm32时钟相关

我在原创的基础又从另一位博主处引用了一些内容。  时钟系统是处理器的核心,所以在学习STM32所有外设之前,认真学习时钟系统是必要的,有助于深入理解STM32。     下面是从网上找的一个STM32时钟框图,比《STM32中文参考手册》里面的是中途看起来清晰一些:         重要的时钟:   PLLCLK,SYSCLK,HCKL,PCLK1,PCLK2 之间的关系要弄清楚;       1、HSI:高速内部时钟信号
发表于 2018-12-03
stm32时钟相关

STM32之中断管理

关于STM32的中断,相信大家玩过单片机的朋友就知道,中断是MCU的一大优点,使MUC工作能够分清事情的”轻重缓急“ ,从而达到处理事情井井有条; 今天就讲解下STM32-Cortex-M3内核的中断管理机制,其他处理器的也类似;M3中F103系列的有60个可屏蔽的中断和16个内核级别的中断;     大家知道,操作一款MCU 其实实质就是操作的寄存器,而寄存器有机的结合起来就实现了特定的功能;中断系统也不例外,下面来认识一下中断系统中的几个重要的寄存器;    1. ISER[8](Interrupt Set-Enable Registers),就是中断使能寄存器组
发表于 2018-12-03

小广播

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved
pt type="text/javascript" src="//v3.jiathis.com/code/jia.js?uid=2113614" charset="utf-8">