A94B114A芯片EEPROM程序Word格式文档下载.docx

上传人:b****5 文档编号:17013431 上传时间:2022-11-27 格式:DOCX 页数:18 大小:19.43KB
下载 相关 举报
A94B114A芯片EEPROM程序Word格式文档下载.docx_第1页
第1页 / 共18页
A94B114A芯片EEPROM程序Word格式文档下载.docx_第2页
第2页 / 共18页
A94B114A芯片EEPROM程序Word格式文档下载.docx_第3页
第3页 / 共18页
A94B114A芯片EEPROM程序Word格式文档下载.docx_第4页
第4页 / 共18页
A94B114A芯片EEPROM程序Word格式文档下载.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

A94B114A芯片EEPROM程序Word格式文档下载.docx

《A94B114A芯片EEPROM程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《A94B114A芯片EEPROM程序Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。

A94B114A芯片EEPROM程序Word格式文档下载.docx

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.

#

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1