单片机成长之路(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 ...
随机推荐
- tp5的路由
路由模式:普通.强制和混合 普通模式: //配置文件关闭路由,完全使用默认的PATH_INFO方式URL 'url_route_on' => false, 关闭路由后的普通模式任然可以通过操作方 ...
- 01++ Bookshelf 2
http://poj.org/problem?id=3628 就是比原题多了一个要求,输出>=m的最小值 kisang~独立做出来的都开心<( ̄︶ ̄)> #include<cs ...
- 开源医学图像处理平台NiftyNet介绍
18年下半年10月份左右,老师分配有关NiftyNet平台的相关学习的任务,时隔5个月,决定整理一下以前的笔记,写成相应的博客! 目录 1.NiftyNet平台简介 2.NiftyNet平台架构设计 ...
- Java8中的 lambda 和Stream API
前言 由于项目中用到了比较多有关于 Java8 中新的东西,一开始自己只是会写,但是写起来不太顺,然后就在网上找到了一个很好的关于Java8新特性的视频,所以就进行了学习了一下,以下是自己对 la ...
- python数据结构之栈
栈 栈(stack),有些地方称为堆栈,是一种容器,可存入数据元素.访问元素.删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标,英语:top)进行加入数据(英语:push)和输出数据(英语: ...
- Android自定义View前传-View的三大流程-Measure
Android自定义View前传-View的三大流程-Measure 参考 <Android开发艺术探索> https://developer.android.google.cn/refe ...
- Redis自学笔记:1.简介
博主教材:李子骅.人民邮电出版社.<redis入门指南> 博主操作系统系统:虚拟机Ubuntu16.04 博主redis版本:3.0.6 第1章:简介 redis是一个开源的.高性能的.基 ...
- [Python]list.append字典的时候,修改字典会导致list内容变化的问题
今天写了这样的一段代码,出现了BUG. log_message["EventName"] = "上架->可用" log_message["Eve ...
- SPOJ COT3.Combat on a tree(博弈论 Trie合并)
题目链接 \(Description\) 给定一棵\(n\)个点的树,每个点是黑色或白色.两个人轮流操作,每次可以选一个白色的点,将它到根节点路径上的所有点染黑.不能操作的人输,求先手是否能赢.如果能 ...
- Java笔记(七)HashMap和HashSet
HashMap和HashSet 一)HashMap 1.Map接口 interface Map<K,V> { int size();//查看Map中的键值对个数 boolean isEmp ...