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

时间:2022-09-11 17:23:08

  N76e003单片机内部没有EEPROM,但是可以使用 APROM模拟EEPROM功能,代码如下:

eeprom.h

 #ifndef _EEPROM_H_
#define _EEPROM_H_ //EEPROM 指令
#define BYTE_PROGRAM_AP 0x21 //APROM 字节编程(数据写入)
#define PAGE_ERASE_AP 0x22 //APROM 页擦除 (128字节)
#define BYTE_Read_AP 0x00 //APROM 字节读 (数据字节) // EEPROM起始地址
#define EEPROM_START_ADDRESS 0x0200 void Eeprom_Unlock(void);
void Eeprom_Locked(void);
void Eeprom_IAP_process(void);
void Eeprom_Erase_page(unsigned short address,unsigned char Data);
void Eeprom_Byte_write(unsigned short address,unsigned char Data);
unsigned char Eeprom_Erase_read(unsigned short address); #endif /* _EEPROM_H_ */

eeprom.c

 #include <N76E003.h>
#include "eeprom.h"
#include "data.h" volatile unsigned char code Data_Flash[] _at_ EEPROM_START_ADDRESS; //不被优化 /**************************************************************************
Function: Eeprom_Unlock
Description: 解锁 Eeprom
Input: no
Output: no
Return: no
**************************************************************************/
void Eeprom_Unlock(void){
//开启 在线编程模式(LDROM和APROM)
TA = 0xAA; //CHPCON受TA保护
TA = 0x55;
CHPCON |= 0x01; //IAPEN = 1, 启用IAP模式(CHPCON芯片控制寄存器)
//开启 编程程序模式(APROM)
TA = 0xAA; //IAPUEN受TA保护
TA = 0x55;
IAPUEN |= 0x01; //APUEN = 1, 启用APROM更新(更新使能)
}
/**************************************************************************
Function: Eeprom_Locked
Description: 解锁 Eeprom
Input: no
Output: no
Return: no
**************************************************************************/
void Eeprom_Locked(void)
{
//关闭 编程程序模式(APROM)
TA = 0xAA; //IAPUEN受TA保护
TA = 0x55;
IAPUEN &= ~0x01; //APUEN = 0,禁用APROM更新
//关闭 在线编程模式(LDROM和APROM)
TA = 0xAA; //CHPCON受TA保护
TA = 0x55;
CHPCON &= ~0x01; //IAPEN = 0,禁用IAP模式
}
/**************************************************************************
Function: Eeprom_IAP_process
Description: IAP 处理
Input: no
Output: no
Return: no
**************************************************************************/
void Eeprom_IAP_process(void){
bit EA_status;
//IAP 执行
EA_status = EA;
EA = ;
TA = 0xAA;
TA = 0x55;
IAPTRG |= 0x01; //IAP 执行(设置该位为1开始执行IAP。该指令后,CPU保持程序计数器(PC) ,IAP硬件自动管理控制该过程。IAP完成后,程序计数器继续执行下一个指令。IAPGO位自动清零,保持为0。在触发IAP动作前,如果中断打开应该临时关闭因为硬件限制。) Eeprom_Unlock(); //Eeprom 上锁
EA = EA_status;
}
/**************************************************************************
Function: Eeprom_Erase_page
Description: 擦除页面 Eeprom
Input: - address 指定擦除页面的绝对地址
- Data Eeprom擦除后的数据
Output: no
Return: no
**************************************************************************/
void Eeprom_Erase_page(unsigned short address,unsigned char Data)
{
unsigned char High_address = address >> ; //取高位
unsigned char Low_address = address; //取低位
Eeprom_Unlock(); //Eeprom 解锁
//擦除页面
IAPCN = PAGE_ERASE_AP; //页擦除
IAPAH = High_address; //页面地址高8位
IAPAL = Low_address; //页面地址低8位
IAPFD = Data; //擦除数据值
//IAP 执行
Eeprom_IAP_process(); //执行上面设置
Eeprom_Locked(); //Eeprom 上锁
}
/**************************************************************************
Function: Eeprom_Byte_write
Description: 字节编程 Eeprom
Input: - address 指定更改数据的绝对地址
- Data Eeprom写入的数据
Output: no
Return: no
**************************************************************************/
void Eeprom_Byte_write(unsigned short address,unsigned char Data)
{
unsigned char High_address = address >> ; //取高位
unsigned char Low_address = address; //取低位
Eeprom_Unlock(); //Eeprom 解锁
//字节编程
IAPCN = BYTE_PROGRAM_AP; //字节编程
IAPAH = High_address; //字节编程地址高8位
IAPAL = Low_address; //字节编程地址低8位
IAPFD = Data; //写入的数据
//IAP 执行
Eeprom_IAP_process(); //执行上面设置
Eeprom_Locked(); //Eeprom 上锁
}
/**************************************************************************
Function: Eeprom_Erase_read
Description: 字节读 Eeprom
Input: - address 指定读出数据的绝对地址
Output: no
Return: IAPFD 读出的数据
**************************************************************************/
unsigned char Eeprom_Erase_read(unsigned short address){
unsigned char High_address = address >> ; //取高位
unsigned char Low_address = address; //取低位
//字节读
IAPCN = BYTE_Read_AP; //字节读
IAPAH = High_address; //字节读地址高8位
IAPAL = Low_address; //字节读地址低8位
//IAP 执行
Eeprom_IAP_process(); //执行上面设置
return IAPFD;
}

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

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

    本文是续 单片机成长之路(51基础篇) - 009 关于sdcc的多文件编译范例(一)编写的. 在实际的工作中,单片机的头文件和功能函数不可能同全部放在同一个文件夹下面,我们把单片机成长之路(51基础 ...

  2. 单片机成长之路(51基础篇) - 009 关于sdcc的多文件编译范例&lpar;一&rpar;

    本文是续 单片机成长之路(51基础篇) - 006 在Linux下搭建51单片机的开发烧写环境编写的. 本范例主要由(main.c ,delay.h,delay.c,makefile)4个文件组成,s ...

  3. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  4. Sass进阶之路&comma;之一&lpar;基础篇&rpar;

    Sass 学习Sass之前,应该要知道css预处理器这个东西,css预处理器是什么呢? Css预处理器定义了一种新的语言将Css作为目标生成文件,然后开发者就只要使用这种语言进行编码工作了.预处理器通 ...

  5. python成长之路第三篇&lpar;1&rpar;&lowbar;初识函数

    目录: 函数 为什么要使用函数 什么是函数 函数的返回值 文档化函数 函数传参数 文件操作(二) 1.文件操作的步骤 2.文件的内置方法 函数: 一.为什么要使用函数 在日常写代码中,我们会发现有很多 ...

  6. C&plus;&plus;自学成长之路(第一篇)

    今天开始我将开启C++自学成长之路,今天是第一天,在以前就一直在网上查找关于c++的资料,想买一本好一点的,权威一点的资料书,通过努力查找,我选择了c++ primer,在网上这本书的好评如潮.更多的 ...

  7. 单片机成长之路(51基础篇) - 008 C51 的标示符和关键字

    标准 C 语言定义了 32 个关键字,如下表(ANSI C的32个关键字): C51在此基础上针对单片机功能进行了扩展,详情见下表(C51编译器扩充关键字): C 51的数据类型 51单片机使用的C语 ...

  8. 单片机成长之路(51基础篇) - 006 在Linux下搭建51单片机的开发烧写环境

    在Linux下没有像keli那样好用的IDE来开发51单片机,开发环境只能自己搭建了. 第一步:安装交叉编译工具 a) 安装SDCC sudo apt-get install sdcc b)测试SDC ...

  9. 单片机成长之路(51基础篇) - 002 STC单片机冷启动和复位有什么区别

    STC单片机简介 STC单片机是一款增强型51单片机,完全兼容MCS-51,还增加了新的功能,比如新增两级中断优先级,多一个外中断,内置EEPROM,硬件看门狗,具有掉电模式,512B内存等.还支持I ...

随机推荐

  1. linux下如何使用sftp命令【转】

    linux下如何使用sftp命令 from:   http://www.cnblogs.com/chen1987lei/archive/2010/11/26/1888391.html sftp 是一个 ...

  2. Android框架结构图

  3. heX:用HTML5和Node&period;JS开发桌面应用

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  4. Hololens 开发环境配置

    安装 Hololens SDK 转自 Vangos Pterneas, 4 Apr 2016 CPOL    5.00 (1 vote) vote 1vote 2vote 3vote 4vote 5 ...

  5. 2017年8月28日 HTML&sol;CSS 语法(待填坑)

    今天这种节日真的是 ----------------------------------------------------------- HTML  

  6. numpy&amp&semi;pandas基础

    numpy基础 import numpy as np 定义array In [156]: np.ones(3) Out[156]: array([1., 1., 1.]) In [157]: np.o ...

  7. js条件语句之职责链数组

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 【Oracle】查询字段的长度、类型、精度、注释等信息

    查询数据字典中字段的相关信息 SELECT T .column_name AS column_name, --列名 T .column_type AS column_type, ---字段类型 T . ...

  9. Little Sub and Piggybank (杭师大第十二届校赛G题) DP

    题目传送门 题意:每天能往存钱罐加任意实数的钱,每天不能多于起那一天放的钱数.如果某一天的钱数恰好等于那天的特价商品,则可以买,求最后的最大快乐值. 思路:先来一段来自出题人的题解: 显然的贪心:如果 ...

  10. 小技巧:Mac下Metasploit渗透Oracle环境的搭建

    Metasploit是一款开源的安全漏洞检测工具,可以帮助安全和IT专业人士识别安全性问题,验证漏洞的缓解措施,并管理专家驱动的安全性进行评估,提供真正的安全风险情报.这些功能包括智能开发,密码审计, ...