蓝桥杯嵌入式(G431RBT6): EEPROM进阶学习_蓝桥杯嵌入式eeprom-CSDN博客
在拜读了大佬⬆的文章后醍醐灌顶,遂总结了一些考试大概率会用到的套路
一开始肯定是常规的 读 写 EEPROM函数:
void Write_24C02(uint8_t Send_Buff[],uint8_t Send_Addr,uint16_t num)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(Send_Addr); //想要写入的地址
I2CWaitAck();
while(num--) //传输多少字节的数据
{
I2CSendByte(*Send_Buff++); //想要写入的数据
I2CWaitAck();
}
I2CStop();
}
void Read_24C02(uint8_t Read_Buff[],uint8_t Read_Addr,uint16_t num)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(Read_Addr); //想要读的地址
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
while(num--) //接收多少字节的数据
{
*Read_Buff++ = I2CReceiveByte();
if(num==0)
{
I2CSendNotAck();
}else{
I2CSendAck();
}
}
I2CStop();
}
然后就是针对不同场景下对读写函数的使用
!重点!:无论是什么数据类型,写法都是一样的!只要注意对应数据类型的字节数产生的地址偏移即可
场景一:读写单个变量
double num1=3.1415926;
EEPROM_Write(0x00,(uint8_t *)&num1,sizeof num1);//写入
HAL_Delaly(10);
EEPROM_Read(0x00,(uint8_t *)&num,sizeof num);//读取
场景二:读写数组
这里采用按页读写,会很方便,只需给出每页的首地址即可;但要注意每页只有8个字节
数组不足八字节的情况,直接将数组名丢进去:
uint8_t array[6]={1,2,3,4,5,6}; // 1B*6=6字节<8字节
EEPROM_Write(0x00,array,sizeof array);//写
HAL_Delay(10);
EEPROM_Read(0x00,array,sizeof array);//读
HAL_Delay(10);
数组大于八字节的情况,要分段读写:
float Apple[3]={1.1,2.2,3.3}; // 4B*3=12字节
//写
Write_24C02((uint8_t *)Apple,0x00,8); //先写前8个字节
HAL_Delay(2);
Write_24C02((uint8_t *)Apple+8,0x08,4); //再将后面4个字节写入
HAL_Delay(2);
//读 和写一样的逻辑
Read_24C02((uint8_t *)Apple,0x00,8);
Read_24C02((uint8_t *)Apple+8,0x08,4);
常见的基本数据类型的大小
类型 | 字节大小 |
---|---|
char | 1 |
short | 2 |
int | 4 |
long | 4 |
float | 4 |
double | 8 |