×
嵌入式 > 技术百科 > 详情

STM8L的EEPROM读写原理及例程

发布时间:2020-06-17 发布时间:
|

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.  

  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. }




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
无人机新突破:或将利用手机发射塔追踪无人机