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();
}
/*--------------------------------------------------------------------------*/
/* --- 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();
}
相关文章推荐
- STC51系列单片机不断电自动下载程序
- FCKeditor.NET 自定义上传目录和文件名 [本人亲自测试通过]
- 源码编译LAMP架构,phpMyadmin管理数据库,增加xcache加速功能,通过ab测试效果。
- STC单片机 IAP(EEPROM)的使用
- STC单片机 IAP(EEPROM)的使用
- java备份还原mysql数据库(源码经过本人亲自测试通过)
- STC单片机用户应用程序区和ISP监控程序区的区别
- 控制发送SMS信息的C51程序[GSM模块(M22)通过串口与单片机相连]
- 通过IO口控制STC15F2K60S2系列单片机输出pwm
- 单片机小知识系列-2-stc单片机不能下载程序问题原因总结
- java备份还原mysql数据库(源码经过本人亲自测试通过)
- 对STC15系列单片机EEPROM使用感受
- android手机通过串口蓝牙透传模块与AVR单片机通信实例。。。蓝牙服务程序案例
- 【智能无线小车系列十】通过USB摄像头实现网络监控功能
- stm32l01系列单片机通过串口编程(ISP)
- [15单片机] STC15F104W开发入门及模拟串口程序
- STC15F2K60S2/STC15系列读取MPU6050陀螺仪角度加速度串口显示程序代码
- 关于STC IAP系列单片机下载不进的解决办法
- 这个当单片机程序怎么会不停的通过串口发数据,设置波特率为9600,但是串口软件接受数据不对(初学者,请高手指教)
- STC双串口单片机无法烧写下载程序原因,普中开发箱,STC12C5A60S2