- #include <STC15F2K60S2.H>
- #include <math.h> //Keil library
- #include <stdio.h> //Keil library
- #include "EEPROM.h"
- #define FOSC 11059200UL
- #define BAUD 115200
- #define URMD 0 //0:使用定时器2作为波特率发生器
- //1:使用定时器1的模式0(16位自动重载模式)作为波特率发生器
- //2:使用定时器1的模式2(8位自动重载模式)作为波特率发生器
-
-
- void InitUart();
- void main()
- {
- uint datas;
- uint i=0;
- uint j=0;
- uint m=0;
- InitUart();
-
- while(EEPROM_init()==0);
- TI=1;printf("Erase succeeded.\n");TI=0; //1111,1100 擦除成功
- for (i=0; i<512; i++) //编程512字节
- {
- IapProgramByte(IAP_ADDRESS+i,i);
- }
- TI=1;printf("2");TI=0; //1111,1100 擦除成功
- while (j<512)
- {
- datas=IapReadByte(IAP_ADDRESS+j);
- TI=1;
- printf("%x:",IAP_ADDRESS+j);
- printf("%d\n",datas);
- TI=0;
- j++;
- Delay(1);
- }
- }
- /*----------------------------
- 初始化串口
- ----------------------------*/
- void InitUart()
- {
- SCON = 0x5a; //设置串口为8位可变波特率
- #if URMD == 0
- T2L = (65536 - (FOSC/4/BAUD));
- T2H = (65536 - (FOSC/4/BAUD)) >> 8;
- AUXR = 0x14; //T2为1T模式, 并启动定时器2
- AUXR |= 0x01; //选择定时器2为串口1的波特率发生器
- #elif URMD == 1
- AUXR = 0x40; //定时器1为1T模式
- TMOD = 0x00; //定时器1为模式0(16位自动重载)
- TL1 = (65536 - (FOSC/4/BAUD));
- TH1 = (65536 - (FOSC/4/BAUD)) >> 8;
- TR1 = 1; //定时器1开始启动
- #else
- TMOD = 0x20; //设置定时器1为8位自动重装载模式
- AUXR = 0x40; //定时器1为1T模式
- TH1 = TL1 = (256 - (FOSC/32/BAUD));
- TR1 = 1;
- #endif
- }
复制代码- #include "EEPROM.h"
- /*----------------------------
- 软件延时
- ----------------------------*/
- void Delay(BYTE n)
- {
- WORD x;
- while (n--)
- {
- x = 0;
- while (++x);
- }
- }
- /*----------------------------
- 关闭IAP
- ----------------------------*/
- void IapIdle()
- {
- IAP_CONTR = 0; //关闭IAP功能
- IAP_CMD = 0; //清除命令寄存器
- IAP_TRIG = 0; //清除触发寄存器
- IAP_ADDRH = 0x80; //将地址设置到非IAP区域
- IAP_ADDRL = 0;
- }
- /*----------------------------
- 从ISP/IAP/EEPROM区域读取一字节
- ----------------------------*/
- uint IapReadByte(WORD addr)
- {
- uchar dat; //数据缓冲区
- IAP_CONTR = ENABLE_IAP; //使能IAP
- IAP_CMD = CMD_READ; //设置IAP命令
- IAP_ADDRL = addr; //设置IAP低地址
- IAP_ADDRH = addr >> 8; //设置IAP高地址
- IAP_TRIG = 0x5a; //写触发命令(0x5a)
- IAP_TRIG = 0xa5; //写触发命令(0xa5)
- _nop_(); //等待ISP/IAP/EEPROM操作完成
- dat = IAP_DATA; //读ISP/IAP/EEPROM数据
- IapIdle(); //关闭IAP功能
- return dat; //返回
- }
- /*----------------------------
- 写一字节数据到ISP/IAP/EEPROM区域
- ----------------------------*/
- void IapProgramByte(WORD addr, BYTE dat)
- {
- IAP_CONTR = ENABLE_IAP; //使能IAP
- IAP_CMD = CMD_PROGRAM; //设置IAP命令
- IAP_ADDRL = addr; //设置IAP低地址
- IAP_ADDRH = addr >> 8; //设置IAP高地址
- IAP_DATA = dat; //写ISP/IAP/EEPROM数据
- IAP_TRIG = 0x5a; //写触发命令(0x5a)
- IAP_TRIG = 0xa5; //写触发命令(0xa5)
- _nop_(); //等待ISP/IAP/EEPROM操作完成
- IapIdle();
- }
- /*----------------------------
- 扇区擦除
- ----------------------------*/
- void IapEraseSector(WORD addr)
- {
- IAP_CONTR = ENABLE_IAP; //使能IAP
- IAP_CMD = CMD_ERASE; //设置IAP命令
- IAP_ADDRL = addr; //设置IAP低地址
- IAP_ADDRH = addr >> 8; //设置IAP高地址
- IAP_TRIG = 0x5a; //写触发命令(0x5a),每次IAP操作时,都要对IAP_TRIG先写入5AH,再写入A5H,ISP/IAP命令才会生效。
- IAP_TRIG = 0xa5; //写触发命令(0xa5)
- _nop_(); //等待ISP/IAP/EEPROM操作完成
- IapIdle();
- }
- uint EEPROM_init()
- {
- uint s;
- IapEraseSector(IAP_ADDRESS); //扇区擦除
- TI=1;printf("扇区擦除\n");TI=0;
-
- for (s=0; s<512; s++) //检测是否擦除成功(全FF检测)
- {
- if (IapReadByte(IAP_ADDRESS+s) != 0xff)
- return 0;
- }
-
- Delay(10); //延时
- return 1;
- }
复制代码
Keil代码下载:
内部EEPROM使用.rar
(38.96 KB, 下载次数: 85)
|