⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eeprom.lst

📁 RTL8019以太网开发板资料
💻 LST
字号:
C51 COMPILER V8.18   EEPROM                                                                04/26/2010 19:37:30 PAGE 1   


C51 COMPILER V8.18, COMPILATION OF MODULE EEPROM
OBJECT MODULE PLACED IN EEPROM.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE EEPROM.c LARGE BROWSE DEBUG OBJECTEXTEND

line level    source

   1          
   2          #include <reg52.h>
   3          #include <intrins.h>        /* use _nop_() function */
   4          #include "EEPROM.h"
   5          //sfr16 DPTR = 0x82;
   6          
   7          /*        新增特殊功能寄存器定义        */
   8          sfr      ISP_DATA       =   0xe2;
   9          sfr  ISP_ADDRH  =   0xe3;  
  10          sfr      ISP_ADDRL      =   0xe4;
  11          sfr      ISP_CMD        =   0xe5; 
  12          sfr      ISP_TRIG       =   0xe6;   
  13          sfr      ISP_CONTR    =   0xe7; 
  14          
  15          
  16          /* 定义命令 */
  17          #define READ_AP_and_Data_Memory_Command                         0x01        /*  字节读数据存储区   */
  18          #define PROGRAM_AP_and_Data_Memory_Command          0x02        /*  字节编程数据存储区 */
  19          #define SECTOR_ERASE_AP_and_Data_Memory_Command     0x03        /*  扇区擦除数据存储区 */
  20          
  21          typedef     unsigned char       INT8U;          /* 8 bit 无符号整型  */
  22          typedef     unsigned int    INT16U;     /* 16 bit 无符号整型 */
  23          #define         DELAY_CONST  60000
  24          
  25          /* 定义常量 */
  26          #define ERROR   0
  27          #define OK      1
  28          
  29          /* 定义Flash 操作等待时间 */
  30          #define        MCU_CLOCK_20MHz
  31          //#define         MCU_CLOCK_20MHz
  32          //#define        MCU_CLOCK_10MHz
  33          //#define        MCU_CLOCK_5MHz
  34          #ifdef MCU_CLOCK_40MHz
              #define WAIT_TIME        0x00
              #endif
  37          #ifdef MCU_CLOCK_20MHz
  38          #define WAIT_TIME        0x01
  39          #endif
  40          #ifdef MCU_CLOCK_10MHz
              #define WAIT_TIME        0x02
              #endif
  43          #ifdef MCU_CLOCK_5MHz
              #define WAIT_TIME        0x03
              #endif
  46          
  47          
  48          #define SECTOR_SIZE                256
  49          /*********************************************************************
  50          函数名:       void  ISP_IAP_enable(void)
  51          功能:         打开 ISP,IAP 功能
  52          输入:         
  53          输出:         
  54          返回:         
  55          日期:         2004/08/08
C51 COMPILER V8.18   EEPROM                                                                04/26/2010 19:37:30 PAGE 2   

  56          *********************************************************************/
  57          void ISP_IAP_enable(void)
  58          {
  59   1              EA      =       0;                                                              // 关中断 /
  60   1              ISP_CONTR       =       ISP_CONTR & 0x18;       // 0001,1000 
  61   1              ISP_CONTR       =       ISP_CONTR | WAIT_TIME;
  62   1              ISP_CONTR       =       ISP_CONTR | 0x80;       // 1000,0000 
  63   1      }
  64          /*********************************************************************
  65          函数名:       void  ISP_IAP_disable(void)
  66          功能:         关闭 ISP,IAP 功能 
  67          输入:         
  68          输出:         
  69          返回:         
  70          日期:         2004/08/08
  71          *********************************************************************/
  72          
  73          void ISP_IAP_disable(void)
  74          {
  75   1              ISP_CONTR       =       ISP_CONTR & 0x7f;       // 0111,1111 
  76   1              ISP_TRIG        =       0x00;
  77   1              EA                      =   1;                  // 开中断 
  78   1      }
  79          /*********************************************************************
  80          函数名:       void  FlashInit(void)
  81          功能:         字节读
  82          输入:         存放地址:byte_addr
  83          输出:         
  84          返回:         存储数据:ISP_DATA
  85          日期:         2004/08/08
  86          *********************************************************************/
  87          /* 字节读 */
  88          UWORK8 byte_read(INT16U byte_addr)
  89          {
  90   1              ISP_ADDRH       =       (INT8U)(byte_addr >> 8);
  91   1              ISP_ADDRL       =       (INT8U)(byte_addr & 0x00ff);
  92   1      
  93   1              ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
  94   1              ISP_CMD         =       ISP_CMD |       READ_AP_and_Data_Memory_Command;        /* 0000,0001 */
  95   1      
  96   1              ISP_IAP_enable();
  97   1      
  98   1              ISP_TRIG        =       0x46;
  99   1              ISP_TRIG        =       0xb9;
 100   1              _nop_();
 101   1      
 102   1              ISP_IAP_disable();
 103   1              return (ISP_DATA);
 104   1      }
 105          /*********************************************************************
 106          函数名:       void  FlashWriteData(void)
 107          功能:        写数据进 数据Flash存储器, 只在同一个扇区内写,不保留原有数据       
 108                                  begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源  
 109          输入:         begin_addr:写入的启起地址, counter:数据长度.array所有数据  
 110          输出:         None
 111          返回:         none
 112          日期:         2004/08/08
 113          *********************************************************************/
 114          UWORK8 FlashWriteData(WORK16 begin_addr,  UWORK8 *array, WORK16 counter)
 115          {
 116   1              WORK16  i       =       0;
 117   1              WORK16  in_sector_begin_addr    =       0;
C51 COMPILER V8.18   EEPROM                                                                04/26/2010 19:37:30 PAGE 3   

 118   1              WORK16  sector_addr     =       0;
 119   1      
 120   1              if(counter > SECTOR_SIZE)                //判是否是有效范围,此函数不允许跨扇区操作
 121   1                      return  ERROR;
 122   1              in_sector_begin_addr =        begin_addr & 0x01ff;         // 0000,0001,1111,1111 
 123   1              if( (in_sector_begin_addr + counter) > SECTOR_SIZE )
 124   1                      return ERROR;
 125   1      
 126   1      
 127   1              sector_addr     =       (begin_addr & 0xfe00);  // 1111,1110,0000,0000; 取扇区地址 擦除 要修改/写入 的扇区
 128   1              ISP_ADDRH       =       (INT8U)(sector_addr >> 8);
 129   1              ISP_ADDRL       =       0x00;
 130   1              ISP_CMD         =       ISP_CMD &       0xf8;           // 1111,1000 
 131   1              ISP_CMD         =       ISP_CMD |       SECTOR_ERASE_AP_and_Data_Memory_Command;        // 0000,0011 
 132   1      
 133   1              ISP_IAP_enable();
 134   1              ISP_TRIG        =       0x46;        // 触发ISP_IAP命令 
 135   1              ISP_TRIG        =       0xb9;        // 触发ISP_IAP命令 
 136   1              _nop_();
 137   1      
 138   1              for(i = 0; i< counter; i++)
 139   1              {
 140   2                      ISP_ADDRH       =       (INT8U)(begin_addr >> 8);                //写一个字节
 141   2                      ISP_ADDRL       =       (INT8U)(begin_addr & 0x00ff);
 142   2                      ISP_DATA        =       *array;
 143   2                      ISP_CMD         =       ISP_CMD &       0xf8;   // 1111,1000 
 144   2                      ISP_CMD         =       ISP_CMD |       PROGRAM_AP_and_Data_Memory_Command;             // 0000,0010 
 145   2      
 146   2                      ISP_TRIG        =       0x46;   // 触发ISP_IAP命令 
 147   2                      ISP_TRIG        =       0xb9;   // 触发ISP_IAP命令 
 148   2                      _nop_();
 149   2      
 150   2                      ISP_DATA        =       0x00;                   //读回来
 151   2      
 152   2                      ISP_CMD         =       ISP_CMD &       0xf8;   // 1111,1000 
 153   2                      ISP_CMD     =   ISP_CMD |       READ_AP_and_Data_Memory_Command;        // 0000,0001 
 154   2      
 155   2                      ISP_TRIG        =       0x46;   // 触发ISP_IAP命令 
 156   2                      ISP_TRIG        =       0xb9;   // 触发ISP_IAP命令 
 157   2                      _nop_();
 158   2      
 159   2                      if(ISP_DATA != *array)     //比较对错
 160   2                      {
 161   3                              ISP_IAP_disable();
 162   3                              return ERROR;
 163   3                      }
 164   2                      begin_addr++;
 165   2                      array++;
 166   2              }
 167   1              ISP_IAP_disable();
 168   1              return  OK;
 169   1      }
 170          
 171          /*********************************************************************
 172          函数名:       FlashReadData
 173          功能:         从FLASH中读数据
 174          输入:         1. FLASH的地址 
 175                        2. 数据起始地址
 176                        3. 写的字节数
 177          输出:         None
 178          返回:         OK, ERROR
 179          日期:         2005/11/19
C51 COMPILER V8.18   EEPROM                                                                04/26/2010 19:37:30 PAGE 4   

 180          *********************************************************************/
 181          UWORK8 FlashReadData(UWORK16 usAtaddr,UWORK8 *pucMemAddr,UWORK16 usReadLen)
 182          {
 183   1          UWORK16 usSectorBeginAddr,usLoop;
 184   1          
 185   1          if(usReadLen > SECTOR_SIZE)
 186   1          {
 187   2              return ERROR;                                              /* 超出一个扇区的大小 */
 188   2          }
 189   1      
 190   1          usSectorBeginAddr = usAtaddr & 0x01ff;
 191   1          if((usSectorBeginAddr + usReadLen) > SECTOR_SIZE)
 192   1          {
 193   2              return ERROR;                                              /* 超出一个扇区的大小 */
 194   2          }
 195   1      
 196   1          for(usLoop = 0; usLoop < usReadLen; usLoop++)
 197   1          {
 198   2             *pucMemAddr = byte_read(usAtaddr);
 199   2              usAtaddr++;
 200   2              pucMemAddr++;
 201   2          }
 202   1          return OK;
 203   1      }
 204          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    446    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----      20
   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 + -