A94B114A芯片EEPROM程序Word格式文档下载.docx
《A94B114A芯片EEPROM程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《A94B114A芯片EEPROM程序Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
Input,1:
Output
P0=0x00;
Low,1:
High
P0OD=0x00;
Disable,1:
Enable
P0PU=0x00;
P0DB=0x00;
Enable(De-bouncelength:
1.2us+-10%)
P1IO=0xff;
P1=0x00;
P1OD=0x00;
P1PU=0x00;
P1DB=0x00;
P2IO=0xff;
P2=0x00;
P2OD=0x00;
P2PU=0x00;
P2DB=0x00;
P0FSR=0;
P1FSR=0;
P2FSR=0;
}
voidInitial_Clock()
BITCR=0x04;
//fx/4096=16MHz/4096=256usBITClock*32=256us*32=122Hz
WDTMR=0;
//
SYSCON_AR=0x5A;
//toaccessSCCR,OSCCRregister,SYSCON_ARshouldbeset0x5A
#if0
OSCCR=0x04;
//LFO-128KHz;
HFO-16MHz,IRC
while((BITCR&
0x80)==0);
//BIToverflow16.384mswaittime@int_osc16Mhz
BITCR&
=0x7F;
//ThisvaluecanbereducedifonlyHFOIRCisused.
SCCR=0x40;
//8ms,IRCsystemclock
HFO-16MHz,IRC
#else
//externalclock(8.000000MHz)
OSCCR=0x07;
//EnableHighIRCandXinandLFO128KHZ=WDT-RC
BITCR=0x0c;
//Setwaitingtime:
8ms@16MHz
while((BITCR&
0x80)==0);
//IRCstabilizingtime
SCCR=0x41;
//ChangetoXin
//OSCCR&
=~0x04;
//DisableHighfreq.OSC
#endif
SYSCON_AR=0x00;
//initializeWatch-dogtimer
//period=200.000000mS
WDTR=0x18;
//period8ms*(24+1)=200ms
WDTMR=0x7E;
//settingfLFO:
256KHZ/2048=8ms
//WDTMR=0x7C;
WDTMR|=0x01;
//enable
//IE2|=0x02;
//EnableWDTinterrupt
//ApproximateNOPDelay.(沥犬窍柳臼澜)
voidNop_1us_16Mhz(void)
NOP;
//NOP=62.6ns(@16Mhz)62.5ns*16=1us
//NOP;
//LCALL=2clock
//RET=4clock
voidTimer0_Initial(void)
//initializeTimer0
//TIMER0STOP
#if0
T0CR=0x07;
//fx/32=16Mhz/32=2us
T0CDR=62;
//2*(62+1)=126us
#else
T0CR=0x04;
//fx/8=8Mhz/8=1us
T0CDR=124;
//1*(124+1)=125us
#endif
//TIMER0START
T0CR|=0x81;
IE1|=0x10;
//Timer0interruptstart
unsignedchardecision;
unsignedcharus;
unsignedcharms;
unsignedintcount=0;
unsignedinterr_count=0;
voidMain(void)
IE=0x00;
//GlobalInterruptDisable
LVIR=0x00;
//LVI/LVIRDisable
decision=0xff;
Initial_Clock();
Port_Initial();
LVIR=0x21;
//4usDe-bounceEnable,HFOIRCOnly!
!
2.4VReset
//WhenLVIRisselected,thefirstLVIRflagcanbegenerated.
//Therefore,aftersettingLVIR,cleartheIRQafteratleastNOPx4Delay.
IRQ2&
=0xF7;
//LVIINTrequestflagClear(IRQ2.3)
IE2|=0X08;
//LVIInterrupstart,BIT,WDT,ADCinterrupOFF
Timer0_Initial();
//
RSFR=0x00;
IE|=0x80;
//allinterruptstart
while
(1)
{
WDTMR|=0x04;
//Clearwatch-dogtimer
//if(ms>
=100)//100ms
//{//实际为105.75ms,因为EEPROM操作中有关闭了总中断,32byteEEPROM使用6ms
=200)//25ms*200=5s
if(ms>
=4)//25ms*4=100ms
{
ms=0;
P0=~P0;
decision=test_self_PGM();
NOP;
Nop_1us_16Mhz();
Flash_Read(0x1fe0,Test_Flash_Read);
if(decision)
{
err_count++;
}
else
count++;
}
}
if(count>
50000)
break;
}
voidT0_Int_Handler(void)interrupt9
{//125us溢出时间准确用示波器测试确定
us++;
if(us>
=200)//125us*200=25ms
us=0;
ms++;
P1=~P1;
//T0_INT_F=0;
voidINT_WDT()interrupt13
{//200ms示波器测试确定
//Watch-dogtimerinterrupt
//TODO:
addyourcodehere
//P0=~P0;
////////////////////////////////////////////////////////////////////////////////////////////////////
//===FLASHCODE===
#definePGM_TIME0x9D//2.5ms
//#definePGM_TIME170//2.6ms@32MHz+5%
//#definePGM_TIME179//2.88ms@32MHz+5%
#defineNOP_nop_()
//forFlashEndurance
#definePAGEBUF_SIZE32
#definecoderom((unsignedcharvolatilecode*)0)//Coderomstartaddress
#defineDUMMY_FLASH_ADDRESS0x2200//Setadummywriteareawithintheprotectionzone.
#defineFLASH_ERASE_SECURITY_ID0x45
#defineFLASH_WRITE_SECURITY_ID0x9A
#definePAGE_SIZE32
#defineSELF_PGM_OK0
#defineSELF_PGM_ERASE_ERROR1
#defineSELF_PGM_VERIFY_ERROR2
//#defineUSE_SECTOR_NUM255//第255page使用作为EEPROM
#defineEEPROM_START_ADDR(0x1FE0)//255page作为EEPROM,地址为1FE0开始
#defineEEPROM_END_ADDR(0x1FFF)
volatileunsignedcharcodeEEPROM_1[PAGE_SIZE]_at_EEPROM_START_ADDR;
//Donotchangethisdefine.
//code_buf,g_FEMR,g_FECR,g_WDTMRmustbedataarea.(Donotdefineatxdataareaoridata.)
volatileunsignedchardatacode_buf[20]_at_0x30;
//Lower128bytesinternalRAM.(GPRAddress0x30~0x7F)
unsignedchardatag_FEMR,g_FECR,g_WDTMR;
volatileunsignedcharg_IE,g_IE1,g_IE2;
//InterruptEnableReg.Buffer
//unsignedinterraddr;
bitpcs;
unsignedcharidataTest_Flash_Pattern[32];
#pragmaSAVE
#pragmaOPTIMIZE(7)
//============================================================================
//GlobalInterruptDisable
voidcli()
unsignedchari=0;
g_IE=IE;
g_IE1=IE1;
g_IE2=IE2;
IE=i;
IE1=i;
IE2=i;
//GlobalInterruptEnable
voidsei()
IE2=g_IE2;
IE1=g_IE1;
IE=g_IE;
//=============================================================================
unsignedchartest_self_PGM()
charreturn_state;
unsignedchari;
if(pcs)
for(i=0;
i<
32;
i++)
Test_Flash_Pattern[i]=i;
else
for(i=0;
{
Test_Flash_Pattern[i]=0xaa;
}
pcs=~pcs;
//EEPROM擦写地址起始位
return_state=Flash_Erase((unsignedint)EEPROM_START_ADDR);
if(return_state!
=0)
{
returnSELF_PGM_ERASE_ERROR;
return_state=Flash_Write((unsignedint)EEPROM_START_ADDR,Test_Flash_Pattern);
returnSELF_PGM_VERIFY_ERROR;
returnSELF_PGM_OK;
//Sram-jumpProgramRoutine.
//mustexecuteinSRAM!
0~0x11(codesize:
18byte)
//Donotchangethisroutine.
voidwrite_page_buffer_src()
FEMR=FLASH_SEL|//FSEL(SelectFlashmemory)
FLASH_PBUFF_SEL|//PBUFF(Selectpagebuffer)
FLASH_CON_ENABLE;
//FEEN(Enableprogram&
erase)
#pragmaasm
movr0,#32
movdptr,#0x10E0;
pagebufferaddress
write_page_buffer_src_loop:
mova,@r1
movx@dptr,a
incr1
incdptr
djnzr0,write_page_buffer_src_loop
#pragmaendasm
FEMR=0;
0~0x0E(codesize:
15byte)
voiddo_flash_at_sram_src()
movFEMR,g_FEMR//3byte
movFECR,g_FECR//3byte
_flash_busy_wait:
movA,FESR//2byte
JNBACC.7,_flash_busy_wait//3byte
clrA//1byte
movFEMR,A//2byte
//Csource
//FEMR=g_FEMR;
//FECR=g_FECR;
//NOP;
//while(!
(FESR&
0x80));
//FEMR=0;
}//RET//1byte
voidFlash_Enter()
cli();
//GlobalInterruptDisable
g_WDTMR=WDTMR;
//BackupWDTMR
//WatchDogTimerStop.
g_WDTMR|=0x04;
//ClearWDTCounter
//ToaccessFlashControlregister,ENTRY_0~2shouldbeset0xAA,0x55,0xA5.
*(unsignedcharxdata*)0x10D8=0xAA;
*(unsignedcharxdata*)0x10DA=0x55;
*(unsignedcharxdata*)0x10DD=0xA5;
FEARL=(unsignedchar)(DUMMY_FLASH_ADDRESS&
0xff);
FEARM=(unsignedchar)((DUMMY_FLASH_ADDRESS>
>
8)&
FEARH=0;
voidFlash_Exit()
FECR=FLASH_MODE_EXIT;
//AftertochangeFlashControlregister,ENTRY_0~2shouldbeset0x00.
*(unsignedcharxdata*)0x10D8=0x00;
*(unsignedcharxdata*)0x10DA=0x00;
*(unsignedcharxdata*)0x10DD=0x00;
//Flashcodebufferramclear.
#