• STM8S103F3--EEPROM


      本文介绍stm8s103f3这款单片机的eeprom的用法。

          EEPROM是单片机应用系统中经常会用到的存储器,它主要用来保存一些掉电后需要保持不变的数据。在以前的单片机系统中,通常都是在单片机外面再扩充一个EEPROM芯片,这种方法除了增加成本外,也降低了可靠性。现在,很多单片机的公司都推出了集成有小容量EEPROM的单片机,这样就方便了使用,降低了成本,提高了可靠性。

            1.介绍STM8S103F3的首地址及容量。

            STM8单片机芯片内部也集成有EEPROM,容量从640字节到2K字节。最为特色的是,在STM8单片机中,对EEPROM的访问就象常规的RAM一样,非常方便。EEPROM的地址空间与内存是统一编址的,地址从004000H开始,大小根据不同的芯片型号而定。

            stm8s103f3的EEPROM存储结构如下:

    clipboard

            由上图可知,EEPROM的大小为0x00427f-0x004000+1=0x280=640bytes。

            2.介绍EEPROM的解保护寄存器。

    clipboard[1]

            向该寄存器先写入0XAE,然后写入0X56就可以解除解保护。想该寄存器读操作时,会返回0;

            3.FLASH状态寄存器

    clipboard[2]

    clipboard[3]

        需要注意的是bit3,bit3为EEPROM区域解锁标记,0表示保护使能,1表示保护失效。向FLASH_DUKR中写入解锁数据后通过查看FLASH_IAPSR寄存器的bit3来确定EEPROM区域已经解锁。

            bit2表示编程结束标志。对EEPROM区域进行写操作后需要判断该位来确定已经写操作成功。

            下面设计两个程序程序,第一个程序给EEPROM中的004000H位置写入一个值01H,少写入Flash中。第二个程序先读出004000H位置的值,然后给该值加1,再写入到004000H位置,也即是说每次上电时,004000H位置的值会加1。同时为了观察现象,在第二个程序中设置了一个LED灯,通过灯的亮灭次数来表示当前004000H位置的值。

    第一个程序:

     1         #include "iostm8s103f3.h"
     2 
     3 void main()
     4 
     5 {
     6 
     7   unsigned char *p;
     8 
     9   unsigned int i;
    10 
    11   p = (unsigned char *)0x4000; // 指针p指向芯片内部的EEPROM第一个单元
    12 
    13   // 对数据EEPROM进行解锁
    14 
    15   do
    16 
    17   {
    18 
    19     FLASH_DUKR = 0xae; // 写入第一个密钥
    20 
    21     FLASH_DUKR = 0x56; // 写入第二个密钥
    22 
    23   } while((FLASH_IAPSR & 0x08) == 0); // 若解锁未成功,则重新再来
    24 
    25   *p=1; // 写入第一个字节
    26 
    27   while((FLASH_IAPSR & 0x04) == 0); // 等待写操作成功
    28 
    29 }

    第二个程序:
     1  #include "iostm8s103f3.h"
     2  unsigned char ch;
     3  void delay (unsigned int times)
     4  {
     5    unsigned int i,j;
     6    for(j=0;j<times;j++)
     7    for(i=0;i<65535;i++);
     8  }
     9  void main()
    10  {
    11    unsigned char *p;
    12    unsigned int i;
    13    p = (unsigned char *)0x4000; // 指针p指向芯片内部的EEPROM第一个单元
    14    // 对数据EEPROM进行解锁
    15     ch=0;
    16     PD_DDR = 0x10;
    17     PD_CR1 = 0x10;
    18     PD_CR2 = 0x00;
    19    do
    20    {
    21      FLASH_DUKR = 0xae; // 写入第一个密钥
    22      FLASH_DUKR = 0x56; // 写入第二个密钥
    23    } while((FLASH_IAPSR & 0x08) == 0); // 若解锁未成功,则重新再来
    24    *p = *p+1; // 写入第一个字节
    25    while((FLASH_IAPSR & 0x04) == 0); // 等待写操作成功
    26    ch=*p; // 将写入的内容读到变量ch中
    27    for(i=0;i<ch;i++){
    28      PD_ODR = 0x00;
    29      delay(4);
    30      PD_ODR=0X10;
    31      delay(4);
    32    }
    33  }

    第二个程序下载完成之后,对开发版进行断电和上电操作,上电后PD4所对应的LED灯就会闪烁,闪烁次数代表*p位置的值的大小。

  • 相关阅读:
    电源
    SM2947
    网表
    cadence设计思路
    青山依旧在,几度夕阳红
    乐观锁与悲观锁
    笔记
    强弱软虚引用
    缓存相关
    dubbo
  • 原文地址:https://www.cnblogs.com/zhezhe1988/p/3900173.html
Copyright © 2020-2023  润新知