单片机成长之路(51基础篇) - 022 N76e003 APROM模拟EEPROM驱动
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驱动的更多相关文章
- 单片机成长之路(51基础篇) - 015 关于sdcc的多文件编译范例二
本文是续 单片机成长之路(51基础篇) - 009 关于sdcc的多文件编译范例(一)编写的. 在实际的工作中,单片机的头文件和功能函数不可能同全部放在同一个文件夹下面,我们把单片机成长之路(51基础 ...
- 单片机成长之路(51基础篇) - 009 关于sdcc的多文件编译范例(一)
本文是续 单片机成长之路(51基础篇) - 006 在Linux下搭建51单片机的开发烧写环境编写的. 本范例主要由(main.c ,delay.h,delay.c,makefile)4个文件组成,s ...
- (转)Python成长之路【第九篇】:Python基础之面向对象
一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...
- Sass进阶之路,之一(基础篇)
Sass 学习Sass之前,应该要知道css预处理器这个东西,css预处理器是什么呢? Css预处理器定义了一种新的语言将Css作为目标生成文件,然后开发者就只要使用这种语言进行编码工作了.预处理器通 ...
- python成长之路第三篇(1)_初识函数
目录: 函数 为什么要使用函数 什么是函数 函数的返回值 文档化函数 函数传参数 文件操作(二) 1.文件操作的步骤 2.文件的内置方法 函数: 一.为什么要使用函数 在日常写代码中,我们会发现有很多 ...
- C++自学成长之路(第一篇)
今天开始我将开启C++自学成长之路,今天是第一天,在以前就一直在网上查找关于c++的资料,想买一本好一点的,权威一点的资料书,通过努力查找,我选择了c++ primer,在网上这本书的好评如潮.更多的 ...
- 单片机成长之路(51基础篇) - 008 C51 的标示符和关键字
标准 C 语言定义了 32 个关键字,如下表(ANSI C的32个关键字): C51在此基础上针对单片机功能进行了扩展,详情见下表(C51编译器扩充关键字): C 51的数据类型 51单片机使用的C语 ...
- 单片机成长之路(51基础篇) - 006 在Linux下搭建51单片机的开发烧写环境
在Linux下没有像keli那样好用的IDE来开发51单片机,开发环境只能自己搭建了. 第一步:安装交叉编译工具 a) 安装SDCC sudo apt-get install sdcc b)测试SDC ...
- 单片机成长之路(51基础篇) - 002 STC单片机冷启动和复位有什么区别
STC单片机简介 STC单片机是一款增强型51单片机,完全兼容MCS-51,还增加了新的功能,比如新增两级中断优先级,多一个外中断,内置EEPROM,硬件看门狗,具有掉电模式,512B内存等.还支持I ...
随机推荐
- L - Ray in the tube Gym - 101911L (暴力)
---恢复内容开始--- You are given a tube which is reflective inside represented as two non-coinciding, but ...
- Django分页(一)
Django分页(一) 手动实现简单分页 HTML <!DOCTYPE html> <html lang="en"> <head> <me ...
- HashMap 源码阅读
前言 之前读过一些类的源码,近来发现都忘了,再读一遍整理记录一下.这次读的是 JDK 11 的代码,贴上来的源码会去掉大部分的注释, 也会加上一些自己的理解. Map 接口 这里提一下 Map 接口与 ...
- BZOJ-7-2655: calc-DP-拉格朗日插值
https://www.lydsy.com/JudgeOnline/problem.php?id=2655 以上是对 dp 一小部分打的表.dp[ i ] [ j ] 含义为 前 i 个 数 中 选 ...
- Java数组常用方法
数组基础:http://www.cnblogs.com/mengdd/archive/2013/01/04/2844264.html import java.util.Arrays; 1):创建数组 ...
- F5-VM
如果找不到的话,点击下面的链接.链接包含物理主机镜像和虚机主机镜像,选择virtual Edition. BIG-IP v11.x / Virtual Edition https://download ...
- Spring使用笔记(二)Bean装配
Bean装配 Spring提供了3种装配机制: 1)隐式的Bean发现机制和自动装配 2)在Java中进行显示装配 3)在XML中进行显示装配 一)自动化装配 1.指定某类为组件类: @Compone ...
- 解决linux环境mysql的sql语句严格区分大小写问题
在Windows环境下,mysql数据库的sql语句是不区分字母大小写的,但是程序移植到linux环境中,就会造成某些大小写不一致的语句执行失败,解决方法如下: 首先打开/etc/mysql/my.c ...
- 【开源GPS追踪】 之 手机端安卓版
GPS追踪,后台是利用的是开源的Opengts,可以通过web方式浏览位置信息.这里介绍一款手机端软件go Tracker. 这款软件是在Google app 上找到的,目前还没有找到源码,用了几天有 ...
- PAT基础6-1
6-1 简单输出整数 (10 分) 本题要求实现一个函数,对给定的正整数N,打印从1到N的全部正整数. 函数接口定义: void PrintN ( int N ); 其中N是用户传入的参数.该函数必须 ...