STM8L的EEPROM读写原理及例程

转载地址:http://www.51hei.com/bbs/dpj-56489-1.html

STM8L103C6拥有1KB的片上EEPROM,可以用来存储程序需要用到的参数,就不需要额外使用24C02这样的外部存储器了.
同时,和24C02比起来,STM8L的片上EEPROM操作更简单,可以直接对地址进行操作,进行数据读写.
下图是STM8L闪存和EEPROM的地址分配图,可以看到EEPROM的起始地址为0x001000,结束地址为0x0013FF.共1024个地址空间,所以EEPROM的容量为1KB.
STM8L的EEPROM读写原理及例程_第1张图片
EEPROM在上电复位后是写保护的,在向其中写入数据时,需要解锁,关闭写保护.解锁流程为:
①第一次向FLASH_DUKR写入密钥0xAE
②第二次向FLASH_DUKR写入密钥0x56
两次都写入正确后,写保护功能被关闭,可以对EEPROM区域进行写操作.解锁成功后,DUL位会被置位,在写完密钥后,可以读取DUL位来判断有没有解锁成功.
在向EEPROM写数据时,单片机内部会产生高压对EEPROM写操作,如果这个时候被中断打断,会造成单片机异常,所以写操作时,需要关闭总中断,防止意外发生.
本例程,先向EEPROM的四个地址各写入了一个字节的数据,然后从这个四个地址读取出这些数据,和写入数据进行对比.从下图可以看到,读出数据和写入数据完全一致.
STM8L的EEPROM读写原理及例程_第2张图片

  1. /****************************************************************************************
  2.  
  3. *开发环境:IAR for stm8 v6.5.3
  4.  
  5. *硬件平台:STM8L-DISCOVERY
  6.  
  7. *功能说明:本例程,先向EEPROM的四个连续地址写入四个字节数据,然后读取出来,与写入数据对比
  8.  
  9. *作    者:茗风
  10.  
  11. ****************************************************************************************/
  12.  
  13. #include"iostm8l152c6.h"
  14.  
  15. #include"stdint.h"
  16.  
  17. #define EEPROM_STARTADDR 0x1000 
  18.  
  19.  
  20. /******************************************************************************************************
  21.  
  22. *名    称:  void EEPROM_WriteByte(uint16_t Addr,uint8_t Data)
  23.  
  24. *功    能: 向EEPROM指定地址写入一字节数据
  25.  
  26. *入口参数: Addr:存放数据的偏移地址
  27.  
  28. *           Data:待写入的数据
  29.  
  30. *出口参数:无
  31.  
  32. *范    例:
  33.  
  34. ******************************************************************************************************/
  35.  
  36. void EEPROM_WriteByte(uint16_t Addr,uint8_t Data)
  37.  
  38. {
  39.  
  40.    uint8_t  *Ptr_SegAddr; //Segment pointer
  41.  
  42.    Ptr_SegAddr = (uint8_t *)(EEPROM_STARTADDR+Addr);  //Initialize  pointer
  43.  
  44.    FLASH_DUKR=0xAE;
  45.  
  46.    FLASH_DUKR=0x56;
  47.  
  48.    while(!FLASH_IAPSR_DUL);//如果DUL没有置位,说明解锁不成功,最好加入超时判断
  49.  
  50.    asm("sim");//关闭中断
  51.  
  52.    *Ptr_SegAddr=Data; //指定地址,写1 字节
  53.  
  54.    while(!FLASH_IAPSR_EOP);//等待写操作完成,最好加入超时判断
  55.  
  56.    asm("rim");//打开中断
  57.  
  58.    FLASH_IAPSR_DUL=0;//上锁,对DATA EEPROM写保护
  59.  
  60.    ////////////////////
  61.  
  62. }
  63.  
  64. /******************************************************************************************************
  65.  
  66. *名    称:uint8_t EEPROM_ReadByte(uint8_t Addr)
  67.  
  68. *功    能:从EEPROM中读取一个字节数据
  69.  
  70. *入口参数:Addr:存放数据的偏移地址
  71.  
  72. *出口参数:Data:读回的数据
  73.  
  74. *说    明:无
  75.  
  76. *范    例:无
  77.  
  78. ******************************************************************************************************/
  79.  
  80. uint8_t EEPROM_ReadByte(uint16_t Addr)
  81.  
  82. {
  83.  
  84.    uint16_t Data=0;
  85.  
  86.    uint8_t *Ptr_SegAddr;
  87.  
  88.    Ptr_SegAddr = (uint8_t *)(EEPROM_STARTADDR+Addr);  //Initialize  pointer
  89.  
  90.    Data=*Ptr_SegAddr;
  91.  
  92.    return Data;
  93.  
  94. }
  95.  
  96.  
  97. void main(void)
  98.  
  99. {
  100.  
  101.   static  uint8_t  t1=0,t2=0,t3=0,t4=0;
  102.  
  103.   EEPROM_WriteByte(0x00,0x40);
  104.  
  105.   EEPROM_WriteByte(0x01,0x41);
  106.  
  107.   EEPROM_WriteByte(0x02,0x42); 
  108.  
  109.   EEPROM_WriteByte(0x03,0x43);
  110.  
  111.   
  112.  
  113.   t1=EEPROM_ReadByte(0x00);
  114.  
  115.   t2=EEPROM_ReadByte(0x01);
  116.  
  117.   t3=EEPROM_ReadByte(0x02); 
  118.  
  119.   t4=EEPROM_ReadByte(0x03); 
  120.  
  121. //  asm("rim");               //enable interrupts
  122.  
  123.   while(1)
  124.  
  125.   {
  126.  
  127. //    asm("wfi");
  128.  
  129.   }
  130.  
  131. }
  132.  

复制代码

你可能感兴趣的:(STM8)