📄 stc_e2prom.lst
字号:
C51 COMPILER V8.02 STC_E2PROM 07/07/2008 18:58:00 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE STC_E2PROM
OBJECT MODULE PLACED IN Stc_E2prom.obj
COMPILER INVOKED BY: C:\Keil3\C51\BIN\C51.EXE software\Stc_E2prom.c BROWSE DEBUG OBJECTEXTEND PRINT(.\Stc_E2prom.lst) OB
-JECT(Stc_E2prom.obj)
line level source
1 /*------------------------------------------------------------------------------------------------*-
2 *File Name: STC_EEPROM.c
3 *Description: IAP/ISP 功能
4 *Project:
5 *MCU type: STC12C1052
6 *Compiler: KEIL C51
7 -*------------------------------------------------------------------------------------------------*/
8
9
10
11 #include "main.H"
12 #include "stc_e2prom.h"
13
14 /* IAP有关功能寄存器 */
15 sfr ISP_DATA = 0xE2;
16 sfr ISP_ADDRH = 0xE3;
17 sfr ISP_ADDRL = 0xE4;
18 sfr ISP_CMD = 0xE5;
19 sfr ISP_TRIG = 0xE6;
20 sfr ISP_CONTR = 0xE7;
21
22 // 定义常量
23 // ISP/IAP操作时的命令
24 #define ISP_IAP_BYTE_READ 1 // 字节读
25 #define ISP_IAP_BYTE_PROGRAM 2 // 字节编程,前提是该字节为空,0xff
26 #define ISP_IAP_SECTOR_ERASE 3 // 扇区擦除,要某字节为空,要擦一扇区
27
28 // 设置读/编程/扇区擦除等待时间
29 //#define E2PRAM_WAIT_TIME 7 // < 1 MHz
30 //#define E2PRAM_WAIT_TIME 6 // < 2 MHz
31 //#define E2PRAM_WAIT_TIME 5 // < 3 MHz
32 //#define E2PRAM_WAIT_TIME 4 // < 6 MHz
33 #define E2PRAM_WAIT_TIME 3 // < 12MHz
34 //#define E2PRAM_WAIT_TIME 2 // < 20MHz
35 //#define E2PRAM_WAIT_TIME 1 // < 24MHz
36 //#define E2PRAM_WAIT_TIME 0 // < 30MHz
37
38 #define ISP_EN 0x80 // ISP/IAP功能允许
39
40 // DATA Flash 存储的起始地址
41 #define E2p_START_ADDR 0x1000 // stc12c1052
42 #define Sector_Size 512 // 扇区大小
43 /*------------------------------------------------------------------------------------------------*-
44 * 函数名称: From_e2p_Read_Byte()
45 * 参 数: 内部E2PROM地址
46 * 返 回: 从内部E2PROM的指定地址中读出数据
47 * 函数功能: 从内部E2PROM中读出一字节数据
48 *
49 * 说 明: 页地址0~512,为了提高处理速度,最好用0~256的范围
50 *
51 * 当前版本: V1.0 * 取代版本:
52 * 作 者: 吴水林 * 修 改:
53 * 版本信息: 2008-02-17 * 修改信息:
54 -*------------------------------------------------------------------------------------------------*/
C51 COMPILER V8.02 STC_E2PROM 07/07/2008 18:58:00 PAGE 2
55 unsigned char From_e2p_Read_Byte(unsigned int address)
56 {
57 1 unsigned char ucData;
58 1 address = address + E2p_START_ADDR;
59 1 ISP_ADDRL = ((unsigned char *)(&address))[LOW];
60 1 ISP_ADDRH = ((unsigned char *)(&address))[HIGH];
61 1 ISP_CONTR = ISP_EN | E2PRAM_WAIT_TIME;
62 1 // 发送字节读命令
63 1 ISP_CMD = ISP_IAP_BYTE_READ;
64 1 ISP_TRIG = 0x46; // 发ISP处理
65 1 ISP_TRIG = 0xb9;
66 1
67 1 ucData = ISP_DATA; // 读扇区
68 1 _nop_();
69 1 _nop_();
70 1 // 关闭IAP功能,清ISP有关的特殊功能寄存器
71 1 ISP_CONTR = 0;
72 1 ISP_CMD = 0;
73 1 ISP_TRIG = 0;
74 1 return ucData;
75 1 }
76 /*------------------------------------------------------------------------------------------------*-
77 * 函数名称: To_e2p_Write_Byte()
78 * 参 数: address 内部E2PROM地址
79 * ucData 待写入的数据
80 * 返 回: ***
81 * 函数功能: 向内部E2PROM的指定地址写入一字节数据
82 * 注:该字节必须为 0xff/空时,可对其编程,否则先要执行扇区擦写
83 *
84 * 说 明: 页地址0~512,为了提高处理速度,最好用0~256的范围
85 *
86 * 当前版本: V1.0 * 取代版本:
87 * 作 者: 吴水林 * 修 改:
88 * 版本信息: 2008-02-17 * 修改信息:
89 -*------------------------------------------------------------------------------------------------*/
90 void To_e2p_Write_Byte(unsigned int address, const unsigned char ucData)
91 {
92 1 ISP_DATA = ucData;
93 1 address = address + E2p_START_ADDR;
94 1 ISP_ADDRL = ((unsigned char *)(&address))[LOW];
95 1 ISP_ADDRH = ((unsigned char *)(&address))[HIGH];
96 1 ISP_CONTR = ISP_EN | E2PRAM_WAIT_TIME;
97 1 // 发送字节编程命令
98 1 ISP_CMD = ISP_IAP_BYTE_PROGRAM;
99 1 ISP_TRIG = 0x46; // 发ISP处理
100 1 ISP_TRIG = 0xb9;
101 1 _nop_();
102 1 ISP_DATA = ucData; // 写扇区
103 1 // 关闭IAP功能,清ISP有关的特殊功能寄存器
104 1 ISP_CONTR = 0;
105 1 ISP_CMD = 0;
106 1 ISP_TRIG = 0;
107 1 }
108
109 /*------------------------------------------------------------------------------------------------*-
110 * 函数名称: Sector_Erase()
111 * 参 数: SectorPage 内部E2PROM页
112 *
113 * 返 回: ***
114 * 函数功能: 没有字节擦除,只有扇区擦除,512字节/扇区
115 * 注:如要保留其中某些字节的内部,则需将其行读入单片机的RAM中,
116 * 将扇区擦除后,再将数据写回到该扇区
C51 COMPILER V8.02 STC_E2PROM 07/07/2008 18:58:00 PAGE 3
117 *
118 * 说 明: 扇区中任意一个字节的地址都是该扇区的地址,无需求出首地址
119 *
120 * 当前版本: V1.0 * 取代版本:
121 * 作 者: 吴水林 * 修 改:
122 * 版本信息: 2008-02-17 * 修改信息:
123 -*------------------------------------------------------------------------------------------------*/
124 void Sector_Erase(const unsigned char SectorPage)
125 {
126 1 unsigned int address;
127 1 address = E2p_START_ADDR + (SectorPage * Sector_Size)-1;
128 1 ISP_ADDRL = ((unsigned char *)(&address))[LOW];
129 1 ISP_ADDRH = ((unsigned char *)(&address))[HIGH];
130 1 ISP_CONTR = ISP_EN | E2PRAM_WAIT_TIME;
131 1 // 发送扇区擦除命令
132 1 ISP_CMD = ISP_IAP_SECTOR_ERASE;
133 1 ISP_TRIG = 0x46; // 发ISP处理
134 1 ISP_TRIG = 0xb9;
135 1 _nop_();
136 1 // 关闭IAP功能,清ISP有关的特殊功能寄存器
137 1 ISP_CONTR = 0;
138 1 ISP_CMD = 0;
139 1 ISP_TRIG = 0;
140 1 }
141
142
143
144
145
146
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 132 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 6
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 + -