STM8 存储器保护

2020-07-25来源: 51hei关键字:STM8  存储器保护  读保护

读保护

当选项字节中的ROP字节被编程为'0xAA'时,读保护就生效了。这种情况下,无论写保护是否生效,在ICP模式中(使用SWIM接口)读取或修改FLASH程序存储器和DATA区域都是被禁止的。即使认为没有什么保护是完全不可破解的,对于一个通用微处理器来说,STM8的读保护的特性也提供了一个非常高水平的保护级别。


可以在ICP模式中通过对选项字节中的ROP字节重新编程来解除程序存储器、UBC和DATA区域的读保护。在这种情况下,程序存储器、UBC、DATA区域以及选项字节都被自动擦除,器件也可以被重新编程了。


存储器存取安全系统(MASS)

STM8在复位以后,主程序和DATA区域都被自动保护以防止无意的写操作。在试图修改其内容前必须对其解锁,而解锁的机制由存储器存取安全系统(MASS)来管理。UBC区域的特性指明了在UBC中的内容一直是写保护的一旦存储器内容被修改完毕,推荐将写保护使能以防止数据被破坏。

对主程序存储器的写操作

在器件复位后,可以通过向FLASH_PUKR寄存器连续写入两个被叫作MASS密钥的值来解除主程序存储器的写保护。这两个写人FLASH_PUKR的值会和下两个硬件密钥相比较:

● 第一个硬件密钥:0b0101 0110 (0x56)
● 第二个硬件密钥:0b1010 1110 (0xAE)

需要通过如下步骤来解除主程序存储器区域的写保护:

  1. 向FLASH_PUKR写入第一个8位密钥。在系统复位后,当这个寄存器被首次写入值时,数据总线上的值没有被直接锁存到这个寄存器中,而是和第一个硬件密钥值(0x56)相比较。

  2. 如果密钥输入错误,FLASH_PUKR寄存器在下一次系统复位之前将一直被锁住。在下一次复位前,再向该寄存器进行的任何写操作都会被系统忽略掉。

  3. 如果第一个硬件密钥正确,当这个寄存器被第二次写入值时,数据总线上的值没有被直接锁存到这个寄存器中,而是和第二个硬件密钥值(0xAE)相比较。

  4. 如果密钥输入错误,FLASH_PUKR寄存器在下一次系统复位之前将一直被锁住。在下一次复位前,再向该寄存器进行的任何写操作都会被系统忽略掉。

  5. 如果第二个硬件密钥正确,主程序存储器写保护被解除,同时FLASH_IAPSR中的PUL位为1。

在开始编程之前,应用程序可以校验PUL位是否被有效地置1。应用程序可以在任意时刻通过清PUL位来重新禁止对FLASH程序区域的写操作。

对DATA区域的写操作

在STM8复位后,可以通过向FLASH_DUKR寄存器连续写入两个被叫作MASS密钥的值来解除DATA区域的写保护。这两个写入FLASH_DUKR的值会和以下两个硬件密钥值相比:

● 第一个硬件密钥:0b0101 0110 (0x56)
● 第二个硬件密钥:0b1010 1110 (0xAE)

需要通过如下步骤来解除数据区域的写保护:

  1. 向FLASH_DUKR写入第一个8位密钥。在系统复位后,当这个寄存器被首次写入值时,数据总线上的值没有被直接锁存到这个存储器中,而是和第一个硬件密钥值(0x56)相比较。

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

  3. 如果第一个硬件密钥正确,当这个寄存器被第二次写入值时,数据总线上的值没有被直接锁存到这个寄存器中,而是和第二个硬件密钥值(0xAE)相比较。

  4. 如果密钥输入错误,DATA EEPROM区域在下一次系统复位之前将一直保持写保护状态。在下一次复位前,再向该寄存器进行的任何写操作都会被系统忽略。

  5. 如果第二个硬件密钥正确,DATA区域的写保护被解除,同时FLASH_IAPSR中的DUL位为1。

在开始编程之前,应用程序可以通过校验DUL位是否被有效地置1来确认DATA区域已经将写保护解锁。应用程序可以在任意时刻通过清空DUL位来重新禁止对DATA区域的写操作。

对选项字节的写操作的步骤和对DATA EEPROM的操作大致相同。但是要注意到FLASH_CR2中的OPT位要位1以及FLASH_NCR中的NOPT位要为0,这样才可以对选项字节进行写操作。


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

上一篇:STM8 用户启动区域(UBC)
下一篇:STM8 复位(RST)寄存器

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

推荐阅读

STM8查看IO口的方法
今天在用STM8L151K6做输出使能ADP3110A于是把IO口做如下配置用的是PC1GPIO_Init(ADP3110A_EN_PORT, (GPIO_Pin_TypeDef)ADP3110A_EN_PINS, GPIO_Mode_Out_PP_High_Fast); GPIO_SetBits(ADP3110A_EN_PORT,ADP3110A_EN_PINS);//开启ADP3110A_EN但是用示波器测量发现只是1.4V左右,查看数据手册发现在输出兰只有T7 查看注释In the open-drain output column, ‘T’ defines a true open-drain I/O (P
发表于 2020-09-24
<font color='red'>STM8</font>查看IO口的方法
Contiki clock模块
一、functions for handling system timeclock_time_t clock_time(void);//return the current system time in clock ticksunsigned long clock_seconds(void);//return the system time in secondsvoid clock_set_seconds(unsigned long ec);//set the value of the platform seconds这些函数都是platform dependent的,我们是在stm8中实现的。#if USE_RTC_CLK#if
发表于 2020-09-24
关于STM8的用户数据空间读写问题
情况是这样的,我的程序里有一个参数,数值不超过1000,我要保存到EEPROM中,那就要分两个字节存放。我用下面的方式保存是正常的:BASE = 0x4000;param = 999;eeprom_write(BASE+0x01, param/256);eeprom_write(BASE+0x02, param%256);当我准备读的时候,自然想到的是这样:param = eeprom_read(BASE+0x01)<<8 + eeprom_read(BASE+0x02);但是怎么读都不成功,param始终是0后来我想了一起,也许是编译器的理解问题。上一句语句中,其实是三个操作:读、读、加。我估计是编译器拆解语句有问题吧
发表于 2020-09-23
浮点数转换成字符串函数
sprintf函数太大,在STM8上面根本不敢用,动不动就.text overflow。为了将采集的数值通过串口上传到计算机,只能自己写了一个浮点数转换成字符串的函数:#include <stdio.h>#include <stdint.h>static char table[]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};void num2char(char *str, double
发表于 2020-09-22
stm8的坑
stm8某些管脚是真正开漏状态的,必须外接上拉电阻,不然不能拉高,这点和stm32不一样。例如stm8al3188 pc0管脚没有内部上拉。
发表于 2020-09-22
STM8切换为HSE时钟后UART乱码
  当使用HSI时钟时,串口发送正常,说明硬件电路没有问题。当切换为HSE时钟时,发现UART发送数据,上位机收到的是乱码。   问题原因:https://blog.csdn.net/qq_33255400/article/details/89741434       
发表于 2020-09-21
<font color='red'>STM8</font>切换为HSE时钟后UART乱码
小广播
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved