📄 stc89c58rd+ flash-isp-iap.lst
字号:
C51 COMPILER V8.08 STC89C58RD__FLASH_ISP_IAP 05/13/2008 23:42:02 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE STC89C58RD__FLASH_ISP_IAP
OBJECT MODULE PLACED IN STC89C58RD+ FLASH-ISP-IAP.OBJ
COMPILER INVOKED BY: f:\Keil\C51\BIN\C51.EXE STC89C58RD+ FLASH-ISP-IAP.c LARGE BROWSE DEBUG OBJECTEXTEND
line level source
1 /* --- STC International Limited ---------------- */
2 /* --- 宏晶科技 姚永平 设计 2004/9/11 V1.0 --- */
3 /* --- 宏晶科技 姚永平 设计 2004/12/4 V2.0 --- */
4 /* --- RD+/RC系列 Flash IAP/ISP Operation ----- */
5 /* --- STC89C54RD+, STC89C58RD+, --- */
6 /* --- STC89LE54RD+,STC89LE58RD+, -- */
7 /* --- STC89C51RC, STC89C52RC, ----- */
8 /* --- STC89LE51RC, STC89LE52RC, ---- */
9 /* --- Mobile: 13922805190 ---------------------- */
10 /* --- Fax: 0755-82944243 ----------------------- */
11 /* --- Tel: 0755-82908285 ----------------------- */
12 /* --- Web : www.mcu-memory.com ---------------- */
13 /* --- 感谢网友2004/12/3的指正,送样品以示感谢 --- */
14 #include <reg52.h>
15 #include <intrins.h> /* use _nop_() function */
16 #include "STC89C58RD+ FLASH-ISP-IAP.H"
17 //sfr16 DPTR = 0x82;
18
19 /* 新增特殊功能寄存器定义 */
20 sfr ISP_DATA = 0xe2;
21 sfr ISP_ADDRH = 0xe3;
22 sfr ISP_ADDRL = 0xe4;
23 sfr ISP_CMD = 0xe5;
24 sfr ISP_TRIG = 0xe6;
25 sfr ISP_CONTR = 0xe7;
26
27
28 /* 定义命令 */
29 #define READ_AP_and_Data_Memory_Command 0x01 /* 字节读数据存储区 */
30 #define PROGRAM_AP_and_Data_Memory_Command 0x02 /* 字节编程数据存储区 */
31 #define SECTOR_ERASE_AP_and_Data_Memory_Command 0x03 /* 扇区擦除数据存储区 */
32
33 #define DELAY_CONST 60000
34
35 /* 定义常量 */
36 #define ERROR 0
37 #define OK 1
38
39 sbit Begin_LED = P1^0;
40 sbit ERROR_LED = P1^3;
41 sbit OK_LED = P1^7;
42
43 /* 定义Flash 操作等待时间 */
44 //#define MCU_CLOCK_40MHz
45 #define MCU_CLOCK_20MHz
46 //#define MCU_CLOCK_10MHz
47 //#define MCU_CLOCK_5MHz
48 #ifdef MCU_CLOCK_40MHz
#define WAIT_TIME 0x00
#endif
51 #ifdef MCU_CLOCK_20MHz
52 #define WAIT_TIME 0x01
53 #endif
54 #ifdef MCU_CLOCK_10MHz
#define WAIT_TIME 0x02
C51 COMPILER V8.08 STC89C58RD__FLASH_ISP_IAP 05/13/2008 23:42:02 PAGE 2
#endif
57 #ifdef MCU_CLOCK_5MHz
#define WAIT_TIME 0x03
#endif
60
61 /* 调试控制项 */
62 //#define DEBUG_STC89C_LE58RD+
63
64 #define DEBUG_STC89C_LE52RC
65
66 //#define USED_BYTE_QTY_IN_ONE_SECTOR 1
67 //#define USED_BYTE_QTY_IN_ONE_SECTOR 2
68 //#define USED_BYTE_QTY_IN_ONE_SECTOR 4
69 //#define USED_BYTE_QTY_IN_ONE_SECTOR 8
70 //#define USED_BYTE_QTY_IN_ONE_SECTOR 16
71 //#define USED_BYTE_QTY_IN_ONE_SECTOR 32
72 //#define USED_BYTE_QTY_IN_ONE_SECTOR 64
73 #define USED_BYTE_QTY_IN_ONE_SECTOR 128
74 //#define USED_BYTE_QTY_IN_ONE_SECTOR 256
75 //#define USED_BYTE_QTY_IN_ONE_SECTOR 512
76
77 INT8U xdata protect_buffer[USED_BYTE_QTY_IN_ONE_SECTOR];
78
79 #ifdef DEBUG_STC89C_LE58RD+ //STC89C58RD+, 89LE58RD+
*** WARNING C323 IN LINE 79 OF STC89C58RD+ FLASH-ISP-IAP.c: newline expected, extra characters found
#define DEBUG_AP_Memory_Begin_Sector_addr 0x0000
#define DEBUG_AP_Memory_End_Sector_addr 0x7e00
#define DEBUG_AP_Memory_End_Byte_addr 0x7fff
#define DEBUG_Data_Memory_Begin_Sector_addr 0x8000
#endif
86 #ifdef DEBUG_STC89C_LE52RC //STC89C52RC, 89LE52RC
87 #define DEBUG_AP_Memory_Begin_Sector_addr 0x0000
88 #define DEBUG_AP_Memory_End_Sector_addr 0x1e00
89 #define DEBUG_AP_Memory_End_Byte_addr 0x1fff
90
91 #define DEBUG_Data_Memory_Begin_Sector_addr 0x2000
92 #endif
93
94
95 /* 打开 ISP,IAP 功能 */
96 void ISP_IAP_enable(void)
97 {
98 1 EA = 0; /* 关中断 */
99 1 ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */
100 1 ISP_CONTR = ISP_CONTR | WAIT_TIME;
101 1 ISP_CONTR = ISP_CONTR | 0x80; /* 1000,0000 */
102 1 }
103
104 /* 关闭 ISP,IAP 功能 */
105 void ISP_IAP_disable(void)
106 {
107 1 ISP_CONTR = ISP_CONTR & 0x7f; /* 0111,1111 */
108 1 ISP_TRIG = 0x00;
109 1 EA = 1; /* 开中断 */
110 1 }
111
112 /* 字节读 */
113 INT8U byte_read(INT16U byte_addr)
114 {
115 1 ISP_ADDRH = (INT8U)(byte_addr >> 8);
116 1 ISP_ADDRL = (INT8U)(byte_addr & 0x00ff);
C51 COMPILER V8.08 STC89C58RD__FLASH_ISP_IAP 05/13/2008 23:42:02 PAGE 3
117 1
118 1 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
119 1 ISP_CMD = ISP_CMD | READ_AP_and_Data_Memory_Command; /* 0000,0001 */
120 1
121 1 ISP_IAP_enable();
122 1
123 1 ISP_TRIG = 0x46;
124 1 ISP_TRIG = 0xb9;
125 1 _nop_();
126 1
127 1 ISP_IAP_disable();
128 1 return (ISP_DATA);
129 1 }
130
131 /* 扇区擦除 */
132 INT8U sector_erase(INT16U sector_addr)
133 {
134 1 INT16U get_sector_addr = 0;
135 1 get_sector_addr = (sector_addr & 0xfe00); /* 1111,1110,0000,0000; 取扇区地址 */
136 1 ISP_ADDRH = (INT8U)(get_sector_addr >> 8);
137 1 ISP_ADDRL = 0x00;
138 1
139 1 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
140 1 ISP_CMD = ISP_CMD | SECTOR_ERASE_AP_and_Data_Memory_Command; /* 0000,0011 */
141 1
142 1 ISP_IAP_enable();
143 1 ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
144 1 ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
145 1 _nop_();
146 1
147 1 ISP_IAP_disable();
148 1 return OK;
149 1 }
150
151 /* 字节编程 */
152 INT8U byte_program(INT16U byte_addr, INT8U original_data)
153 {
154 1 ISP_ADDRH = (INT8U)(byte_addr >> 8);
155 1 ISP_ADDRL = (INT8U)(byte_addr & 0x00ff);
156 1
157 1 ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */
158 1 ISP_CMD = ISP_CMD | PROGRAM_AP_and_Data_Memory_Command; /* 0000,0010 */
159 1 ISP_DATA = original_data;
160 1
161 1 ISP_IAP_enable();
162 1 ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */
163 1 ISP_TRIG = 0xb9; /* 触发ISP_IAP命令 */
164 1 _nop_();
165 1
166 1 ISP_IAP_disable();
167 1 return OK;
168 1 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -