C51 COMPILER V9.54 MSP_EEPROM 09/06/2024 14:31:11 PAGE 1 C51 COMPILER V9.54, COMPILATION OF MODULE MSP_EEPROM OBJECT MODULE PLACED IN ..\out\msp_eeprom.obj COMPILER INVOKED BY: E:\KeilC51\C51\BIN\C51.EXE ..\source\msp\msp_eeprom.c LARGE OMF2 OPTIMIZE(0,SIZE) BROWSE ORDER NOIN -TPROMOTE INCDIR(..\source\bsp;..\source\msp;..\source\app;..\source\clib;..\source\cpu;..\source\ctask;..\source\tpc;..\ -source\asp;..\source\debug;..\source\msp\uart;..\source\msp\simiic;..\source\bsp\oled;..\source\bsp\TTSSbsp) DEBUG PRINT -(..\out\msp_eeprom.lst) TABS(2) OBJECT(..\out\msp_eeprom.obj) line level source 1 //////////////////////////////////////////////////////////////////////////// 2 ///@copyright Copyright (c) 2018, 传控科技 All rights reserved. 3 ///------------------------------------------------------------------------- 4 /// @file msp_eeprom.c 5 /// @brief msp @ driver config 6 ///------------------------------------------------------------------------- 7 /// @version 1.0 8 /// @author CC 9 /// @date 20190106 10 /// @note cc_AS_stc02 由stc-isp v6.0860 11 ////////////////////////////////////////////////////////////////////////////// 12 13 ///cc 2023/04/07--8:44:38 14 /* 15 EEPROM 的写操作只能将字节中的 1 写为 0,当需要将字节中的 0 写为 1,则必须执 -扇区 擦除操作。 16 EEPROM 的读/写操作是以 1 字节为单位进行,而 EEPROM 擦除操作是以 1 扇区(512 字 -) 为单位进行, 17 在执行擦除操作时,如果目标扇区中有需要保留的数据,则必须预先将这些数据 -取到 RAM 中暂存, 18 待擦除完成后再将保存的数据和需要更新的数据一起再写回 19 EEPROM Write operation can only write 1 in the byte as 0, when you need to write 0 in the byte as 1, 20 you must be sector erased. EEPROM Read / write operation is conducted in 1 byte, 21 while EEPROM, erasure operation is conducted in 1 sector (512 bytes). During the wipe operation, 22 if the data in the target sector, the data must be read in the RAM in advance, 23 and the saved data will be written back together with the data to be updated 24 25 fixme:注意时钟和flash 相关 同时关注掉电和容错 26 27 */ 28 29 #include "msp_eeprom.h" *** WARNING C320 IN LINE 51 OF ..\source\bsp\TTSSbsp\bsp_config.h: "MainFre_22M" 30 31 #include "debug_drv.h" 32 33 #if(TYPE_MCU == TYPE_MCU_STC_8A || TYPE_MCU == TYPE_MCU_STC_8F) xxx #define WT_30M 0x80 #define WT_24M 0x81 #define WT_20M 0x82 #define WT_12M 0x83 #define WT_6M 0x84 #define WT_3M 0x85 #define WT_2M 0x86 #define WT_1M 0x87 sdfasdfasdf void L0_Iap_Idle() { IAP_CONTR = 0; //关闭IAP功能 IAP_CMD = 0; //清除命令寄存器 C51 COMPILER V9.54 MSP_EEPROM 09/06/2024 14:31:11 PAGE 2 IAP_TRIG = 0; //清除触发寄存器 IAP_ADDRH = 0x80; //将地址设置到非IAP区域 IAP_ADDRL = 0; } char L0_Iap_Read(vU16 addr) { char dat; IAP_CONTR = WT_12M; //使能IAP IAP_CMD = 1; //设置IAP读命令 IAP_ADDRL = addr; //设置IAP低地址 IAP_ADDRH = addr >> 8; //设置IAP高地址 IAP_TRIG = 0x5a; //写触发命令(0x5a) IAP_TRIG = 0xa5; //写触发命令(0xa5) _nop_(); dat = IAP_DATA; //读IAP数据 L0_Iap_Idle(); //关闭IAP功能 return dat; } void L0_Iap_Program(vU16 addr, char dat) { IAP_CONTR = WT_12M; //使能IAP IAP_CMD = 2; //设置IAP写命令 IAP_ADDRL = addr; //设置IAP低地址 IAP_ADDRH = addr >> 8; //设置IAP高地址 IAP_DATA = dat; //写IAP数据 IAP_TRIG = 0x5a; //写触发命令(0x5a) IAP_TRIG = 0xa5; //写触发命令(0xa5) _nop_(); L0_Iap_Idle(); //关闭IAP功能 } ///每个扇区512字节 ///指定地址可以为当前扇区内的任意地址,都会完整擦除当前扇区 void L0_Iap_Erase(vU16 addr) { IAP_CONTR = WT_12M; //使能IAP IAP_CMD = 3; //设置IAP擦除命令 IAP_ADDRL = addr; //设置IAP低地址 IAP_ADDRH = addr >> 8; //设置IAP高地址 IAP_TRIG = 0x5a; //写触发命令(0x5a) IAP_TRIG = 0xa5; //写触发命令(0xa5) _nop_(); // L0_Iap_Idle(); //关闭IAP功能 } #elif (TYPE_MCU == TYPE_MCU_STC_8G || TYPE_MCU == TYPE_MCU_STC_8H) 99 void L0_Iap_Idle() 100 { 101 1 IAP_CONTR = 0; //关闭IAP功能 102 1 IAP_CMD = 0; //清除命令寄存器 103 1 IAP_TRIG = 0; //清除触发寄存器 104 1 IAP_ADDRH = 0x80; //将地址设置到非IAP区域 105 1 IAP_ADDRL = 0; 106 1 } 107 108 char L0_Iap_Read(vU16 addr) 109 { 110 1 char dat; C51 COMPILER V9.54 MSP_EEPROM 09/06/2024 14:31:11 PAGE 3 111 1 112 1 IAP_CONTR = 0x80; //使能IAP 113 1 IAP_TPS = 12; 114 1 IAP_CMD = 1; //设置IAP读命令 115 1 IAP_ADDRL = addr; //设置IAP低地址 116 1 IAP_ADDRH = addr >> 8; //设置IAP高地址 117 1 IAP_TRIG = 0x5a; //写触发命令(0x5a) 118 1 IAP_TRIG = 0xa5; //写触发命令(0xa5) 119 1 _nop_(); 120 1 dat = IAP_DATA; //读IAP数据 121 1 L0_Iap_Idle(); //关闭IAP功能 122 1 123 1 return dat; 124 1 } 125 126 void L0_Iap_Program(vU16 addr, char dat) 127 { 128 1 IAP_CONTR = 0x80; //使能IAP 129 1 IAP_TPS = 12; //设置擦除等待参数 12MHz 130 1 IAP_CMD = 2; //设置IAP写命令 131 1 IAP_ADDRL = addr; //设置IAP低地址 132 1 IAP_ADDRH = addr >> 8; //设置IAP高地址 133 1 IAP_DATA = dat; //写IAP数据 134 1 IAP_TRIG = 0x5a; //写触发命令(0x5a) 135 1 IAP_TRIG = 0xa5; //写触发命令(0xa5) 136 1 _nop_(); 137 1 L0_Iap_Idle(); //关闭IAP功能 138 1 } 139 140 ///每个扇区512字节 141 ///指定地址可以为当前扇区内的任意地址,都会完整擦除当前扇区 142 void L0_Iap_Erase(vU16 addr) 143 { 144 1 IAP_CONTR = 0x80; //使能IAP 145 1 IAP_TPS = 12; //设置擦除等待参数 12MHz 146 1 IAP_CMD = 3; //设置IAP擦除命令 147 1 IAP_ADDRL = addr; //设置IAP低地址 148 1 IAP_ADDRH = addr >> 8; //设置IAP高地址 149 1 IAP_TRIG = 0x5a; //写触发命令(0x5a) 150 1 IAP_TRIG = 0xa5; //写触发命令(0xa5) 151 1 _nop_(); // 152 1 L0_Iap_Idle(); //关闭IAP功能 153 1 } 154 #endif 155 156 157 void L0_Iap_Program_array(vU16 addr,U8 *buf,U8 len) 158 { 159 1 U8 i = 0; 160 1 L0_Iap_Erase(addr);/////fixme: 需要和addr配合好 一次就擦除512字节 161 1 for(i=0;icmd) 213 { 214 //Ae 03 03 04 00 215 //xx 03 R2 R3 xx 216 case 4: 217 L0_Iap_Erase(uf_ee_add.us); 218 break; 219 case 5: 220 L0_Iap_Program(uf_ee_add.us,p->R2); 221 break; 222 case 6: 223 L0_uart0_uc(L0_Iap_Read(uf_ee_add.us)); 224 break; 225 case 7:///选择地址 226 uf_ee_add.BYTE2.H = p->R2; //h 227 uf_ee_add.BYTE2.L = p->R3; //L 228 break; 229 default: 230 break; 231 }; 232 } 233 234 C51 COMPILER V9.54 MSP_EEPROM 09/06/2024 14:31:11 PAGE 5 235 ****************************************************/ 236 237 238 MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 390 ---- CONSTANT SIZE = ---- ---- XDATA SIZE = 22 ---- PDATA SIZE = ---- ---- DATA SIZE = ---- ---- IDATA SIZE = ---- ---- BIT SIZE = ---- ---- EDATA SIZE = ---- ---- HDATA SIZE = ---- ---- XDATA CONST SIZE = ---- ---- FAR CONST SIZE = ---- ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)