單片機成長之路(51基礎篇) - 022 N76e003 APROM模擬EEPROM驅動

  N76e003單片機內部沒有EEPROM,可是可使用 APROM模擬EEPROM功能,代碼以下:編程

eeprom.h優化

 1 #ifndef _EEPROM_H_
 2 #define _EEPROM_H_
 3 
 4 //EEPROM 指令
 5 #define BYTE_PROGRAM_AP 0x21    //APROM 字節編程(數據寫入)
 6 #define PAGE_ERASE_AP     0x22    //APROM 頁擦除 (128字節)
 7 #define BYTE_Read_AP    0x00    //APROM 字節讀 (數據字節)
 8 
 9 
10 // EEPROM起始地址
11 #define EEPROM_START_ADDRESS          0x0200
12 
13 void Eeprom_Unlock(void);
14 void Eeprom_Locked(void);
15 void Eeprom_IAP_process(void);
16 void Eeprom_Erase_page(unsigned short address,unsigned char Data);
17 void Eeprom_Byte_write(unsigned short address,unsigned char Data);
18 unsigned char Eeprom_Erase_read(unsigned short address);
19 
20 
21 #endif  /* _EEPROM_H_ */

eeprom.cspa

  1 #include <N76E003.h>
  2 #include "eeprom.h"
  3 #include "data.h"
  4 
  5 volatile unsigned char code Data_Flash[128] _at_ EEPROM_START_ADDRESS;                //不被優化
  6 
  7 /**************************************************************************
  8 Function:    Eeprom_Unlock
  9 Description: 解鎖 Eeprom
 10 Input:       no
 11 Output:      no
 12 Return:      no
 13 **************************************************************************/
 14 void Eeprom_Unlock(void){
 15     //開啓 在線編程模式(LDROM和APROM)
 16     TA = 0xAA;                            //CHPCON受TA保護
 17     TA = 0x55;
 18     CHPCON |= 0x01;                        //IAPEN = 1, 啓用IAP模式(CHPCON芯片控制寄存器)
 19     //開啓 編程程序模式(APROM)
 20     TA = 0xAA;                            //IAPUEN受TA保護
 21     TA = 0x55;
 22     IAPUEN |= 0x01;                        //APUEN = 1, 啓用APROM更新(更新使能)
 23 }
 24 /**************************************************************************
 25 Function:    Eeprom_Locked
 26 Description: 解鎖 Eeprom
 27 Input:       no
 28 Output:      no
 29 Return:      no
 30 **************************************************************************/
 31 void Eeprom_Locked(void)
 32 {
 33     //關閉 編程程序模式(APROM)
 34     TA = 0xAA;                             //IAPUEN受TA保護
 35     TA = 0x55;
 36     IAPUEN &= ~0x01;                      //APUEN = 0,禁用APROM更新
 37     //關閉 在線編程模式(LDROM和APROM)
 38     TA = 0xAA;                             //CHPCON受TA保護
 39     TA = 0x55;
 40     CHPCON &= ~0x01;                     //IAPEN = 0,禁用IAP模式
 41 }
 42 /**************************************************************************
 43 Function:    Eeprom_IAP_process
 44 Description: IAP 處理
 45 Input:       no
 46 Output:      no
 47 Return:      no
 48 **************************************************************************/
 49 void Eeprom_IAP_process(void){
 50     bit EA_status;
 51     //IAP 執行
 52     EA_status = EA;
 53     EA = 0;
 54     TA = 0xAA;
 55     TA = 0x55;
 56     IAPTRG |= 0x01;                     //IAP 執行(設置該位爲1開始執行IAP。該指令後,CPU保持程序計數器(PC) ,IAP硬件自動管理控制該過程。IAP完成後,程序計數器繼續執行下一個指令。IAPGO位自動清零,保持爲0。在觸發IAP動做前,若是中斷打開應該臨時關閉由於硬件限制。)    Eeprom_Unlock();            //Eeprom 上鎖
 57     EA = EA_status;
 58 }
 59 /**************************************************************************
 60 Function:    Eeprom_Erase_page
 61 Description: 擦除頁面 Eeprom
 62 Input:       - address  指定擦除頁面的絕對地址
 63              - Data  Eeprom擦除後的數據
 64 Output:      no
 65 Return:      no
 66 **************************************************************************/
 67 void Eeprom_Erase_page(unsigned short address,unsigned char Data)
 68 {
 69     unsigned char High_address = address >> 8;    //取高位
 70     unsigned char Low_address = address;        //取低位
 71     Eeprom_Unlock();                            //Eeprom 解鎖
 72     //擦除頁面
 73     IAPCN = PAGE_ERASE_AP;                //頁擦除
 74     IAPAH = High_address;                //頁面地址高8位
 75     IAPAL = Low_address;                //頁面地址低8位
 76     IAPFD = Data;                        //擦除數據值
 77     //IAP 執行
 78     Eeprom_IAP_process();                //執行上面設置
 79     Eeprom_Locked();                    //Eeprom 上鎖
 80 }
 81 /**************************************************************************
 82 Function:    Eeprom_Byte_write
 83 Description: 字節編程 Eeprom
 84 Input:       - address  指定更改數據的絕對地址
 85              - Data  Eeprom寫入的數據
 86 Output:      no
 87 Return:      no
 88 **************************************************************************/
 89 void Eeprom_Byte_write(unsigned short address,unsigned char Data)
 90 {
 91     unsigned char High_address = address >> 8;    //取高位
 92     unsigned char Low_address = address;         //取低位
 93     Eeprom_Unlock();                    //Eeprom 解鎖
 94     //字節編程
 95     IAPCN = BYTE_PROGRAM_AP;            //字節編程
 96     IAPAH = High_address;                //字節編程地址高8位
 97     IAPAL = Low_address;                //字節編程地址低8位
 98     IAPFD = Data;                        //寫入的數據
 99     //IAP 執行
100     Eeprom_IAP_process();                //執行上面設置
101     Eeprom_Locked();                       //Eeprom 上鎖
102 }
103 /**************************************************************************
104 Function:    Eeprom_Erase_read
105 Description: 字節讀 Eeprom
106 Input:       - address  指定讀出數據的絕對地址
107 Output:      no
108 Return:      IAPFD 讀出的數據
109 **************************************************************************/
110 unsigned char Eeprom_Erase_read(unsigned short address){
111     unsigned char High_address = address >> 8;    //取高位
112     unsigned char Low_address = address;          //取低位
113     //字節讀
114     IAPCN = BYTE_Read_AP;                  //字節讀
115     IAPAH = High_address;                //字節讀地址高8位
116     IAPAL = Low_address;                //字節讀地址低8位
117     //IAP 執行
118     Eeprom_IAP_process();                //執行上面設置
119     return IAPFD;
120 }
相關文章
相關標籤/搜索