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