- #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)
2021-12-22 21:31 上傳
點擊文件名下載附件
|