- /*---------------------------------------------------------------------*/
- /* --- STC MCU Limited ------------------------------------------------*/
- /* --- STC15F4K60S4 系列 内部EEPROM举例--------------------------------*/
- /* --- Mobile: (86)13922805190 ----------------------------------------*/
- /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
- /* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*/
- /* --- Web: www.STCMCU.com --------------------------------------------*/
- /* --- Web: www.GXWMCU.com --------------------------------------------*/
- /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
- /* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序 */
- /*---------------------------------------------------------------------*/
-
- //本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
- //若无特别说明,工作频率一般为11.0592MHz
-
- #include "stc8g.h"
- #include "intrins.h"
- #include <stdio.h>
-
- #define MAIN_Fosc 11059200UL
- #define BRT (65536 - MAIN_Fosc / 115200 / 4)
-
- typedef unsigned char u8; //BYTE
- typedef unsigned int u16; //WORD
-
- u16 kkk;
- u16 IAP_ADDRESS=0x0801;
-
-
- //#define IAP_ADDRESS 0x0800 //测试地址
-
- void Delay(u8 n);
- void IapIdle();
- u8 IapReadByte(u16 addr);
- void IapProgramByte(u16 addr, u8 dat);
- void IapEraseSector(u16 addr);
- void PWM_init(void);
-
- void UartInit()
- {
- SCON = 0x5a;
- TL1 = BRT;
- TH1 = BRT >> 8;
- TR1=1;
- AUXR = 0x40;
- }
-
- void main()
- {
- u16 i;
- P_SW2=0x80;
-
- P1M0 = 0x00; P1M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00;
-
- UartInit();
- PWM_init();
-
-
- kkk=IapReadByte(IAP_ADDRESS) ;
-
- printf("kkk=%bu addr=%u\r",kkk,IAP_ADDRESS);
-
- // IapEraseSector(IAP_ADDRESS);
- // IapProgramByte(IAP_ADDRESS, kkk);
- // IAP_ADDRESS++;
-
-
-
- // P3 = 0xfe; //1111,1110 系统OK
- Delay(5); //延时
- IapEraseSector(IAP_ADDRESS); //扇区擦除
- for (i=0; i<500; i++) //检测是否擦除成功(全FF检测)
- {
- if (IapReadByte(IAP_ADDRESS+i) != 0xff)
- goto Error; //如果出错,则退出
- }
- // P3 = 0xfc; //1111,1100 擦除成功
- Delay(5); //延时
- for (i=0; i<500; i++) //编程512字节
- {
- IapProgramByte(IAP_ADDRESS+i, (u8)i);
- }
- // P3 = 0xf8; //1111,1000 编程完成
- Delay(5); //延时
- for (i=0; i<500; i++) //校验512字节
- {
- if (IapReadByte(IAP_ADDRESS+i) != (u8)i)
- goto Error; //如果校验错误,则退出
- }
- // P3 = 0xf0; //1111,0000 测试完成
- CCAP2H=kkk;
- printf("dz=%bu dz1=%u\r",kkk,IAP_ADDRESS);
- while (1);
- Error:
- // P3 &= 0x7f; //0xxx,xxxx IAP操作失败
- while (1);
- }
-
- /*----------------------------
- 软件延时
- ----------------------------*/
- void Delay(u8 n)
- {
- u16 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区域读取一字节
- ----------------------------*/
- u8 IapReadByte(u16 addr)
- {
- u8 dat; //数据缓冲区
-
- IAP_CONTR = 0x80; //使能IAP
- IAP_TPS = 12; //设置等待参数12MHz
-
- IAP_CMD = 1; //设置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(u16 addr, u8 dat)
- {
- IAP_CONTR = 0x80; //使能IAP
- IAP_TPS = 12; //设置等待参数12MHz
- IAP_CMD = 2; //设置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(u16 addr)
- {
- IAP_CONTR = 0x80; //使能IAP
- IAP_TPS = 12; //设置等待参数12MHz
- IAP_CMD = 3; //设置IAP命令
- IAP_ADDRL = addr; //设置IAP低地址
- IAP_ADDRH = addr >> 8; //设置IAP高地址
- IAP_TRIG = 0x5a; //写触发命令(0x5a)
- IAP_TRIG = 0xa5; //写触发命令(0xa5)
- _nop_(); //等待ISP/IAP/EEPROM操作完成
- IapIdle();
- }
-
- //// 初始化PWM功能 P55 pwm
- void PWM_init(void)
- {
- P_SW1=0x20;
- CCON = 0x00;
- CMOD = 0x08;
- CL = 0x00;
- CH = 0x00;
-
- CCAPM2 = 0x42;
- PCA_PWM2 = 0x00;
- CCAP2L = 0x00;
- CCAP2H = 0x00;
- CR=1;
- }
复制代码
|