STC12C5620AD系列单片机EEPROM/IAP 功能测试程序(官方改良版,增加串口监控功能,本人亲自测试通过)

//STC12C5620AD系列单片机EEPROM/IAP 功能测试程序演示
/*--------------------------------------------------------------------------*/
/* --- STC MCU International Limited ---------------------------------------*/
/* --- 演示STC 1T 系列单片机 EEPROM/IAP功能------------------------------*/
/* --- Mobile: (86)13922805190 ---------------------------------------------*/
/* --- Fax: 86-755-82944243 ------------------------------------------------*/
/* --- Tel: 86-755-82948412 ------------------------------------------------*/
/* --- Web: www.STCMCU.com -------------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序,---------------------------------*/
/* 请在程序中或文章中注明使用了宏晶科技的资料及程序-------------------------*/
/*--------------------------------------------------------------------------*/

// 在STC官方手册例程的基础上加上了串口打印功能,方便看出测试成功否?
// 连续打印512次01表示读成功;连续打印512次02表示写成功;
// 连续打印512次03表示检验比对成功;打印1次04测试程序完成

//#include "reg51.h"
#include "intrins.h"
#include "STC12C5608AD.h"

typedef unsigned char u8;
typedef unsigned int u16;

/* Declare SFR associated with the IAP */
sfr IAP_DATA = 0xE2;  //Flash data register
sfr IAP_ADDRH = 0xE3;  //Flash address HIGH
sfr IAP_ADDRL = 0xE4;  //Flash address LOW
sfr IAP_CMD  = 0xE5;  //Flash command register
sfr IAP_TRIG = 0xE6;  //Flash command trigger
sfr IAP_CONTR = 0xE7;  //Flash control register

/*Define ISP/IAP/EEPROM command*/
#define CMD_IDLE 0  //Stand-By
#define CMD_READ 1  //Byte-Read
#define CMD_PROGRAM 2  //Byte-Program
#define CMD_ERASE 3  //Sector-Erase

/*Define ISP/IAP/EEPROM operation const for IAP_CONTR*/
//#define ENABLE_IAP   0x80 //if SYSCLK<30MHz
//#define ENABLE_IAP   0x81 //if SYSCLK<24MHz
//#define ENABLE_IAP   0x82 //if SYSCLK<20MHz
#define  ENABLE_IAP   0x83 //if SYSCLK<12MHz
//#define ENABLE_IAP 0x84 //if SYSCLK<6MHz
//#define ENABLE_IAP 0x85 //if SYSCLK<3MHz
//#define ENABLE_IAP 0x86 //if SYSCLK<2MHz
//#define ENABLE_IAP 0x87 //if SYSCLK<1MHz

//Start address for STC12C5620AD series EEPROM
#define IAP_ADDRESS 0x0400

#define FOSC 11059200L
#define BAUD 9600

void Delay(u8 n);
void IapIdle();
u8 IapReadu8(u16 addr);
void IapProgramu8(u16 addr, u8 dat);
void IapEraseSector(u16 addr);

void Uart0_init()
{
 TMOD = 0x21;
 TH1 = TL1 = -(FOSC/12/32/BAUD);
 SCON = 0x50;
 PCON = 0x00;
 TR1 = 1;
 ES = 1;
 EA = 1;
}

void UART0_SendByte(u8 comd)
{
 SBUF=comd;
 while(!TI);
 TI=0;
}

void main()
{
 u16 i;
 Uart0_init();
 
 P1 = 0xfe;  //1111,1110 System Reset OK
 Delay(10);  //Delay
 IapEraseSector(IAP_ADDRESS); //Erase current sector
 for (i=0; i<512; i++)   //Check whether all sector data is FF
 {
  if (IapReadu8(IAP_ADDRESS+i) != 0xff)
   goto Error;    //If error, break
  else
   UART0_SendByte(0x01);
 }
 P1 = 0xfc;  //1111,1100 Erase successful
 Delay(10);  //Delay
 for (i=0; i<512; i++)  //Program 512 u8s data into data flash
 {
  IapProgramu8(IAP_ADDRESS+i, (u8)i);
  UART0_SendByte(0x02);
 }
 P1 = 0xf8;  //1111,1000 Program successful
 Delay(10);  //Delay
 for (i=0; i<512; i++)  //Verify 512 u8s data
 {
  if (IapReadu8(IAP_ADDRESS+i) != (u8)i)
   goto Error;    //If error, break
  else
   UART0_SendByte(0x03);
 }
 P1 = 0xf0;  //1111,0000 Verify successful
 UART0_SendByte(0x04);
 while (1);
Error:
 P1 &= 0x7f;  //0xxx,xxxx IAP operation fail
 UART0_SendByte(0x08);
 while(1);
}
/*-----Software delay function-----*/
void Delay(u8 n)
{
 u16 x;
 while (n--)
 {
  x = 0;
  while (++x);
 }
}
/*-----Disable ISP/IAP/EEPROM function
 Make MCU in a safe state
----------------------------*/
void IapIdle()
{
 IAP_CONTR = 0;  //Close IAP function
 IAP_CMD = 0;  //Clear command to standby
 IAP_TRIG = 0;  //Clear trigger register
 IAP_ADDRH = 0x80; //Data ptr point to non-EEPROM area
 IAP_ADDRL = 0;  //Clear IAP address to prevent misuse
}
/*-----Read one u8 from ISP/IAP/EEPROM area
 Input: addr (ISP/IAP/EEPROM address)
 Output: Flash data
----------------------*/
u8 IapReadu8(u16 addr)
{
 u8 dat;    //Data buffer
 IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time
 IAP_CMD = CMD_READ;  //Set ISP/IAP/EEPROM READ command
 IAP_ADDRL = addr;  //Set ISP/IAP/EEPROM address low
 IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high
 IAP_TRIG = 0x46;  //Send trigger command1 (0x46)
 IAP_TRIG = 0xb9;  //Send trigger command2 (0xb9)
 _nop_();    //MCU will hold here until ISP/IAP/EEPROM
 //operation complete
 dat = IAP_DATA;   //Read ISP/IAP/EEPROM data
 IapIdle();    //Close ISP/IAP/EEPROM function
 return dat;    //Return Flash data
}
/*-----Program one u8 to ISP/IAP/EEPROM area
 Input: addr (ISP/IAP/EEPROM address)
   dat (ISP/IAP/EEPROM data)
 Output:
-----------------------------*/
void IapProgramu8(u16 addr, u8 dat)
{
 IAP_CONTR = ENABLE_IAP;
 IAP_CMD = CMD_PROGRAM;
 IAP_ADDRL = addr;
 IAP_ADDRH = addr >> 8;
 IAP_DATA = dat;   //Write ISP/IAP/EEPROM data
 IAP_TRIG = 0x46;
 IAP_TRIG = 0xb9;
 _nop_();
 IapIdle();
}
/*-----Erase one sector area
 Input: addr (ISP/IAP/EEPROM address)
 Output:
-----------------------------*/
void IapEraseSector(u16 addr)
{
 IAP_CONTR = ENABLE_IAP;
 IAP_CMD = CMD_ERASE;
 IAP_ADDRL = addr;
 IAP_ADDRH = addr >> 8;
 IAP_TRIG = 0x46;
 IAP_TRIG = 0xb9;
 _nop_();
 IapIdle();
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值