zoukankan      html  css  js  c++  java
  • 单片机成长之路(51基础篇)

      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.c

      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 }
  • 相关阅读:
    Azure PowerShell (2) 修改Azure订阅名称
    Windows Azure Platform Introduction (11) 了解Org ID、Windows Azure订阅、账户
    Azure PowerShell (3) 上传证书
    Azure PowerShell (1) PowerShell入门
    Windows Azure Service Bus (2) 队列(Queue)入门
    Windows Azure Service Bus (1) 基础
    Windows Azure Cloud Service (10) Role的生命周期
    Windows Azure Cloud Service (36) 在Azure Cloud Service配置SSL证书
    Android studio 使用心得(一)—android studio快速掌握快捷键
    android 签名、混淆打包
  • 原文地址:https://www.cnblogs.com/jikexianfeng/p/10655648.html
Copyright © 2011-2022 走看看