EEPROM.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. /***********************************************************************************************************
  2. 显示效果:
  3. 用户通过仿真,能够对EEPROM的特定区域地址内容进行读写操作,并验证数据操作正确与否。
  4. eeprom写数据
  5. 连续写字节不能太多
  6. 写单个字节的时间根据写的内容的前后不同,时间不等。 以及电源电压相关
  7. 理论上随着写的次数增加,写的时间会相应增加,建议以单个字节1ms-2ms的时间为基准
  8. ***********************************************************************************************************/
  9. #include <REGtenxTM52F1386.h>
  10. #include "TM52F1386_bsp.h"
  11. #include <intrins.h>
  12. #include "EEPROM.h"
  13. #define IAPTE_0P8_MS AUX2=(AUX2&0xf9)|0x02
  14. #define IAPTE_3P2_MS AUX2=(AUX2&0xf9)|0x04
  15. #define IAPTE_6P4_MS AUX2=(AUX2&0xf9)|0x06
  16. #define IAPTE_DISABLE AUX2=(AUX2&0xf9)
  17. // 设置最大20字节存参数
  18. unsigned char xdata eeprom_address_write[30] _at_ 0XDC00; //eeprom指定地址,第一页用于状态数据+参数配置
  19. unsigned char code eeprom_address_read[30] _at_ 0XDC00; //eeprom指定地址
  20. // 设置最大20字节存参数
  21. unsigned char xdata eeprom_address_write_backup[30] _at_ 0XDE00; //eeprom指定地址,第二页,参数配置备份区,第一页读取失败从第二页读取参数备份
  22. unsigned char code eeprom_address_read_backup[30] _at_ 0XDE00; //eeprom指定地址
  23. /*
  24. 参数数据(10,实际从1开始,0字节保留):0-9:开机状态(通电勿扰)全局设置1字节-1,三个继电器开机状态3个字节-2-3-4,背光等级1个字节-5 , 开关、场景设置-6-7-8,人感1字节-9
  25. 实时数据(6):10:19:当前继电器状态3个字节-10-11-12,雷达状态1字节-13,点动倒计时未结束1个字节-15-16-17,ota状态1字节-19(最后一字节)
  26. 点动开关参数(9):,点动开关2个字节(使能1,时间2)-20-21-22,-23-24-25,-26-27-28
  27. */
  28. unsigned char write_mileage[30];//0:人感开关,1:开机状态全局开关,2:按键1默认状态,3:按键2默认状态,4:按键3默认状态
  29. unsigned char read_mileage[30];
  30. unsigned char write_mileage_backup[30];//0:人感开关,1:开机状态全局开关,2:按键1默认状态,3:按键2默认状态,4:按键3默认状态
  31. unsigned char read_mileage_backup[30];
  32. //unsigned char II=0;
  33. /**********************************************************************************************************
  34. ** 函数名称: iap_eeprom_write
  35. ** 函数描述: iap_EEPROM写数据配置函数
  36. ** 输入参数: addr:存储地址,范围0~127
  37. buf:数据的首地址
  38. len:数据长度(addr+len不要超过128)
  39. ** 输出参数: 无
  40. **********************************************************************************************************/
  41. void iap_eeprom_write(unsigned char addr, unsigned char *buf, unsigned char len)
  42. {
  43. unsigned char i=0,temp_ea=0,temp_lvrpd=0;
  44. temp_ea = EA;
  45. EA = 0;
  46. temp_lvrpd = LVRCON & 0x10; // LVR的状态位
  47. LVRCON = (LVRCON &~ 0x10) | (1 << 4); //关闭LVR功能
  48. IAPWE_SFR=0XE2; //使能iap
  49. IAPWE_SFR=0XBA; //使能iap
  50. eeprom_address_write[0] = 0x00;//是所在页的整页都擦除
  51. bsp_delay_ms(5);
  52. IAPWE_SFR=0XE2; //使能iap
  53. IAPWE_SFR=0X4C; //使能iap
  54. for(i = 0; i<len; i++) {
  55. IAPTE_6P4_MS; //设置IAP看门狗复位时间
  56. eeprom_address_write[addr + i] = *buf;//
  57. buf++;
  58. }
  59. LVRCON = (LVRCON &~ 0x10) | (temp_lvrpd << 4); //还原LVR
  60. IAPWE_SFR = 0x00; //关闭IAP
  61. IAPTE_DISABLE;
  62. EA = temp_ea;
  63. }
  64. /**********************************************************************************************************
  65. ** 函数名称: iap_eeprom_write_backup
  66. ** 函数描述: iap_EEPROM写数据配置函数
  67. ** 输入参数: addr:存储地址,范围0~127
  68. buf:数据的首地址
  69. len:数据长度(addr+len不要超过128)
  70. ** 输出参数: 无
  71. **********************************************************************************************************/
  72. void iap_eeprom_write_backup(unsigned char addr, unsigned char *buf, unsigned char len)
  73. {
  74. unsigned char i=0,temp_ea=0,temp_lvrpd=0;
  75. temp_ea = EA;
  76. EA = 0;
  77. temp_lvrpd = LVRCON & 0x10; // LVR的状态位
  78. LVRCON = (LVRCON &~ 0x10) | (1 << 4); //关闭LVR功能
  79. IAPWE_SFR=0XE2; //使能iap
  80. IAPWE_SFR=0XBA; //使能iap
  81. eeprom_address_write_backup[0] = 0x00;//是所在页的整页都擦除
  82. bsp_delay_ms(5);
  83. IAPWE_SFR=0XE2; //使能iap
  84. IAPWE_SFR=0X4C; //使能iap
  85. for(i = 0; i<len; i++) {
  86. IAPTE_6P4_MS; //设置IAP看门狗复位时间
  87. eeprom_address_write_backup[addr + i] = *buf;//
  88. buf++;
  89. }
  90. LVRCON = (LVRCON &~ 0x10) | (temp_lvrpd << 4); //还原LVR
  91. IAPWE_SFR = 0x00; //关闭IAP
  92. IAPTE_DISABLE;
  93. EA = temp_ea;
  94. }
  95. /**********************************************************************************************************
  96. ** 函数名称: iap_eeprom_read
  97. ** 函数描述: iap_EEPROM读数据配置函数
  98. ** 输入参数: addr:存储地址,范围0~127
  99. buf:数据的首地址
  100. len:数据长度(addr+len不要超过128)
  101. ** 输出参数: 无
  102. **********************************************************************************************************/
  103. void iap_eeprom_read(unsigned char addr, unsigned char *buf, unsigned char len) //eeprom读
  104. {
  105. unsigned char i=0,temp_ea=0,temp_lvrpd=0;
  106. temp_ea = EA;
  107. EA = 0;
  108. for(i = 0;i<len;i++) {
  109. *buf = eeprom_address_read[addr+i];
  110. buf++;
  111. }
  112. EA = temp_ea;
  113. }
  114. /**********************************************************************************************************
  115. ** 函数名称: iap_eeprom_read_backup
  116. ** 函数描述: iap_EEPROM读数据配置函数
  117. ** 输入参数: addr:存储地址,范围0~127
  118. buf:数据的首地址
  119. len:数据长度(addr+len不要超过128)
  120. ** 输出参数: 无
  121. **********************************************************************************************************/
  122. void iap_eeprom_read_backup(unsigned char addr, unsigned char *buf, unsigned char len) //eeprom读
  123. {
  124. unsigned char i=0,temp_ea=0,temp_lvrpd=0;
  125. temp_ea = EA;
  126. EA = 0;
  127. for(i = 0;i<len;i++) {
  128. *buf = eeprom_address_read_backup[addr+i];
  129. buf++;
  130. }
  131. EA = temp_ea;
  132. }
  133. /*
  134. void test(void)
  135. {
  136. bsp_clock_init(); // 系统快钟18.432 div 2 = 9.216Mhz
  137. gpio_init();
  138. write_mileage[0] = 0x22;
  139. write_mileage[1] = 0x33;
  140. write_mileage[2] = 0x44;
  141. write_mileage[3] = 0x55;
  142. iap_eeprom_write(0,write_mileage,4); //写四个字节(0x22 0x33 0x44 0x55)
  143. bsp_delay_ms(50);
  144. read_mileage[0] = 0;
  145. read_mileage[1] = 0;
  146. read_mileage[2] = 0;
  147. read_mileage[3] = 0;
  148. iap_eeprom_read(0,read_mileage,4); //读四个字节与之前写的四个字节是否一致(0x22 0x33 0x44 0x55)
  149. write_mileage[0] = 0x66;
  150. write_mileage[1] = 0x77;
  151. write_mileage[2] = 0x88;
  152. write_mileage[3] = 0x99;
  153. iap_eeprom_write(0,write_mileage,4); //写四个字节(0x66 0x77 0x88 0x99)
  154. bsp_delay_ms(50);
  155. read_mileage[0] = 0;
  156. read_mileage[1] = 0;
  157. read_mileage[2] = 0;
  158. read_mileage[3] = 0;
  159. iap_eeprom_read(0,read_mileage,4); //读四个字节与之前写的四个字节是否一致(0x66 0x77 0x88 0x99)
  160. while(1)
  161. {
  162. if (0x66 == read_mileage[0]) {
  163. LED1 = 0;
  164. }
  165. else {
  166. LED1 = 1;
  167. }
  168. }
  169. }*/