单片机成长之路(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.c

  1 #include "N76E003.h"
  2 #include "button.h"
  3 #include "eeprom.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 {
 16     //开启 在线编程模式(LDROM和APROM)
 17     TA = 0xAA;                     //CHPCON受TA保护
 18     TA = 0x55;
 19     CHPCON |= 0x01;             //IAPEN = 1, 启用IAP模式(CHPCON芯片控制寄存器)
 20     //开启 编程程序模式(APROM)
 21     TA = 0xAA;                     //IAPUEN受TA保护
 22     TA = 0x55;
 23     IAPUEN |= 0x01;             //APUEN = 1, 启用APROM更新(更新使能)
 24 }
 25 /**************************************************************************
 26 Function:    Eeprom_Locked
 27 Description: 解锁 Eeprom
 28 Input:       no
 29 Output:      no
 30 Return:      no
 31 **************************************************************************/
 32 void Eeprom_Locked(void)
 33 {
 34     //关闭 编程程序模式(APROM)
 35     TA = 0xAA;                     //IAPUEN受TA保护
 36     TA = 0x55;
 37     IAPUEN &= ~0x01;             //APUEN = 0,禁用APROM更新
 38     //关闭 在线编程模式(LDROM和APROM)
 39     TA = 0xAA;                     //CHPCON受TA保护
 40     TA = 0x55;
 41     CHPCON &= ~0x01;             //IAPEN = 0,禁用IAP模式
 42 }
 43
 44
 45 /**************************************************************************
 46 Function:    Eeprom_IAP_process
 47 Description: IAP 处理
 48 Input:       no
 49 Output:      no
 50 Return:      no
 51 **************************************************************************/
 52 void Eeprom_IAP_process(void){
 53     bit EA_status;
 54     //IAP 执行
 55     TA = 0xAA;
 56     TA = 0x55;
 57     EA_status = EA;
 58     EA = 0;             
 59     IAPTRG |= 0x01;             //IAP 执行(设置该位为1开始执行IAP。该指令后,CPU保持程序计数器(PC) ,IAP硬件自动管理控制该过程。IAP完成后,程序计数器继续执行下一个指令。IAPGO位自动清零,保持为0。在触发IAP动作前,如果中断打开应该临时关闭因为硬件限制。)    Eeprom_Unlock();            //Eeprom 上锁
 60     EA = EA_status;
 61 }
 62 /**************************************************************************
 63 Function:    Eeprom_Erase_page
 64 Description: 擦除页面 Eeprom
 65 Input:       - address  指定擦除页面的绝对地址
 66              - Data  Eeprom擦除后的数据
 67 Output:      no
 68 Return:      no
 69 **************************************************************************/
 70 void Eeprom_Erase_page(unsigned short address,unsigned char Data)
 71 {
 72     unsigned char High_address = address >> 8;        //取高位
 73     unsigned char Low_address = address;            //取低位
 74     Eeprom_Unlock();            //Eeprom 解锁
 75     //擦除页面
 76     IAPCN = PAGE_ERASE_AP;         //页擦除
 77     IAPAH = High_address;        //页面地址高8位
 78     IAPAL = Low_address;        //页面地址低8位
 79     IAPFD = Data;                //擦除数据值
 80     //IAP 执行
 81     Eeprom_IAP_process();        //执行上面设置
 82     Eeprom_Locked();            //Eeprom 上锁
 83 }
 84
 85
 86 /**************************************************************************
 87 Function:    Eeprom_Byte_write
 88 Description: 字节编程 Eeprom
 89 Input:       - address  指定更改数据的绝对地址
 90              - Data  Eeprom写入的数据
 91 Output:      no
 92 Return:      no
 93 **************************************************************************/
 94 void Eeprom_Byte_write(unsigned short address,unsigned char Data)
 95 {
 96     unsigned char High_address = address >> 8;        //取高位
 97     unsigned char Low_address = address;            //取低位
 98     Eeprom_Unlock();            //Eeprom 解锁
 99     //字节编程
100     IAPCN = BYTE_Read_AP;         //字节编程
101     IAPAH = High_address;        //字节编程地址高8位
102     IAPAL = Low_address;        //字节编程地址低8位
103     IAPFD = Data;                //写入的数据
104     //IAP 执行
105     Eeprom_IAP_process();        //执行上面设置
106     Eeprom_Locked();            //Eeprom 上锁
107 }
108 /**************************************************************************
109 Function:    Eeprom_Erase_read
110 Description: 字节读 Eeprom
111 Input:       - address  指定读出数据的绝对地址
112 Output:      no
113 Return:      IAPFD 读出的数据
114 **************************************************************************/
115 unsigned char Eeprom_Erase_read(unsigned short address){
116     unsigned char High_address = address >> 8;        //取高位
117     unsigned char Low_address = address;            //取低位
118     //字节读
119     IAPCN = BYTE_Read_AP;         //字节读
120     IAPAH = High_address;        //字节读地址高8位
121     IAPAL = Low_address;        //字节读地址低8位
122     //IAP 执行
123     Eeprom_IAP_process();        //执行上面设置
124     return IAPFD;
125 }

原文地址:https://www.cnblogs.com/jikexianfeng/p/10655648.html

时间: 2024-10-08 06:36:42

单片机成长之路(51基础篇) - 022 N76e003 APROM模拟EEPROM驱动的相关文章

单片机成长之路(51基础篇) - 009 关于sdcc的多文件编译范例

本范例主要由(main.c ,delay.h,delay.c,makefile)4个文件组成,sdcc的编译环境搭建参照:单片机成长之路(51基础篇) - 006 在Linux下搭建51单片机的开发烧写环境,废话不多,进入主题: main.c(主函数) 1 #include "8051.h" 2 #include "delay.h" 3 #define uint unsigned int 4 #define uchar unsigned char 5 uchar t

python成长之路第三篇(1)_初识函数

目录: 函数 1.为什么要使用函数 2.什么是函数 3.函数的返回值 4.文档化函数 5.函数传参数 文件操作(二) 1.文件操作的步骤 2.文件的内置方法 函数: 一.为什么要使用函数 在日常写代码中,我们会发现有很多代码是重复利用的,这样会使我们的代码变得异常臃肿,比如说: 我们要写一个验证码的功能 例子: 比如说我们要进行一些操作,而这些操作需要填写验证码 验证码代码:  1 import random   2 number_check = ''   3 for i in range(0,

Sass进阶之路,之一(基础篇)

Sass 学习Sass之前,应该要知道css预处理器这个东西,css预处理器是什么呢? Css预处理器定义了一种新的语言将Css作为目标生成文件,然后开发者就只要使用这种语言进行编码工作了.预处理器通常可以实现浏览器兼容,变量,结构体等功能,代码更加简洁易于维护. 那么css预处理器与Sass有什么关系呢,Sass就是属于css预处理器中的一种,还有两款他们分别是Less和 Stylus,这里就不做过多的介绍了. 什么是Sass sass是一种css的开发工具,提供了很多便利的写法,不但使css

单片机成长之路(51基础篇) - 016 常见总线类型

1.首先看看它名字真正的含义: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS:意为IC之间总线) UART(Universal Asynchronous Receiver Transmitter:通用异步收发器) USART:通用同步异步收发器 USB:Universal Serial BUS(通用串行总线) CAN:现场总线 2.看看他们传输数据线的组成: SPI总线由三条信号线组成:串行时钟(SCLK).串行数据输出(SD

单片机成长之路(51基础篇) - 018 keil51的STARTUP.A51

STARTUP.A51原始文件: 1 $NOMOD51;Ax51宏汇编器控制命令,禁止预定义的8051.使编译器不使能预定义的;8051符号,避免产生重复定义的错误. 2 ;------------------------------------------------------------------------------ 3 ; This file is part of the C51 Compiler package 4 ; Copyright (c) 1988-2005 Keil E

单片机成长之路(51基础篇) - 023 N76e003 系统时钟切换到外部时钟

N76e003切换到外部时钟的资料很少(因为N76e003的片子是不支持无源晶振的,有源晶振的成本又很高,所以网上很少有对N76e003的介绍).有图有真相: 代码如下: main.c 1 #include <N76E003.H> 2 #include <SFR_Macro.h> 3 #include <Function_Define.h> 4 5 bit BIT_TMP; // 调用 SFR_Macro.h 使用的 6 7 void main(void){ 8 //

单片机成长之路(avr基础篇)- 003 AVR单片机的BOOT区

BOOT区的由来基于一个简单的道理,即单片机的程序是保存在FLASH中的,要运行程序就必须不停的访问FLASH存储器.对于一般的FLASH存储器,数据的写入需要一定的时间来完成,在数据写入完成之前,存储器中所有的数据都是不可读的,这就在运行旧程序和写入新程序之间造成了一个矛盾. 使用BOOT区是解决这个矛盾的方法之一,它将FLASH存储器从物理上分为两个独立的区域,对其中的一个区的数据写入不会影响到另一个区的数据读取操作.我们可以让单片机的程序在其中一个区(通常是BOOT区)运行,而运行着的程序

Python成长之路【第二篇】Python基础之数据类型

阅读目录 简介 1 什么是数据? x=10,10是我们要存储的数据 2 为何数据要分不同的类型 数据是用来表示状态的,不同的状态就应该用不同的类型的数据去表示 3 数据类型 数字(整形,长整形,浮点型,复数) 字符串 列表 元组 字典 集合 4 如何学习 #一:基本使用 1 用途 2 定义方式 3 常用操作+内置的方法 #二:该类型总结 1 存一个值or存多个值 只能存一个值 可以存多个值,值都可以是什么类型 2 有序or无序 3 可变or不可变 !!!可变:值变,id不变.可变==不可hash

开篇(架构师的成长之路---第1篇)

本人java程序猿一枚,2012年参加工作.一步一步的由最初的程序员成长为独立事业部经理,迷茫过,也兴奋过.今天的我又迷茫了. 在人生的道路上,每个人都会遇到很多次选择,每一次的选择决定了今后一段时间的人生走向.今天的我又到了选择的时候. 谨以此博客,来积累技术的点滴,让文字指引我前行的方向. 谨以此博客,来记录一个普通程序猿人生过程中前行的脚步. 我是一个普通的房奴人,我的目标就是努力赚钱,减轻家庭还房贷的压力. 我是一个骑电瓶车上班的人,我的目标就是努力赚钱,希望拥有家庭的一辆小轿车. 我是