?? 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 + -