找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16125|回复: 1
打印 上一主题 下一主题
收起左侧

STM8L的EEPROM读写原理及例程

[复制链接]
跳转到指定楼层
楼主
ID:140343 发表于 2016-10-10 00:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM8L103C6拥有1KB的片上EEPROM,可以用来存储程序需要用到的参数,就不需要额外使用24C02这样的外部存储器了.
同时,和24C02比起来,STM8L的片上EEPROM操作更简单,可以直接对地址进行操作,进行数据读写.
下图是STM8L闪存和EEPROM的地址分配图,可以看到EEPROM的起始地址为0x001000,结束地址为0x0013FF.共1024个地址空间,所以EEPROM的容量为1KB.

EEPROM在上电复位后是写保护的,在向其中写入数据时,需要解锁,关闭写保护.解锁流程为:
①第一次向FLASH_DUKR写入密钥0xAE
②第二次向FLASH_DUKR写入密钥0x56
两次都写入正确后,写保护功能被关闭,可以对EEPROM区域进行写操作.解锁成功后,DUL位会被置位,在写完密钥后,可以读取DUL位来判断有没有解锁成功.
在向EEPROM写数据时,单片机内部会产生高压对EEPROM写操作,如果这个时候被中断打断,会造成单片机异常,所以写操作时,需要关闭总中断,防止意外发生.
本例程,先向EEPROM的四个地址各写入了一个字节的数据,然后从这个四个地址读取出这些数据,和写入数据进行对比.从下图可以看到,读出数据和写入数据完全一致.

  1. /****************************************************************************************

  2. *开发环境:IAR for stm8 v6.5.3

  3. *硬件平台:STM8L-DISCOVERY

  4. *功能说明:本例程,先向EEPROM的四个连续地址写入四个字节数据,然后读取出来,与写入数据对比

  5. *作    者:茗风

  6. ****************************************************************************************/

  7. #include"iostm8l152c6.h"

  8. #include"stdint.h"

  9. #define EEPROM_STARTADDR 0x1000


  10. /******************************************************************************************************

  11. *名    称:  void EEPROM_WriteByte(uint16_t Addr,uint8_t Data)

  12. *功    能: 向EEPROM指定地址写入一字节数据

  13. *入口参数: Addr:存放数据的偏移地址

  14. *           Data:待写入的数据

  15. *出口参数:无

  16. *范    例:

  17. ******************************************************************************************************/

  18. void EEPROM_WriteByte(uint16_t Addr,uint8_t Data)

  19. {

  20.    uint8_t  *Ptr_SegAddr; //Segment pointer

  21.    Ptr_SegAddr = (uint8_t *)(EEPROM_STARTADDR+Addr);  //Initialize  pointer

  22.    FLASH_DUKR=0xAE;

  23.    FLASH_DUKR=0x56;

  24.    while(!FLASH_IAPSR_DUL);//如果DUL没有置位,说明解锁不成功,最好加入超时判断

  25.    asm("sim");//关闭中断

  26.    *Ptr_SegAddr=Data; //指定地址,写1 字节

  27.    while(!FLASH_IAPSR_EOP);//等待写操作完成,最好加入超时判断

  28.    asm("rim");//打开中断

  29.    FLASH_IAPSR_DUL=0;//上锁,对DATA EEPROM写保护

  30.    ////////////////////

  31. }

  32. /******************************************************************************************************

  33. *名    称:uint8_t EEPROM_ReadByte(uint8_t Addr)

  34. *功    能:从EEPROM中读取一个字节数据

  35. *入口参数:Addr:存放数据的偏移地址

  36. *出口参数:Data:读回的数据

  37. *说    明:无

  38. *范    例:无

  39. ******************************************************************************************************/

  40. uint8_t EEPROM_ReadByte(uint16_t Addr)

  41. {

  42.    uint16_t Data=0;

  43.    uint8_t *Ptr_SegAddr;

  44.    Ptr_SegAddr = (uint8_t *)(EEPROM_STARTADDR+Addr);  //Initialize  pointer

  45.    Data=*Ptr_SegAddr;

  46.    return Data;

  47. }


  48. void main(void)

  49. {

  50.   static  uint8_t  t1=0,t2=0,t3=0,t4=0;

  51.   EEPROM_WriteByte(0x00,0x40);

  52.   EEPROM_WriteByte(0x01,0x41);

  53.   EEPROM_WriteByte(0x02,0x42);

  54.   EEPROM_WriteByte(0x03,0x43);

  55.   

  56.   t1=EEPROM_ReadByte(0x00);

  57.   t2=EEPROM_ReadByte(0x01);

  58.   t3=EEPROM_ReadByte(0x02);

  59.   t4=EEPROM_ReadByte(0x03);

  60. //  asm("rim");               //enable interrupts

  61.   while(1)

  62.   {

  63. //    asm("wfi");

  64.   }

  65. }

复制代码




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1097756 发表于 2024-3-10 15:02 | 只看该作者
很好的程序
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表