📄 iap.lst
字号:
C51 COMPILER V8.16 IAP 10/10/2009 14:43:36 PAGE 1
C51 COMPILER V8.16, COMPILATION OF MODULE IAP
OBJECT MODULE PLACED IN IAP.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE IAP.c LARGE WARNINGLEVEL(1) BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "system.h"
2
3 extern signed int xdata _D[31]; // 位元件 D 内存分配
4 #define Value _D[31] // 变频显示器LED显示缓冲区
5
6 //=======================================================================================================
7 // 函数名称: IAPFlashErasureMode
8 //
9 // 功能描述: 页面擦除模式
10 //
11 // 输 入: unsigned int pageaddr
12 //
13 // 输 出: void
14 //
15 // 全局变量:
16 // 调用模块: 无
17 //
18 // 作 者: 卢明君
19 // 日 期: 2009年9月15日
20 // 备 注:
21 //-------------------------------------------------------------------------------------------------------
22 // 修改人:
23 // 日 期:
24 // 备 注:
25 //-------------------------------------------------------------------------------------------------------
26 //=======================================================================================================
27 void IAPFlashErasureMode(unsigned int pageaddr)
28 {
29 1 ISPCR=0x83; // ISPCR.7=1,启用ISP
30 1 // ISPCR[2:0]=011, 假设MPC82系列运行在11.0592M
31 1 IFMT=0x03; // 选择页擦除模式
32 1 IFADRH=pageaddr>>8; // 这个页面必须在IAP存储区
33 1 IFADRL=pageaddr;
34 1 SCMD=0x46; // 触发的ISP处理
35 1 SCMD=0xb9; // MCU将会停止运行.直到处理完成
36 1 }
37 //=======================================================================================================
38 // 函数名称: IAPFlashProgrem
39 //
40 // 功能描述: 单字节写入模式(无"检查是否写入成功")
41 //
42 // 输 入: unsigned int codeaddr,unsigned char ucdata
43 //
44 // 输 出: void
45 //
46 // 全局变量:
47 // 调用模块: 无
48 //
49 // 作 者: 卢明君
50 // 日 期: 2009年9月15日
51 // 备 注: 此函数不包含"检查是否写入成功".
52 //-------------------------------------------------------------------------------------------------------
53 // 修改人:
54 // 日 期:
55 // 备 注:
C51 COMPILER V8.16 IAP 10/10/2009 14:43:36 PAGE 2
56 //-------------------------------------------------------------------------------------------------------
57 //=======================================================================================================
58 void IAPFlashProgrem(unsigned int codeaddr,unsigned char ucdata)
59 {
60 1 ISPCR=0x83; // ISPCR.7=1,启用ISP
61 1 // ISPCR[2:0]=011, 假设MPC82系列运行在11.0592M
62 1 IFMT=0x02; // 进入编程模式
63 1 IFADRH=codeaddr>>8; // 这个字节必须在IAP存储区
64 1 IFADRL=codeaddr;
65 1 IFD=ucdata; // 填写待编程的数据
66 1 SCMD=0x46; // 触发的ISP处理
67 1 SCMD=0xb9; // MCU将会停止运行.直到处理完成
68 1 }
69 //=======================================================================================================
70 // 函数名称: IAPFlashProgremMode
71 //
72 // 功能描述: 单字节写入模式(含有"检查是否写入成功")
73 //
74 // 输 入: unsigned int codeaddr,unsigned char ucdata
75 //
76 // 输 出: void
77 //
78 // 全局变量:
79 // 调用模块: IAPFlashErasureMode ; IAPFlashProgrem ; IAPFlashReadMode
80 //
81 // 作 者: 卢明君
82 // 日 期: 2009年9月15日
83 // 备 注: 此函数包含"检查是否写入成功".
84 //-------------------------------------------------------------------------------------------------------
85 // 修改人:
86 // 日 期:
87 // 备 注:
88 //-------------------------------------------------------------------------------------------------------
89 //=======================================================================================================
90 void IAPFlashProgremMode(unsigned int codeaddr,unsigned char ucdata) // 编程模式
91 {
92 1 unsigned char checkdata=0;
93 1 unsigned char retry=0;
94 1 unsigned int i=0;
95 1 unsigned int tempaddr=0;
96 1 unsigned char tempdata; // 为节省RAM 应运而生的变量.
97 1 checkdata=IAPFlashReadMode(codeaddr);
98 1 while(checkdata!=ucdata) // 判断不相等后,再写入,相等就不必写入重新写入了.
99 1 {
100 2 IAPFlashProgrem(codeaddr,ucdata);
101 2 if(++retry>ReTryTimes) // 2次尝试机会
102 2 {
103 3 tempaddr=codeaddr-codeaddr%512; // 计算当前页首地址
104 3 IAPFlashErasureMode(PLCTempAddr); // 擦除IAP缓存备份空间 为节省RAM 应运而生的空间.
105 3 for(i=0;i<512;i++) // 读出当前页所有数据,备份
106 3 {
107 4 tempdata=IAPFlashReadMode(i+tempaddr);
108 4 if(tempdata!=0xff)IAPFlashProgrem(i+PLCTempAddr,tempdata);
109 4 }
110 3 IAPFlashErasureMode(tempaddr); // 擦除当前页
111 3 if(ucdata!=0xff)IAPFlashProgrem(codeaddr,ucdata); // 重写
112 3 for(i=0;i<512;i++) // 将备份数据写回
113 3 {
114 4 if(codeaddr==(i+tempaddr))continue;
115 4 tempdata=IAPFlashReadMode(i+PLCTempAddr);
116 4 if(tempdata!=0xff)IAPFlashProgrem(i+tempaddr,tempdata);
117 4 }
C51 COMPILER V8.16 IAP 10/10/2009 14:43:36 PAGE 3
118 3 }
119 2 checkdata=IAPFlashReadMode(codeaddr);
120 2 if(retry>=ReTryOut)
121 2 {
122 3 while(1) // 出错了,不写了,显示写错误的地址,请核对是否超出IAP空间大小
123 3 {
124 4 Value=codeaddr;
125 4 // Out_EY_BIT();
126 4 }
127 3 }
128 2 }
129 1 }
130 //=======================================================================================================
131 // 函数名称: IAPFlashReadMode
132 //
133 // 功能描述: 单字节读取模式
134 //
135 // 输 入: unsigned int codeaddr
136 //
137 // 输 出: unsigned char
138 //
139 // 全局变量:
140 // 调用模块: 无
141 //
142 // 作 者: 卢明君
143 // 日 期: 2009年9月15日
144 // 备 注:
145 //-------------------------------------------------------------------------------------------------------
146 // 修改人:
147 // 日 期:
148 // 备 注:
149 //-------------------------------------------------------------------------------------------------------
150 //=======================================================================================================
151 unsigned char IAPFlashReadMode(unsigned int codeaddr) // 读模式
152 {
153 1 ISPCR=0x83; // ISPCR.7=1,启用ISP
154 1 // ISPCR[2:0]=011, 假设MPC82系列运行在11.0592M
155 1 IFMT=0x01; // 进入读模式
156 1 IFADRH=codeaddr>>8; // 这个字节必须在IAP存储区
157 1 IFADRL=codeaddr;
158 1 SCMD=0x46; // 触发的ISP处理
159 1 SCMD=0xb9; // MCU将会停止运行.直到处理完成 // 触发IAP
160 1 return IFD; // 读出的数据
161 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 445 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- 10
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -