STM8内部的FLASH程序存储器和数据EEPROM由一组通用寄存器来控制。用户可以使用这些寄存器来编程或擦除存储器的内容、设置写保护、或者配置特定的低功耗模式。用户也可以对器件的选项字节(Option byte)进行编程。
- STM8S EEPROM分为两个存储器阵列:
- 最多至 128K字节的FLASH程序存储器,不同的器件容量有所不同。请参考4.4存储器组织结构了解更多细节。
- 最多至 2K字节的数据EEPROM(包括option byte-选择字节),不同的器件容量有所不同。请参考4.4存储器组织结构了解更多细节。
- 编程模式
- 字节编程和自动快速字节编程(没有擦除操作)
- 字编程
- 块编程和快速块编程(没有擦除操作)
- 在编程/擦除操作结束时和发生非法编程操作时产生中断
- 读同时写(RWW)功能。该特性并不是所有STM8S器件都拥有。请参考ATM8具体的数据手册了解更多细节。
- 在应用编程(IAP)和在线编程(ICP)能力。
- 保护特性
- 存储器读保护(ROP)
- 基于存储器存取安全系统(MASS密钥)的程序存储器写保护
- 基于存储器存取安全系统(MASS密钥)的数据存储器写保护
- 可编程的用户启动代码区域(UBC)写保护
- 在待机(Halt)模式和活跃待机(Active-halt)模式下,存储器可配置为运行状态和掉电状态。
存储器组织结构
STM8S的EEPROM以32位字长(每字4字节)为基础组织起来。根据不同的器件,存储器组织机 构有所不同:
- 小容量STM8S器件
- 8K FLASH程序存储器,每页 64字节,共 128页
- 640字节数据 EEPROM,每页 64字节,共 10页。数据 EEPROM包括一页的选项字节(64字节)。
- 中容量STM8S器件
- 从 16K到 32K FLASH程序存储器,每页 512字节,最多 64页
- 1K字节数据EEPROM,每页 512字节,共 2页。数据 EEPROM包括一页的选项字节(512字节)。
- 大容量STM8S器件
- 从 64K到 128K FLASH程序存储器,每页 512字节,最多 256页
- 从 1K到 2K字节数据 EEPROM,每页 512字节,共 4页。数据 EEPROM包括一页的选项字节(512字节)。
页的大小定义了用户启动代码区域(UBC)大小的最小可调整值。请参考4.4.1用户启动区域 (UBC)。 图3和图4展示了STM8S系列FLASH存储器和数据EEPROM的组织机构。
用户启动区域(UBC)
用户启动区域(UBC)包含有复位和中断向量表,它可用于存储IAP及通讯程序。UBC有一个两级保护结构可保护用户代码及数据在IAP编程中免于无意的擦除或修改。这意味着该区域总是写保护的,而且写保护不能通过使用MASS密钥来解锁。
在ICP模式下(使用SWIM接口)可以通过修改选项字节来配置UBC的大小。UBC选项字节指定了分配在UBC中的页的数量。UBC区域的起始地址是0x00 8000。 可以通过读取UBC选项字节来获得UBC区域的大小。请参考图6,图7和图8来了解UBC区域的存储器映射。对于选项字节部分,请参考相应的数据手册了解更多的UBC选项字节的细节。
2. 头两页(128字节)包含中断向量表。
1. UBC[7:0]=0x00意味着没有定义用户启动区域。请参考相应的数据手册了解UBC选项字节的细节。
2. 头两页(1K字节)包含中断向量表。中断向量表只占用128字节(32个中断向量)。
2. 头两页(1K字节)包含中断向量表。中断向量表只占用128字节(32个中断向量)。
存储器保护
读保护
当选项字节中的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)
需要通过如下步骤来解除主程序存储器区域的写保护:
向FLASH_PUKR写入第一个8位密钥。在系统复位后,当这个寄存器被首次写入值时,数据总线上的值没有被直接锁存到这个寄存器中,而是和第一个硬件密钥值(0x56)相比较。
如果密钥输入错误,FLASH_PUKR寄存器在下一次系统复位之前将一直被锁住。在下一次复位前,再向该寄存器进行的任何写操作都会被系统忽略掉。
如果第一个硬件密钥正确,当这个寄存器被第二次写入值时,数据总线上的值没有被直接锁存到这个寄存器中,而是和第二个硬件密钥值(0xAE)相比较。
如果密钥输入错误,FLASH_PUKR寄存器在下一次系统复位之前将一直被锁住。在下一次复位前,再向该寄存器进行的任何写操作都会被系统忽略掉。
如果第二个硬件密钥正确,主程序存储器写保护被解除,同时FLASH_IAPSR中的PUL位为1。
在开始编程之前,应用程序可以校验PUL位是否被有效地置1。应用程序可以在任意时刻通过清PUL位来重新禁止对FLASH程序区域的写操作。
对DATA区域的写操作
在STM8复位后,可以通过向FLASH_DUKR寄存器连续写入两个被叫作MASS密钥的值来解除DATA区域的写保护。这两个写入FLASH_DUKR的值会和以下两个硬件密钥值相比:
● 第一个硬件密钥:0b0101 0110 (0x56)
● 第二个硬件密钥:0b1010 1110 (0xAE)
需要通过如下步骤来解除数据区域的写保护:
向FLASH_DUKR写入第一个8位密钥。在系统复位后,当这个寄存器被首次写入值时,数据总线上的值没有被直接锁存到这个存储器中,而是和第一个硬件密钥值(0x56)相比较。
如果密钥输入错误,应用程序可以尝试重新输入这两个MASS密钥来对DATA区域进行解锁。
如果第一个硬件密钥正确,当这个寄存器被第二次写入值时,数据总线上的值没有被直接锁存到这个寄存器中,而是和第二个硬件密钥值(0xAE)相比较。
如果密钥输入错误,DATA EEPROM区域在下一次系统复位之前将一直保持写保护状态。在下一次复位前,再向该寄存器进行的任何写操作都会被系统忽略。
如果第二个硬件密钥正确,DATA区域的写保护被解除,同时FLASH_IAPSR中的DUL位为1。
在开始编程之前,应用程序可以通过校验DUL位是否被有效地置1来确认DATA区域已经将写保护解锁。应用程序可以在任意时刻通过清空DUL位来重新禁止对DATA区域的写操作。
对选项字节的写操作的步骤和对DATA EEPROM的操作大致相同。但是要注意到FLASH_CR2中的OPT位要位1以及FLASH_NCR中的NOPT位要为0,这样才可以对选项字节进行写操作。
上一篇:STM8 读同时写RWW
下一篇:STM8 CPU寄存器描述
推荐阅读最新更新时间:2024-03-16 15:04