STM8S——Flash program memory and data EEPROM

1、简介

  STM8S内部的FLASH程序存储器和数据EEPROM是由一组通用寄存器来控制的;所以我们可以通过这些通用寄存器来编程或擦除存储器的内容、设置写保护、或者配置特定的低功耗模式。我们也可以自己对器件的 option byte 进行编程。在这里我们只简单的讲解如何对STM8S内部的数据存储区域(data memory)进行写操作、读操作、擦除操作。

2、存储架构图

STM8S内部存储包括:FLASH程序存储器(FLASH program memory)和数据EEPROM(DATA EEPROM);

(1)数据EEPROM又包括:

  • 数据存储区域(DATA MEMORY):指定从地址0x00 4000开始,其中包括 [1 block] 的option byte,数据存储区域用于存储应用数据;

(2)FLASH程序存储器又包括:

  • 用户启动区域(USER BOOT CODE):指定从地址0x00 8000开始,其中包括UBC option bytes和 [128 byte] 的中断矢量(interrupt vectors);
  • 程序存储区域(MAIN PROGRAM):用于存储应用程序代码;

  所以我们的操作是在DATA MEMORY里面,在该区域的指定地址进行读取内容、写入内容、擦除内容。

3、操作方法

(1)FLASH_ReadByte( ADDRESS ):读取地址ADDRESS处的1字节内容

(2)FLASH_ProgramByte( ADDRESS , DATA ):写1字节的内容到地址ADDRESS处

(3)FLASH_EraseByte( ADDRESS ):在地址ADDRESS处删除1字节的内容

4、操作步骤

使用操作前的配置

(1)配置选择编程时间,选择标准模式;

(2)解除数据存储区域的写保护;

说明:UBC和DATA MEMORY都有写保护,其中UBC的写保护是永远无法解锁的,而DATA MEMORY的写保护是可以通过连续写入两个MASS密钥值来解除该区域的写保护的;第一个密钥为0x56,第二个密钥为0xAE;只有当两个密钥输入正确(输入到寄存器FLASH_DUKR中)且输入密钥的先后顺序正确时,才会解除写保护;否则该区域在下一次系统复位之前都将一直保持写保护状态。

(3)读取、写入、擦除等操作;

5、代码实现

 1 /* Includes ------------------------------------------------------------------*/
 2 #include "stm8s.h"
 3 
 4 /* Private typedef -----------------------------------------------------------*/
 5 typedef enum { FAILED = 0, PASSED = !FAILED} TestStatus;
 6 
 7 /* Private variables ---------------------------------------------------------*/
 8 __IO TestStatus OperationStatus;
 9 
10 
11 /**
12   * @brief How to Read / Write / Erase one Byte on FLASH memory.
13   * @par   Examples description
14   *        - Read one byte at address 0x40A5
15   *        - Write its complement value at address + 1
16   *        - Check programed value
17   *        - Erase 2 byte (address 40A5 & 40A6)
18   *        - Check the 2 bytes value is 0x00.
19   * @param  None
20   * @retval None
21   */
22 void main(void)
23 {
24 
25     uint8_t val = 0x00, val_comp = 0x00;
26     uint32_t add = 0x00;
27 
28     /* Define FLASH programming time */
29         //Standard programming time fixed at 1/2 tprog
30     FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD);
31 
32     /* Unlock Data memory */
33         //compare to two hardware key value: 0x56 and 0xAE
34     FLASH_Unlock(FLASH_MEMTYPE_DATA); 
35 
36     /* Read a byte at a specified address */
37     add = 0x40A5;
38         //read one byte from the address
39     val = FLASH_ReadByte(add); 
40 
41     /* Program complement value (of previous read byte) at previous address + 1 */
42     val_comp = (uint8_t)(~val);
43         //modify one byte at the address
44     FLASH_ProgramByte((add + 1), val_comp); 
45 
46     /* Check program action */
47     val = FLASH_ReadByte((add + 1));
48     if (val != val_comp)
49     {
50         /* Error */
51         OperationStatus = FAILED;
52         /* OperationStatus = PASSED, if the data written/read to/from DATA EEPROM memory is correct */
53         /* OperationStatus = FAILED, if the data written/read to/from DATA EEPROM memory is corrupted */
54         while (1)
55         {
56         }
57     }
58 
59     /* Erase byte at a specified address & address + 1 */
60         //erase one byte at the address
61     FLASH_EraseByte(add);
62     FLASH_EraseByte((add + 1));
63     /* Erase action */
64     val = FLASH_ReadByte(add);
65     val_comp = FLASH_ReadByte((add + 1));
66     if ((val != 0x00) & (val_comp != 0x00))
67     {
68         /* Error */
69         OperationStatus = FAILED;
70         /* OperationStatus = PASSED, if the data written/read to/from DATA EEPROM memory is correct */
71         /* OperationStatus = FAILED, if the data written/read to/from DATA EEPROM memory is corrupted */
72         while (1)
73         {
74         }
75     }
76 
77     /* Pass */
78     OperationStatus = PASSED;
79     /* OperationStatus = PASSED, if the data written/read to/from DATA EEPROM memory is correct */
80     /* OperationStatus = FAILED, if the data written/read to/from DATA EEPROM memory is corrupted */
81     while (1)
82     {
83     }
84 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

特殊的物化视图刷新 (r4笔记第77天)

现在有一个需求,某个环境中存在两个用户,一个用户中存在物化视图,另一个用户中存在源表,根据业务的需要,需要做一种特别的物化视图刷新。 ? 物化视图用户中的物化...

3377
来自专栏C++

Windows核心编程:第3章 内核对象

522
来自专栏个人分享

Hive metastore表结构设计分析

  今天总结下,Hive metastore的结构设计。什么是metadata呢,对于它的描述,可以理解为数据的数据,主要是描述数据的属性的信息。它是用来支持如...

832
来自专栏PHP在线

PHP开发人员常犯的10个MysqL错误

对于大多数web应用来说,数据库都是一个十分基础性的部分。如果你在使用PHP,那么你很可能也在使用MySQL—LAMP系列中举足轻重的一员。 对于很多新手们来说...

2844
来自专栏杨建荣的学习笔记

通过错误的sql来测试推理sql的解析过程(二) (r8笔记第7天)

之前总结过一篇 通过错误的sql来测试推理sql的解析过程 也算是以毒攻毒,当然也分析出来一些有意思的内容来,让原本看起来枯燥的内容有了更多的实践意义。 ...

2649
来自专栏数据和云

故障分析:一则library cache lock问题处理

编辑手记:library cache lock 大家都并不陌生,在MOS上对该阻塞的一般成因描述为:一般可以理解的是alter table或者alter pac...

3435
来自专栏技术点滴

Windows文件操作基础代码

Windows文件操作基础代码     Windows下对文件进行操作使用的一段基础代码File.h,首先是File类定义: #pragma once #inc...

2249
来自专栏PHP在线

PHP开发人员常犯的10个MysqL错误

对于大多数web应用来说,数据库都是一个十分基础性的部分。如果你在使用PHP,那么你很可能也在使用MySQL—LAMP系列中举足轻重的一员。 对于很多新手们来说...

3758
来自专栏乐沙弥的世界

Oracle 外部表

外部表只能在Oracle 9i 之后来使用。简单地说,外部表,是指不存在于数据库中的表。通过向Oracle提供描述外部表的元数据,我们

592
来自专栏杨建荣的学习笔记

由一条报警信息发现的一系列问题(r7笔记第67天)

今天看到一条报警短信,提示是某个表空间的问题。 ZABBIX-监控系统: ------------------------------------ 报警内容:...

3489

扫码关注云+社区