1.简介用处
EEPROM可以用来存储信息,在重新写入或者reset 后数据仍然存在并可以被我们读取。总的说来,EEPROM是用来写入存储并可以被我们读取到的串口工具。
2.编写代码前的准备工作
首先,EEPROM的使用需要I2C文件,在考试提供的资源库中,我们可以找到i2c.c文件和i2c.h文件,我们需要提前将.c文件转移到Src文件夹中(注意:在移植后,将名字改为i2c.c和i2c.h),将.h文件转移到Inc文件夹中。并在keil中将i2c.c引用到Application/User中,并在代码中包含i2c.h
#include "i2c.h"
因为我们是直接将iic.c和.h文件移植到项目中的,所以Cubemx并没有帮我们生成初始化代码,所以我们需要在初始化的位置加入初始化代码
I2CInit();
3.代码编写
我们需要在i2c.c中编写函数方便后续调用
向存储器写入数据的“写函数”
void EEPROM_Write(u8 add,u8 dat)
{
I2CStart(); //开始
I2CSendByte(0xa0); //发送0xa0告诉存储器我们要开始写入数据了
I2CWaitAck(); //等待应答,得到应答后执行下面的
I2CSendByte(add); //发送地址信息
I2CWaitAck();
I2CSendByte(dat); //发送想要存储的信息
I2CWaitAck();
I2CStop(); //停止
HAL_Delay(5);
}
从存储器读数据的“读函数”
u8 EEPROM_Read(u8 add)
{
u8 dat;
I2CStart(); //开始
I2CSendByte(0xa0); //发送0xa0告诉存储器我们要开始写入数据了
I2CWaitAck(); //等待应答,得到应答后执行下面的
I2CSendByte(add); //发送地址信息
I2CWaitAck();
I2CStart(); //开始
I2CSendByte(0xa1); //发送0xa1告诉存储器我们要开始读取数据了
I2CWaitAck(); //等待应答,得到应答后执行下面的
dat = I2CReceiveByte(); //读取信息
I2CSendNotAck(); //发送一个无需应答的信息
I2CStop(); //停止
return (dat);
}
写完后需要在i2c.h中声明函数
void EEPROM_Write(u8 add,u8 dat);
u8 EEPROM_Read(u8 add);
4.在main.c中进行编程调用函数
//EEPROM
u8 time=0;
void eeprom()
{
time=EEPROM_Read(0x01);
time++;
EEPROM_Write(0x01,time);
}
该函数在main函数中,while(1)前引用,time用于记录 开机次数,按reset可以增加time。用来检验EEPROM功能。
5.注意:
在使用keil编程时,如果读取到的数是255,也就是说time 这个数超出范围了,可以调整keil的优先级后重新写入
点击魔术棒
在C/C++栏中我们默认使用的是-O3,调为-O0即可。
6.典型的用法
eeprom处理的是八位数据,若需要储存16位数据,则需要一些变化
例子:
u16 n_change;
eeprom_write(0x20,n_change); //默认存储低八位
//eeprom_write(0x20,n_change & 0x00ff); //取低八位数据,与上面作用一样
eeprom_write(0x21,n_change>>8); //数据右移八位,存储高八位
//读数据
n_change = eeprom_read(0x20) | (eeprom_read(0x21)<<8);