历史上的今天
返回首页

历史上的今天

今天是:2024年09月08日(星期日)

2018年09月08日 | STM8L EEPROM DATA数据读写

2018-09-08 来源:eefocus

一、概要 

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

        *(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

        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标识位被置为1

  if(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标识位被置为1

    while((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开发还是比较有效率的。


推荐阅读

史海拾趣

DZUS公司的发展小趣事

为了提高产品质量和客户满意度,DZUS公司决定建立质量管理体系。公司引进了先进的生产设备和检测设备,并制定了严格的生产流程和检验标准。此外,公司还加强了员工培训和技能提升工作,确保每一个员工都能熟练掌握操作技能和产品质量要求。这些措施的实施使DZUS公司的产品质量得到了显著提升,并赢得了客户的广泛赞誉。

Able Systems公司的发展小趣事

Able Systems公司成立于1982年,初创时期面临着资金短缺、市场竞争激烈等诸多挑战。然而,公司凭借对微型打印机技术的深刻理解和独特见解,成功开发出了具有竞争力的产品。通过不懈的努力和持续的技术创新,Able Systems逐渐在市场中站稳了脚跟,并赢得了客户的信任。

HBControls公司的发展小趣事
有时简单的重启操作可以解决显示屏问题。断开冰箱电源,等待几分钟后再重新插上电源。
Defense Supply Center Columbus公司的发展小趣事

在电子行业,产品质量是企业生存和发展的关键。Defense Supply Center Columbus公司始终将质量管理放在首位,建立起一套完善的质量管理体系。公司严格按照国际标准进行生产和检测,确保每一件产品都符合质量要求。同时,公司还注重员工的培训和教育,提高员工的质量意识和操作技能。这些措施的实施,使得公司的产品质量得到了显著提升,赢得了客户的广泛赞誉。

CML公司的发展小趣事

面对日益增长的市场需求,CML开始积极寻求市场扩张的机会。公司通过与各大电子产品制造商建立合作关系,将自己的产品广泛应用于电视、手机、电脑等消费电子产品中。同时,CML还积极开拓新兴市场,如汽车电子、工业控制等领域,不断扩大自己的市场份额。这些策略的实施,使得CML的业绩逐年攀升,公司规模不断壮大。

Elpaq公司的发展小趣事

问答坊 | AI 解惑

高等学校教材 模拟电子技术基础简明教程

本帖最后由 paulhyde 于 2014-9-15 09:38 编辑 高等学校教材 模拟电子技术基础简明教程 (第二版).rar  …

查看全部问答>

物联网看上去很美,但咱先玩虚拟的(转)

个人感觉,物联网提了那么多了,但是究竟是什么样,还是不得而知,这篇文章至少是个不错的尝试: 转自:http://bbs.c114.net/viewthread.php?tid=377291 哈哈,一如既往的为物联网摇旗呐喊,智者应顺势而且为嘛,自我感觉良好----不傻! 就目前 ...…

查看全部问答>

【藏书阁】模拟电子技术基础(第四版)课件 康华光

第01章 绪论 19页.ppt 第02章 半导体二极管及基本电路 37页.ppt 第03章 半导体三极管及放大电路基础 82页.ppt 第04章 场效应管放大电路 34页.ppt 第05章 功率放大器 18页.ppt 第06章 集成电路运算放大器 36页.ppt 第08章 信号的运算与处理电 ...…

查看全部问答>

CE6 RIL 不加载的问题

代朋友咨询这个问题。 他把RIL的mdd代码从public移到自己bsp的driver下面,然后把PDD也移植过来,然后编译生成了rilgsm.dll,然后修改了platform.bib和platform.reg文件,然后把此两个文件拷贝到OSDesigns\\......\\release 目录下,然后makeimg, ...…

查看全部问答>

有关ccs的几个问题

我想问工程文件.bjt和工程文件.mak文件有什么区别?能不能把.mak转化为.bjt工程文件。要是能,怎么转? 我这编了几个工程文件,分别单独在ccs软件编译通过而且生成了.out文件。我可以把所有的.out都烧写到dsp芯片里吗?该怎么烧写呢?(烧写一个 ...…

查看全部问答>

香水城深圳ST的代理哪家好点

                                  想选个ST的芯片,深圳哪家好点?谢谢…

查看全部问答>

【招聘】软件工程师,电气类相关专业

招聘单位:        浙江兆益电气有限公司,北京招聘,目前不能解决社保问题。招聘需求:        电气类相关专业,熟练使用示波器等相关工具,精通C语言编程,对数字电路,模拟电路,计算机接口有较好的理解。&n ...…

查看全部问答>

导致汽车电子电路故障的主要原因

导致汽车电子故障的主要原因有以下几种: 私自加装电器引起线路故障: 现在许多私家车都喜欢在车上加装一些电子设置,像车用防盗器、音响等,由于施工技术不专业,会造成线路接错,或者令原有线路负荷加大,导致线路短路,引起电子 ...…

查看全部问答>

下载后需要压缩卷,不能打开

请问下楼主,能直接把资料发我邮箱里吗,我下载后说还需要已压缩分卷,否则打不开啊,求助…

查看全部问答>

RFM50数据手册(中文版)

无线收发带MCU模块,供大家学习参考,有兴趣的朋友可以加我QQ:2295711227…

查看全部问答>