您的位置:首页 > 运维架构

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

2013-10-16 15:33 891 查看
//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();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息