大家好,我是单片机爱好者-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、数据手册等所有相关资料。