目录
数据读写
数据存储
在调参(如PID)我们需要把参数保存下来,即使关电也能保存,并且需要的时候能够读取。
这就需要数据存储模块。
TC264自带FLASH,
STC32G自带eeprom,
逐飞已经写好了相应的库,因此读写函数方面直接调用即可。
如果你用的是这两块板子,直接转到下面的数据存储方面的讲解
我当时用的是STC16F,不自带eeprom,所以硬件画了个AT24C02模块,数据的读写用的IIC通信。逐飞写了AT24C02的库。
AT24C02详解(蓝桥杯单片机模块(IIC总线))__WILLPOWER_的博客-CSDN博客_at24c02
AT24C02 E2PROM芯片详解_Z小旋的博客-CSDN博客_at24c02
下面简单讲一下怎么用,当然这都需要自己去研究
设备地址:
设备需要一个8位的设备地址字,后面跟着一个启动条件,以使芯片能够进行读或写操作
设备地址字由一个强制的1,0序列的前四个最有效的位,如所示。这是所有EEPROM设备的共同特点。
接下来的3位是1K/2K EEPROM的A2、A1和AO设备地址位。这3位必须与相应的硬接线输入引脚相比较。
最后一位为0表示写。最后一位为1表示读
前4位已经固定了,是1010换成BCD码就是A
举个例子,假设,我A2,A1,A0都接地 即;A2 = 0 A1 = 0 A0 = 0
那么写地址就是1010 0000 也就是0xA0
假设,我A2,A1,A0都接了高电平 即;A2 = 1 A1 =1 A0 = 1
那么写地址就是1010 1110 也就是0xAE
这是24C02硬件手册的一个图
//AT24C02模块支持256个8位数据存储 //该模块使用的是IIC总线控制 #define AT24C02_DEV_ADDR 0xA0>>1 //IIC写入时的地址字节数据,+1为读取 //AT24C02的地址是可变地址当A0 = 0 A1 = 0 A2 = 0的时候, //设备地址位A0,如果需要修改设备地址,请查看AT24C02手册进行修改
然后我们看SEEKFREE_AT24C02.c文件
uint8 at24c02_read_byte(uint8 byte_reg)
{
delay_ms(6);
return simiic_read_reg(AT24C02_DEV_ADDR, byte_reg, SIMIIC);
}
发现用的是模拟IIC,
因此我们就需要到SEEKFREE_IIC.h文件中去找/修改 模拟IIC的SCL与SDA引脚
#define SIMIIC_SCL_PIN P32
#define SIMIIC_SDA_PIN P33
当然也可以参照这个库,改成硬件IIC
这些做完就可以调用AT24c02的读取与写入了
void at24c02_write_byte(uint8 byte_reg, uint8 dat);
uint8 at24c02_read_byte(uint8 byte_reg);
void at24c02_write_bytes(uint8 byte_reg, uint8 *dat_add, uint8 num);
void at24c02_read_bytes(uint8 byte_reg, uint8 *dat_add, uint8 num);
有了上面的函数,我们就可以进行寄存器的读写
这是我代码的思路
/****************************************** 参数写入 ******************************************/
uint8 FlashParamsWrite(void)
{
uint8 i;//第几个数据
uint8 cnt_i = 0;//地址的第几位
uint8 cnt_f = 0;//地址的第几位
//显示界面
ips114_clear(BLUE);
IPS114_PENCOLOR = RED;
ips114_showstr(0,3,"Start Write Params !");
delay_ms(10);
//读取参数 (赋值)
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
integnow[0]=Integ_data0;
integnow[1]=Integ_data1;
integnow[2]=Integ_data2;
integnow[3]=Integ_data3;
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
uint8dat[0]=uint8_data0;
uint8dat[1]=uint8_data1;
uint8dat[2]=uint8_data2;
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
//拆分字节准备写入参数
for(i=0;i
/****************************************** 参数读取 ******************************************/
uint8 FlashParamsRead(void)
{
uint8 i;
//读整数--
at24c02_read_bytes(integReg, integdat,2*Integ_Num);
//合并字节准备写入参数
for(i=0;i