Mobile wallpaper 1Mobile wallpaper 2Mobile wallpaper 3Mobile wallpaper 4
1396 字
7 分钟
EEPROM相关知识与应用

一、EEPROM 使用示例及理解#

EEPROM(电可擦可编程只读存储器)在使用中主要有以下几种数据存储情况:

  1. 单字节存储:使用 unsigned char 类型,用于存储单个字节的数据

  2. 多字节存储:如 unsigned int 类型,存放时会自动占用两个连续位置,读取时每次只能读一个字节,需分别读取高低位再组合

  3. 数组存储:使用 unsigned char*,用于存储字节数组

    EEPROM函数理解#

  4. 在单片机中,任何变量在复位后都会回到最初定义时的变量值,所以为了不会因为复位、下电或重新烧录而损失一些想要保存的数据,可以把该变量值存入EEPROM中,这样数据就不会因为复位而重置数值,只有重新覆盖该EEPROM位置的数据,之前的数据才消失。

  5. EEPROM_Write(arr_input, 0, 5);此函数是指将arr_input数组的arr_input[0]、arr_input[1]、arr_input[2]、arr_input[3]、arr_input[4]的五个地址的数据分别写入EEPROM的五个地址中,传入参数的0表示是从EEPROM的地址0开始写入数据。

  6. EEPROM_Read(arr_output, 0, 5);此函数是指把EEPROM中从地址0开始的五个地址数据写入arr_output数组中,EEPROM地址0的数据存入arr_output[0]中,其它依次类推,通过这样来实现将EEPROM中的保存数据读出的操作。

    一般都是在main函数的while循环之前就把之前存入EEPROM中的数据读取出来。由于板子之前的EEPROM中已经存入数据,所以其它项目烧录的一开始读出的数据是之前存入的数据,不准确,不用在意,因为在4T评测上没有问题。

相关代码示例#

unsigned char arr_input[5]={1,2,3,4,5};
unsigned char arr_output[5];
EEPROM_Write(arr_input,0,5);
EEPROM_Read(arr_output,0,5);
// 单字节存储示例
unsigned char input = 5;
unsigned char output;
EEPROM_Write(&input,0,1);
EEPROM_Read(&output,0,1);
// 多字节存储示例
unsigned int input = 500;
unsigned int output;
unsigned char high,low;
EEPROM_Write(&input,0,2);
EEPROM_Read(&high,0,1);
EEPROM_Read(&low,1,1);
output = high<<8 | low;

二、EEPROM 加锁机制与 4T 测试规范#

  1. 问题背景

    • 初始状态不确定性:新板载 EEPROM 初始值为随机值(非全 255) 。在 4T 测试时提供两种 EEPROM:指定存储位置的预写入有效数据;未指定存储位置的全 255 初始化。

    • 数据污染风险:已写入数据的 EEPROM 无法自动清除,未加锁机制可能导致未知数据干扰系统初始化。

  2. 加锁机制设计

    • 核心原理:使用未用地址存储校验标记(Lock Byte),通过校验值判断 EEPROM 是否已初始化 。

    • 实现策略:unsigned char EEPROM_Lock = 5; // 校验标记值

    void Key_Proc()
    {
    Key_Val = Key_Read();
    Key_Down = Key_Val & (Key_Val ^ Key_Old);
    Key_Up = ~Key_Val & (Key_Val ^ Key_Old);
    Key_Old = Key_Val;
    switch (Key_Down)
    {
    case 12:
    AD_Para_10x = AD_Para_Ctrl_10x;
    EEPROM_Write(&AD_Para_10x, 0, 1); // 写入参数
    EEPROM_Write(&EEPROM_Lock, 8, 1); // 写入校验标记
    break;
    }
    }
  3. 启动校验流程

    void main()
    {
    unsigned char EEPROM_Temp;
    EEPROM_Read(&EEPROM_Temp, 8, 1); // 读取校验标记
    // 校验通过则加载存储参数
    if (EEPROM_Temp == EEPROM_Lock)
    {
    EEPROM_Read(&AD_Para_10x, 0, 1);
    }
    }

    4.4T 测试应用规范

    • 指定存储位置测试:EEPROM 预写入有效数据,无需加锁 。

    • 未指定存储位置测试:EEPROM 全 255 初始化,必须启用加锁 。

    5.操作准则

    • 上板验证阶段:必须启用加锁机制防止数据污染,校验地址应选择未使用的 EEPROM 空间 。

    • 提交题目阶段:根据 4T 测试类型动态调整加锁策略,指定存储位置测试需确保校验地址不冲突 。

三、EEPROM 连续读写注意事项#

  1. EEPROM 常通过 I2C 通信进行读写,I2C 时序要求严格,具体如下:

  2. 初始化顺序:必须在 EEPROM 上电读取操作完成后,再初始化定时器。否则定时器中断可能会破坏 I2C 的时序,导致读取失败。

【或者可以在代码前后加上(TRx = 0 和 TRx = 1 或者 EA = 0 和 EA = 1)来解除中断】

  1. 写入操作的可靠性:

    • 写入过程由单片机(主机)主动控制 。

    • 每个字节都有 ACK 应答确认机制 。

    • 包含足够的延时保护 。

    • 即使发生中断,也不会影响数据写入的正确性 。

  2. 读取操作的风险:

    • 读取时需要等待 EEPROM(从机)发送数据 。

    • I2C 通过采样 SDA 线上的电平来判断数据 。

    • 如果在采样过程中发生中断,可能导致数据读取错误 。

EEPROM 写入函数示例:

void EEPROM_Write(unsigned char *EEPROM_String, unsigned char addr, unsigned char num)
{
// 选择芯片为EEPROM,模式为写
I2CStart();
I2CSendByte(0xA0);
I2CWaitAck();
I2CSendByte(addr); // 写入的数据的地址
I2CWaitAck();
while (num--)
{
I2CSendByte(*EEPROM_String++);
I2CWaitAck();
I2C_Delay(200); // 单字节写入延时保护
}
I2CStop();
// 写入完成后的延时保护
I2C_Delay(255);
I2C_Delay(255);
I2C_Delay(255);
I2C_Delay(255);
I2C_Delay(255);
I2C_Delay(255);
}
void EEPROM_Read(unsigned char *EEPROM_String, unsignedchar addr, unsigned char num)
{
// 第一阶段: 设置读取地址
I2CStart();
I2CSendByte(0xA0); // EEPROM写模式
I2CWaitAck();
I2CSendByte(addr); // 设置起始地址
I2CWaitAck();
// 第二阶段: 读取数据
I2CStart();
I2CSendByte(0xA1); // EEPROM读模式
I2CWaitAck();
while (num--)
{
*EEPROM_String++ = I2CReceiveByte();
I2CSendAck(num? 0 : 1); // 最后一个字节发送NACK
}
I2CStop();
}
  • 四、EEPROM 常用考点

    1.数组存入和读取(第九届国赛题)

    //存储数据
    EEPROM_String[0] = (unsigned char)(Voltage * 10);
    EEPROM_String[1] = Freq >> 8;//储存高八位
    EEPROM_String[2] = Freq & 0x00FF;//储存低八位
    EEPROM_String[3] = (unsigned int)(Temperature * 100) >> 8;//储存温度整数部分
    EEPROM_String[4] = (unsigned int)(Temperature * 100) & 0x00FF;//储存温度小数部分
    EEPROM_Write(EEPROM_String,0,5);//将数据写入EEPROM中
    //读取数据
    EEPROM_Read(EEPROM_String,0,5);//将EEPROM内的数据读取出来
    Old_Data_String[0] = EEPROM_String[0];
    Old_Data_String[1] = EEPROM_String[1] << 8 | EEPROM_String[2];
    Old_Data_String[2] = EEPROM_String[3] << 8 | EEPROM_String[4];
EEPROM相关知识与应用
https://mizuki.mysqil.com/posts/蓝桥杯单片机/eeprom相关知识与应用/
作者
风过无痕
发布于
2025-11-03
许可协议
CC BY 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00