一、概要
STM8系列一般拥有如下几种三种数据区

  • 用户启动区域(UBC)
  • 数据EEPROM(DATA)
  • 主程序区
  • 选项字节(Option byte)

用户启动区域(UBC)包含有复位和中断向量表,它可用于存储IAP及通讯程序;
数据EEPROM(DATA)区域可用于存储用户具体项目所需的数据;
主程序区是指在FLASH程序存储器中用于存储应用代码的区域;
选项字节用于配置硬件特性和存储器保护状态。

作为应用而言,一般主要使用EEPROM(DATA),存放各种参数、或者离线数据、状态数据等等。
下面以以STM8L052R8为例,简单说明对其的访问方法。

根据STM8L052R8的手册,其有Memory信息如下:

■ Memories
– 64 KB Flash program memory and 256 bytes data EEPROM with ECC, RWW
– Flexible write and read protection modes
– 4 KB of RAM

可知其具有256字节的EEPROM。并带有ECC校验,和RWW(读同时写)功能。

RWW特性允许户在执行程序和读程序存储器时对DATA EEPROM区域进行写操作,
因此执行的时间被优化了。相反的操作是不允许的:即不允许在写程序寄存器是对其进行读操作。
RWW特性是一直有效的而且可以在任意时刻使用

对EEPROM编程也有如下几种方式,顾名思义,很容易理解其含义。
字节编程方式最易于理解,也最简单。

  • 字节编程
  • 字编程
  • 块编程

二、更深入的细节
STM8系列有存储器存取安全系统(MASS),在复位后,主程序和DATA区域都被自动保护以防止无意的写操作。
在修改其内容前必须对其解锁,而解锁的机制由存储器存取安全系统(MASS)来管理。(UBC始终为写保护)
因此写操作时需要先解除写保护,并在完成写入后恢复写保护(视应用而定)。

Unlock的具体操作是,向FLASH_DUKR寄存器连续写入两个被叫作MASS密钥的值:

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

如果解锁成功,FLASH_IAPSR中的DUL位被置为1,表示成功。
应用必须检测这个标志才可进行后续操作。
(编程区与之类似,但写入的是PUKR,且2个密钥顺序相反)

对EEPROM的读写其实非常简单,就是直接对地址按字节进行赋值和取值。
但是在操作后,需要等待其操作完成。判断方法是:

  • 对于EEPROM(DATA)数据区:FLASH_IAPSR寄存器的HVOFF(高压结束标志位)变为1
  • 对于编程区:FLASH_IAPSR寄存器的EOP(编程结束标志位)变为1

另外,试图向被保护页进行写操作时,会发生错误,此时FLASH_IAPSR得WR_PG_DIS标志位会置1。
所以,最终的判断方法是:
HVOFF或者WR_PG_DIS被置为1,前者为正常介绍,后者表示出错

三、示例代码

地址范围定义(读写范围为0~127字节)

#define DATA_MEMORY_START_ADDR (FLASH_DATA_EEPROM_START_PHYSICAL_ADDRESS)
#define DATA_MEMORY_STOP_ADDR  (FLASH_DATA_EEPROM_START_PHYSICAL_ADDRESS + 128)

初始化函数

void flash_init(void)
{// 设置编程时间,指定标准编程时间即可FLASH_SetProgrammingTime(FLASH_ProgramTime_Standard);// 解锁EEPROM区域(注意type是Data)FLASH_Unlock(FLASH_MemType_Data);// 等待解锁成功// 本质是判断FLASH->IAPSR寄存器的DUL标志位是否变为1。1表示写保护消除,0为保护中// 任何时候都可以通过变更此标志位为0来恢复写保护状态while (FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET);
}

读函数

uint8_t flash_read(uint32_t FlashAddr, uint8_t *dest, uint8_t nbyte)
{uint8_t i = 0;// 越界判断if((FlashAddr < DATA_MEMORY_START_ADDR)||(FlashAddr+ nbyte > DATA_MEMORY_STOP_ADDR)) {return FALSE;}// 按字节读for(i=0; i<nbyte; i++) {*(dest+i)=FLASH_ReadByte(FlashAddr+i);// 等待操作完成,此处未处理错误FLASH_WaitForLastOperation(FLASH_MemType_Data);}return nbyte;
}

写函数

uint8_t flash_write(uint32_t FlashAddr, uint8_t *source, uint8_t nbyte)
{uint8_t i = 0;// 越界判断if((FlashAddr < DATA_MEMORY_START_ADDR)||(FlashAddr+ nbyte > DATA_MEMORY_STOP_ADDR)) {return FALSE;}// 按字节写for(i=0;i<nbyte;i++) {FLASH_ProgramByte((FlashAddr+i),*(source + i));// 等待操作完成,此处未处理错误FLASH_WaitForLastOperation(FLASH_MemType_Data);}return nbyte;
}

四、库函数实现解析

FLASH_Unlock函数

void FLASH_Unlock(FLASH_MemType_TypeDef FLASH_MemType)
{/* Unlock program memory */if(FLASH_MemType == FLASH_MemType_Program){FLASH->PUKR = FLASH_RASS_KEY1;FLASH->PUKR = FLASH_RASS_KEY2;}/* Unlock data memory */// 连续两次赋值密钥(固定值)if(FLASH_MemType == FLASH_MemType_Data){FLASH->DUKR = FLASH_RASS_KEY2; /* Warning: keys are reversed on data memory !!! */ /* 0xAE */FLASH->DUKR = FLASH_RASS_KEY1; /* 0x56 */}
}

FLASH_ReadByte、FLASH_ProgramByte、FLASH_EraseByte
由下可知,读写擦出均为直接操作地址。

uint8_t FLASH_ReadByte(uint32_t Address)
{/* Read byte */return(*(PointerAttr uint8_t *) (MemoryAddressCast)Address);
}void FLASH_ProgramByte(uint32_t Address, uint8_t Data)
{*(PointerAttr uint8_t*) (MemoryAddressCast)Address = Data;
}void FLASH_EraseByte(uint32_t Address)
{*(PointerAttr uint8_t*) (MemoryAddressCast)Address = FLASH_CLEAR_BYTE; /* Erase byte */
}

FLASH_WaitForLastOperation 操作等待

FLASH_Status_TypeDef FLASH_WaitForLastOperation(FLASH_MemType_TypeDef FLASH_MemType))
{uint16_t timeout = OPERATION_TIMEOUT;uint8_t flagstatus = 0x00;/* Wait until operation completion or write protected page occurred */// 程序区等待IAPSR的EOP或者WR_PG_DIS标识位被置为1if(FLASH_MemType == FLASH_MemType_Program){while((flagstatus == 0x00) && (timeout != 0x00)){flagstatus = (uint8_t)(FLASH->IAPSR & (uint8_t)(FLASH_IAPSR_EOP |FLASH_IAPSR_WR_PG_DIS));timeout--;       // 贴心的超时处理}}else{// 数据区的话,等待IAPSR的HVOFF或者WR_PG_DIS标识位被置为1while((flagstatus == 0x00) && (timeout != 0x00)){flagstatus = (uint8_t)(FLASH->IAPSR & (uint8_t)(FLASH_IAPSR_HVOFF |FLASH_IAPSR_WR_PG_DIS));timeout--;        // 贴心的超时处理}}if(timeout == 0x00){ // 超时flagstatus = FLASH_Status_TimeOut;}return((FLASH_Status_TypeDef)flagstatus);
}

以上,相比直接操作寄存器,用库做STM开发还是比较有效率的。

STM8L EEPROM DATA数据读写相关推荐

  1. eeprom stm8l 擦除 读写_[STM8L]EEPROM操作读与写

    原标题:[STM8L]EEPROM操作读与写 带有片上EEPROM,常用来保存参数,事实上STM8L整个程序存储区都可以用于作为EEPROM,只是默认情况下被闭了. 不同型号的STM8L器件其内部默认 ...

  2. STC15系列单片机通过串口多字节数据读写EEPROM操作

    STC15系列单片机通过串口多字节数据读写EEPROM操作

  3. 基于FPGA的SD卡的数据读写实现(SD NAND FLASH)

    文章目录 1.存储芯片分类 2.NOR Flash 与 NAND Flash的区别 3.什么是SD卡? 4.什么是SD NAND? 5.SD NAND的控制时序 6.FPGA实现SD NAND读写 6 ...

  4. AT24C01/AT24C02系列EEPROM芯片单片机读写驱动程序

    一.概述 EEPROM是嵌入式开发中比较常用的芯片,用来保存参数及掉电记忆的数据等,最常用的是ATMEL的AT24Cxx系列的IIC接口,也有其他厂家的如罗姆Rohm的BR24Gxx系列.ST的M24 ...

  5. ios获取新数据要不要关_iOS开发之数据读写

    iOS进阶 1:数据处理之数据读写 1):获取当前应用程序的沙盒根目录 NSString*rootPath = NSHomeDirectory(); NSLog(@"%@",roo ...

  6. spark编程基础--5.3数据读写

    文件数据读写 1.本地文件系统的数据读写 1)从文件中读取数据创建RDD 2)把RDD写入到文本文件中 2.分布式文件系统HDFS的数据读写 3. JSON文件的读取 JSON(JavaScript ...

  7. 【Android 逆向】ptrace 函数 ( ptrace 函数族 | 进程附着 | 进程脱离 | 进程数据读写权限 | 进程对应的主线程寄存器读写 | 单步调试 |ptrace 函数族状态转换 )

    文章目录 一.ptrace 函数族 1.进程附着 2.进程脱离 3.进程数据读写权限 4.进程对应的主线程寄存器读写 5.单步调试 6.继续向后执行 二.ptrace 函数族状态转换 一.ptrace ...

  8. OpenCV FileStorage类的数据读写操作

    OpenCV FileStorage类的数据读写操作 OpenCV的许多应用都需要使用数据的存储于读取,例如经过3D校准后的相机,需要存储校准结果矩阵,以方便下次调用该数据:基于机器学习的应用,同样需 ...

  9. python写入数据的一种措施_Python 文件数据读写的具体实现

    文件数据读写 读写文件,本质上是请求操作系统打开一个文件对象,然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件). 文件读取 使用 Python 内置 ...

  10. Python 数据分析三剑客之 Pandas(十):数据读写

    CSDN 课程推荐:<迈向数据科学家:带你玩转Python数据分析>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python ...

最新文章

  1. CF853 (Div.1) A Planning(贪心)
  2. Android规范发展
  3. 撩课-Java面试宝典-第八篇
  4. 清华大四本科生2篇一作论文入选ICML 2020,后浪果然翻涌
  5. python的编程模式-举例讲解Python设计模式编程中的访问者与观察者模式
  6. 塑壳断路器用考虑启动电流么_塑壳式断路器知识
  7. Ajax-个人学习记录(2)
  8. 玄学小记.5 ~ Bluestein's algorithm
  9. STM32F103移植mpu9250
  10. nodejs实战《一起学 Node.js》 使用 Express + MongoDB 搭建多人博客
  11. 基于vue的验证码组件
  12. 20200815:力扣201周周赛题解记录下
  13. 后宫宛如传服务器维护,后宫宛如传完整版
  14. python实现同一目录文件下所有Excel数据文件的合并
  15. Win10 Android Fastboot驱动问题
  16. 丅rust是什么意思_网红编程语言Rust到底是个什么鬼?
  17. 阿里巴巴达摩院发布2019十大科技趋势:语音AI在特定领域通过图灵测试...
  18. allegro画两层板板步骤
  19. java.io.EOFException
  20. 【docker容器常用操作】

热门文章

  1. php laypage,LayUI分页和LayUI laypage分页区别详解
  2. Python以TCp搭建小游戏服务器
  3. photoshop实现图片更换背景
  4. 广州地铁线路查询程序C语言,c语言广州地铁系统报错,帮帮忙看一看哈?
  5. 航测和倾斜摄影处理软件汇总
  6. 身份证前6位对应的省市区代码(超详细)
  7. (Java笔记)CGLib动态代理
  8. 基于wincc的虚拟电梯设计_PLC基于WinCC的四层电梯监控系统设计+梯形图
  9. ios 苹果手机适配代码
  10. ISO 2768-2 标准