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 }
  • 相关阅读:
    jmeter测试接口--form表单提交请求(解决请求传参为空的问题)
    jmeter测试接口-打开很多TCP的连接数TIME_WAIT状态(Linux环境)导致报错的解决方法
    Jmeter 事务下的if控制器和无事务下的if控制器是否有不同 (业务实现3:2的补充)
    Jmeter if控制器的使用
    Jmeter 文件格式的参数化
    CentOS7学习笔记--tomcat9环境安装
    CentOS7学习笔记--PHP环境安装
    CentOS学习笔记—启动、ROOT密码
    虚拟机硬盘扩容
    win7如何设置某个软件不弹出用户账户控制
  • 原文地址:https://www.cnblogs.com/jikexianfeng/p/10655648.html
Copyright © 2011-2022 走看看