STM8S_库函数_片上EEPROM读写操作

大家好,我是单片机爱好者-MCU起航。这里说下使用库函数方式控制STM8S103F3P6实现片上EEPROM读写操作。

很多人接触EEPROM,都是从24C01或者24C02开始。因为早期的单片机资源比较匮乏,所以需要外接这些东西。但随着单片机的片上资源越来越丰富,在某些情况下,这些外接的EEPROM其实是可以省掉的。

相当一部分的单片机内部集成了一部分EEPROM,还有的单片机,内部虽然没有EEPROM,但是我们可以对它的FLASH进行操作,当成EEPROM去使用。当然,把flash当成EEPROM用的话,主要考虑的是寿命问题。因为flash的擦写次数只有几千次或者几万次,而EEPROM的擦写次数有几十万次。

好了,废话不多说,打开数据手册,找到EEPROM方面的简介:

我们可以看到两个信息:1、EEPROM的大小,有640字节;2、它的擦写次数可以达到30万次。

这里注意,不是说所有的STM8S的EEPROM的大小都是640字节!EEPROM的大小根据不同的单片机型号会有不同的调整,咱们这里使用的是最小的一种。如图:

从这个图中,我们得到两个信息:1、STM8S根据存储容量分为大、中、小三种器件;2、我们使用的是小容量,EEPROM分10页,一页64字节。

大小知道了,页数知道了。然后需要知道EEPROM的起始地址!在24C02里面,起始地址都是0,这里不一样,看图:

起始地址是0x004000,一直到0x00427f。我们可以算一下,两个地址想减,得到0x27f,换算成十进制是639,把0x004000也加上,刚好640.

大小知道了,起始地址也有了,接下来看如何操作。读写操作这里要看数据手册中的flash相关的寄存器,如图:

每个寄存器的功能这里就不说了,太麻烦,咱们直接看下如何使用库函数进行读写操作。首先是写操作,代码如下:

/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"
#include "eeprom.h"
#include "uart.h"

const unsigned char mcu_str01[] ="write eeprom ok!\r\n";
/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
void Delay(uint16_t nCount)
{
  /* Decrement nCount value */
  while (nCount != 0)
  {   
    nCount--;
  }
}
void main(void)
{
  Uart1_Init();
//  enableInterrupts();                 //使能中断
  Delay(60000);
  Delay(60000);
  WritrE2prom();
  UART1_Sendstr(mcu_str01);
  while (1);
  
}

可以看到,这里使用了单独编写的c文件和h文件。一个是eeprom,另一个是uart。也就是说这里用到了串口,虽然还没有讲到,但是没关系,先用。后面会讲的!

功能比较简单,咱们直接看主函数。上电后,串口初始化、延时、写EEPROM、串口打印写完成信息、原地等待。

为什么加延时?

EEPROM刚上电,如果不加延时,会出现写操作失效的情况。而且,读写操作之间,也要加延时。

写操作代码如下:

void WritrE2prom(void)
{
    u8 i;
    FLASH_Unlock(FLASH_MEMTYPE_DATA);
    for(i=0; i<10; i++)
    {
        FLASH_EraseByte(EEPROM_HEAD_ADDR + i);
    }
    for(i=0; i<10; i++)
    {
        FLASH_ProgramByte((EEPROM_HEAD_ADDR+i), 'a'+i);
    }
    FLASH_Lock(FLASH_MEMTYPE_DATA);
}

如上,EEPROM_HEAD_ADDR是一个宏定义,定义了EEPROM的首地址:

#define EEPROM_HEAD_ADDR 0x004000 //写EEPROM的首地址

解除保护、擦除、写入、上锁。

然后是读操作,也很简单:

void ReadE2prom(void)
{
    u8 i;
    FLASH_Unlock(FLASH_MEMTYPE_DATA);
    for(i=0; i<10; i++)
    {
      Eeprom_buf[i] = FLASH_ReadByte(EEPROM_HEAD_ADDR+i);
    }
    FLASH_Lock(FLASH_MEMTYPE_DATA);
}

解锁、读取、上锁。

很简单,打完收工!

要获取该程序完整的工程文件,可以关注公众号:单片机爱好者,然后回复关键词:STM8S。可以获取完整的下载链接,里面包含工程文件、视频、PPT、数据手册等所有相关资料。

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据