EEPROM 基础知识
先上逐飞例程
#include "headfile.h"
uint8 write_buff[] = {0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38};
uint8 read_buff[8];
void main()
{
board_init(); // 初始化寄存器,勿删除此句代码。
// 使用之前务必查看 ..\Example\11-EEPROM Demo\MDK文件夹下面的【必看】STC-ISP设置.png
// 使用之前务必查看 ..\Example\11-EEPROM Demo\MDK文件夹下面的【必看】STC-ISP设置.png
// 使用之前务必查看 ..\Example\11-EEPROM Demo\MDK文件夹下面的【必看】STC-ISP设置.png
iap_init(); // 初始化EEPROM
// 如果要写入的地址里面有数据。就需要先擦除再写入。
// 擦除地址0所在的扇区数据,一共512个字节
iap_erase_page(0);
// 将write_buff这个数组写入到EEPROM中,地址(0x00-0x07),共8个数据
iap_write_bytes(0x00, write_buff, 8);
// 将EEPROM中的内容读取到read_str字符串中,地址(0x00-0x07),共8个字符
iap_read_bytes(0x00, read_buff, 8);
while(1)
{
// 串口发送读取到的数据
// 使用文本模式,串口助手显示的数据为:12345678
// 使用HEX模式,串口助手显示的数据为:0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38
uart_putbuff(UART_1, read_buff, 8);
delay_ms(500);
}
}
初始化函数
iap_init(); //没什么说的
清除内存函数
iap_erase_page(0);
//-------------------------------------------------------------------------------------------------------------------
// @brief EEPROM擦除目标地址所在的一页(1扇区/512字节)
// @param addr 需要写的eeprom地址
// @return void
// Sample usage: iap_erase_page(0x20);
// 擦除0x00-0x200的数据
//-------------------------------------------------------------------------------------------------------------------
void iap_erase_page(uint32 addr)
{IAP_CMD = 3; //设置 IAP 擦除命令
IAP_ADDRL = addr; //设置 IAP 低地址
IAP_ADDRH = addr >> 8; //设置 IAP 高地址
IAP_ADDRE = addr >> 16; //设置 IAP 最高地址
eeprom_trig();
delay_ms(10); //擦除1扇区(512字节):约4-6ms
}
写入内存函数
iap_write_bytes(0x00, write_buff, 8);
//-------------------------------------------------------------------------------------------------------------------
// @brief EEPROM写多个字节
// @param addr 需要写的eeprom地址
// @param *buf 需要写的数据地址
// @param len 需要写的数据长度
// @return void
// Sample usage: iap_write_bytes(0x00,(uint8 *)"0123456789",10);
// 将"0123456789"写入0x00-0x0A地址中;
//-------------------------------------------------------------------------------------------------------------------
void iap_write_bytes(uint32 addr, uint8 *buf, uint16 len)
{IAP_CMD = 2; //设置 IAP 读命令
while(len--)
{
IAP_ADDRE = 0;
IAP_ADDRL = addr; //设置 IAP 低地址
IAP_ADDRH = addr >> 8; //设置 IAP 高地址
IAP_ADDRE = addr >> 16; //设置 IAP 最高地址
IAP_DATA = *buf++; //写 IAP 数据
addr++;eeprom_trig();
}
}
读取内存函数
iap_read_bytes(0x00, read_buff, 8);
//-------------------------------------------------------------------------------------------------------------------
// @brief EEPROM读取多个字节
// @param addr 需要读取的eeprom地址
// @param *buf 需要读取的数据地址
// @param len 需要读取的数据长度
// @return void
// Sample usage: uint8 str[10];
// iap_read_bytes(0x00,str,10);
// 将0x00-0x0A地址中的数据,读取到str中。
//-------------------------------------------------------------------------------------------------------------------
void iap_read_bytes(uint32 addr, uint8 *buf, uint16 len)
{
IAP_CMD = 1; //设置 IAP 读命令while(len--)
{
IAP_ADDRE = 0;
IAP_ADDRL = addr; //设置 IAP 低地址
IAP_ADDRH = addr >> 8; //设置 IAP 高地址
IAP_ADDRE = addr >> 16; //设置 IAP 最高地址
eeprom_trig();
*buf++ = IAP_DATA; //读 IAP 数据
addr++;
}
}
在按键调参中的应用
通过上面的例程我们可以知道eeprom可以方便地存储和读取一串串的uint8变量,但是实际上我们平时所使用的、以及我们所需要储存的,大多数并不是uint8变量,而是float、int乃至自己写的结构体等等更加复杂、大小更大的变量,那么这时候该如何利用eeprom来存储这些更加复杂的变量呢?
这就需要用到我们强大的指针、强转和sizeof()大杀器啦,看个下面的例子:
float temp = 1;
float result = 37;iap_erase_page(0);
iap_write_bytes(0x00, (uint8*)&temp, sizeof(temp));
iap_read_bytes(0x00, (uint8*)&result, sizeof(result));printf("%f,%f\n",temp,result);
此时一通操作,你会发现到最后printf的时候,float类型的变量——result的值已然由原先的"37"变为了"1"。
想必看懂了这个的你,写起心仪的按键调参来一定毫不费劲吧,lz就说到这儿啦。