123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- /***********************************************************************************************************
- 显示效果:
- 用户通过仿真,能够对EEPROM的特定区域地址内容进行读写操作,并验证数据操作正确与否。
- eeprom写数据
- 连续写字节不能太多
- 写单个字节的时间根据写的内容的前后不同,时间不等。 以及电源电压相关
- 理论上随着写的次数增加,写的时间会相应增加,建议以单个字节1ms-2ms的时间为基准
- ***********************************************************************************************************/
- #include <REGtenxTM52F1386.h>
- #include "TM52F1386_bsp.h"
- #include <intrins.h>
- #include "EEPROM.h"
- #define IAPTE_0P8_MS AUX2=(AUX2&0xf9)|0x02
- #define IAPTE_3P2_MS AUX2=(AUX2&0xf9)|0x04
- #define IAPTE_6P4_MS AUX2=(AUX2&0xf9)|0x06
- #define IAPTE_DISABLE AUX2=(AUX2&0xf9)
- // 设置最大20字节存参数
- unsigned char xdata eeprom_address_write[30] _at_ 0XDC00; //eeprom指定地址,第一页用于状态数据+参数配置
- unsigned char code eeprom_address_read[30] _at_ 0XDC00; //eeprom指定地址
- // 设置最大20字节存参数
- unsigned char xdata eeprom_address_write_backup[30] _at_ 0XDE00; //eeprom指定地址,第二页,参数配置备份区,第一页读取失败从第二页读取参数备份
- unsigned char code eeprom_address_read_backup[30] _at_ 0XDE00; //eeprom指定地址
- /*
- 参数数据(10,实际从1开始,0字节保留):0-9:开机状态(通电勿扰)全局设置1字节-1,三个继电器开机状态3个字节-2-3-4,背光等级1个字节-5 , 开关、场景设置-6-7-8,人感1字节-9
- 实时数据(6):10:19:当前继电器状态3个字节-10-11-12,雷达状态1字节-13,点动倒计时未结束1个字节-15-16-17,ota状态1字节-19(最后一字节)
- 点动开关参数(9):,点动开关2个字节(使能1,时间2)-20-21-22,-23-24-25,-26-27-28
- */
- unsigned char write_mileage[30];//0:人感开关,1:开机状态全局开关,2:按键1默认状态,3:按键2默认状态,4:按键3默认状态
- unsigned char read_mileage[30];
- unsigned char write_mileage_backup[30];//0:人感开关,1:开机状态全局开关,2:按键1默认状态,3:按键2默认状态,4:按键3默认状态
- unsigned char read_mileage_backup[30];
- //unsigned char II=0;
- /**********************************************************************************************************
- ** 函数名称: iap_eeprom_write
- ** 函数描述: iap_EEPROM写数据配置函数
- ** 输入参数: addr:存储地址,范围0~127
- buf:数据的首地址
- len:数据长度(addr+len不要超过128)
- ** 输出参数: 无
- **********************************************************************************************************/
- void iap_eeprom_write(unsigned char addr, unsigned char *buf, unsigned char len)
- {
- unsigned char i=0,temp_ea=0,temp_lvrpd=0;
- temp_ea = EA;
- EA = 0;
- temp_lvrpd = LVRCON & 0x10; // LVR的状态位
- LVRCON = (LVRCON &~ 0x10) | (1 << 4); //关闭LVR功能
- IAPWE_SFR=0XE2; //使能iap
- IAPWE_SFR=0XBA; //使能iap
- eeprom_address_write[0] = 0x00;//是所在页的整页都擦除
- bsp_delay_ms(5);
-
- IAPWE_SFR=0XE2; //使能iap
- IAPWE_SFR=0X4C; //使能iap
-
- for(i = 0; i<len; i++) {
- IAPTE_6P4_MS; //设置IAP看门狗复位时间
- eeprom_address_write[addr + i] = *buf;//
- buf++;
- }
-
- LVRCON = (LVRCON &~ 0x10) | (temp_lvrpd << 4); //还原LVR
- IAPWE_SFR = 0x00; //关闭IAP
- IAPTE_DISABLE;
- EA = temp_ea;
- }
- /**********************************************************************************************************
- ** 函数名称: iap_eeprom_write_backup
- ** 函数描述: iap_EEPROM写数据配置函数
- ** 输入参数: addr:存储地址,范围0~127
- buf:数据的首地址
- len:数据长度(addr+len不要超过128)
- ** 输出参数: 无
- **********************************************************************************************************/
- void iap_eeprom_write_backup(unsigned char addr, unsigned char *buf, unsigned char len)
- {
- unsigned char i=0,temp_ea=0,temp_lvrpd=0;
- temp_ea = EA;
- EA = 0;
- temp_lvrpd = LVRCON & 0x10; // LVR的状态位
- LVRCON = (LVRCON &~ 0x10) | (1 << 4); //关闭LVR功能
- IAPWE_SFR=0XE2; //使能iap
- IAPWE_SFR=0XBA; //使能iap
- eeprom_address_write_backup[0] = 0x00;//是所在页的整页都擦除
- bsp_delay_ms(5);
-
- IAPWE_SFR=0XE2; //使能iap
- IAPWE_SFR=0X4C; //使能iap
-
- for(i = 0; i<len; i++) {
- IAPTE_6P4_MS; //设置IAP看门狗复位时间
- eeprom_address_write_backup[addr + i] = *buf;//
- buf++;
- }
-
- LVRCON = (LVRCON &~ 0x10) | (temp_lvrpd << 4); //还原LVR
- IAPWE_SFR = 0x00; //关闭IAP
- IAPTE_DISABLE;
- EA = temp_ea;
- }
- /**********************************************************************************************************
- ** 函数名称: iap_eeprom_read
- ** 函数描述: iap_EEPROM读数据配置函数
- ** 输入参数: addr:存储地址,范围0~127
- buf:数据的首地址
- len:数据长度(addr+len不要超过128)
- ** 输出参数: 无
- **********************************************************************************************************/
- void iap_eeprom_read(unsigned char addr, unsigned char *buf, unsigned char len) //eeprom读
- {
- unsigned char i=0,temp_ea=0,temp_lvrpd=0;
-
- temp_ea = EA;
- EA = 0;
- for(i = 0;i<len;i++) {
- *buf = eeprom_address_read[addr+i];
- buf++;
- }
- EA = temp_ea;
- }
- /**********************************************************************************************************
- ** 函数名称: iap_eeprom_read_backup
- ** 函数描述: iap_EEPROM读数据配置函数
- ** 输入参数: addr:存储地址,范围0~127
- buf:数据的首地址
- len:数据长度(addr+len不要超过128)
- ** 输出参数: 无
- **********************************************************************************************************/
- void iap_eeprom_read_backup(unsigned char addr, unsigned char *buf, unsigned char len) //eeprom读
- {
- unsigned char i=0,temp_ea=0,temp_lvrpd=0;
-
- temp_ea = EA;
- EA = 0;
- for(i = 0;i<len;i++) {
- *buf = eeprom_address_read_backup[addr+i];
- buf++;
- }
- EA = temp_ea;
- }
- /*
- void test(void)
- {
-
- bsp_clock_init(); // 系统快钟18.432 div 2 = 9.216Mhz
- gpio_init();
- write_mileage[0] = 0x22;
- write_mileage[1] = 0x33;
- write_mileage[2] = 0x44;
- write_mileage[3] = 0x55;
- iap_eeprom_write(0,write_mileage,4); //写四个字节(0x22 0x33 0x44 0x55)
- bsp_delay_ms(50);
- read_mileage[0] = 0;
- read_mileage[1] = 0;
- read_mileage[2] = 0;
- read_mileage[3] = 0;
- iap_eeprom_read(0,read_mileage,4); //读四个字节与之前写的四个字节是否一致(0x22 0x33 0x44 0x55)
-
- write_mileage[0] = 0x66;
- write_mileage[1] = 0x77;
- write_mileage[2] = 0x88;
- write_mileage[3] = 0x99;
- iap_eeprom_write(0,write_mileage,4); //写四个字节(0x66 0x77 0x88 0x99)
- bsp_delay_ms(50);
- read_mileage[0] = 0;
- read_mileage[1] = 0;
- read_mileage[2] = 0;
- read_mileage[3] = 0;
- iap_eeprom_read(0,read_mileage,4); //读四个字节与之前写的四个字节是否一致(0x66 0x77 0x88 0x99)
- while(1)
- {
- if (0x66 == read_mileage[0]) {
- LED1 = 0;
- }
- else {
- LED1 = 1;
- }
- }
- }*/
|