您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 第十二章AVR看门狗及EEPROM
第十二章AVR看门狗及EEPROM2007、06、26AVR看门狗引入看门狗的意义防止程序跑飞增强系统抗干扰能力AVR看门狗AVR看门狗看门狗使用一个独立的定时器,时钟源为内置1Mhz独立振荡器当看门狗定时器定时溢出时,将产生1CLK宽度的复位脉冲定时间隔由看门狗预分频器调节程序执行时,定期复位看门狗定时器,以保证看门狗不产生复位脉冲程序跑飞时,由于在定时间隔内没有复位看门狗定时器的操作,当定时溢出时,系统复位。AVR看门狗AVR看门狗与看门狗相关的寄存器WDTCRWDTOE:看门狗修改使能清零WDE时必须置位WDTOE,否则不能禁止看门狗。一旦置位,硬件将在紧接的4个时钟周期之后将其清零。AVR看门狗WDE:使能看门狗WDE为“1“时,看门狗使能,否则看门狗将被禁止。只有在WDTOE为”1“时WDE才能清零。以下为关闭看门狗的步骤:在同一个指令内对WDTOE和WDE写1“,即使WDE已经为1“在紧接的4个时钟周期之内对WDE写0”AVR看门狗AVR看门狗voidWDT_off(void){/*WDT复位*/_WDR();/*置位WDTOE和WDE*/WDTCR|=(1WDTOE)|(1WDE);/*关闭WDT*/WDTCR=0x00;}AVR看门狗在ICC中,macros.h头文件中预定义了复位看门狗定时器的宏WDR()//Watchdoginitialize//prescale:2048Kvoidwatchdog_init(void){WDR();//thispreventsatimoutonenablingWDTCR=0x0F;//WATCHDOGENABLED-dontforgettoissueWDRs}AVR内置EEPROMATmega16内置512字节的EEPROM与EEPROM相关的寄存器EEPROM地址寄存器-EEARH和EEARLEEPROM数据寄存器-EEDREEPROM控制寄存器-EECRAVR内置EEPROMEEPROM地址寄存器-EEARH和EEARL指定了512字节的EEPROM空间。EEPROM地址是线性的,从0到511。EEAR的初始值没有定义。在访问EEPROM之前必须为其赋予正确的数据。AVR内置EEPROMEEPROM数据寄存器-EEDR对于EEPROM写操作,EEDR是需要写到EEAR单元的数据;对于读操作,EEDR是从地址EEAR读取的数据。AVR内置EEPROMEEPROM控制寄存器-EECREERIE:使能EEPROM准备好中断当EEWE清零时EEPROM准备好中断即可发生。AVR内置EEPROMEEPROM控制寄存器-EECREEMWE:EEPROM主机写使能EEMWE决定了EEWE置位是否可以启动EEPROM写操作。当EEMWE为“1”时,在4个时钟周期内置位EEWE将把数据写入EEPROM的指定地址;若EEMWE为“0“,则操作EEWE不起作用。EEMWE置位后4个周期,硬件对其清零。AVR内置EEPROMEEPROM控制寄存器-EECREEWE:EEPROM写使能当EEPROM数据和地址设置好之后,需置位EEWE以便将数据写入EEPROM。写时序如下(第3步和第4步的次序并不重要):1.等待EEWE位变为零2.等待SPMCSR中的SPMEN位变为零3.将新的EEPROM地址写入EEAR(可选)4.将新的EEPROM数据写入EEDR(可选)5.对EECR寄存器的EEMWE写1,同时清零EEWE6.在置位EEMWE的4个周期内,置位EEWEAVR内置EEPROM注意:如果在步骤5和6之间发生了中断,写操作将失败。因为此时EEPROM写使能操作将超时。如果一个操作EEPROM的中断打断了另一个EEPROM操作,EEAR或EEDR寄存器可能被修改,引起EEPROM操作失败。建议此时关闭全局中断标志I。经过写访问时间之后,EEWE硬件清零。用户可以凭借这一位判断写时序是否已经完成。EEWE置位后,CPU要停止两个时钟周期才会运行下一条指令。AVR内置EEPROMEEPROM控制寄存器-EECREERE:EEPROM读使能当EEPROM地址设置好之后,需置位EERE以便将数据读入EEAR。EEPROM数据的读取只需要一条指令,且无需等待。读取EEPROM后CPU要停止4个时钟周期才可以执行下一条指令。用户在读取EEPROM时应该检测EEWE。如果一个写操作正在进行,就无法读取EEPROM,也无法改变寄存器EEAR。AVR内置EEPROMvoidEEPROM_write(unsignedintuiAddress,unsignedcharucData){/*等待上一次写操作结束*/while(EECR&(1EEWE));/*设置地址和数据寄存器*/EEAR=uiAddress;EEDR=ucData;/*置位EEMWE*/EECR|=(1EEMWE);/*置位EEWE以启动写操作*/EECR|=(1EEWE);}AVR内置EEPROMunsignedcharEEPROM_read(unsignedintuiAddress){/*等待上一次写操作结束*/while(EECR&(1EEWE));/*设置地址寄存器*/EEAR=uiAddress;/*设置EERE以启动读操作*/EECR|=(1EERE);/*自数据寄存器返回数据*/returnEEDR;}AVR内置EEPROM在ICC中,eeprom.h头文件中预定义了内置EEPROM读写宏:EEPROM_READ(intlocation,object)这个宏调用了EEPROMReadBytes函数从EEPROM指定位置读取数据送给数据对象object可以是任意程序变量包括结构和数组例如inti;EEPROM_Read(0x1,i);//读2个字节给iEEPROM_WRITE(intlocation,object)这个宏调用了EEPROMWriteBytes函数将数据对象写入到EEPROM的指定位置object可以是任意程序变量包括结构和数组例如inti;EEPROM_WRITE(0x1,i);//写两个字节至0x1AVR内置EEPROM在ICC中也可以直接使用以下内置函数unsignedcharEEPROMread(intlocation)从EEPROM指定位置读取一个字节intEEPROMwrite(intlocation,unsignedcharbyte)写一个字节到EEPROM指定位置如果成功返回0voidEEPROMReadBytes(intlocation,void*ptr,intsize)从EEPROM指定位置处开始读取size个字节至由ptr.指向的缓冲区voidEEPROMWriteBytes(intlocation,void*ptr,intsize)从EEPROM指定位置处开始写size个字节写的内容由ptr.指向的缓冲区提供ICC读写EEPROM内置函数原型unsignedcharEEPROMread(intlocation){EEAR=location;EECR|=0x01;//SetREADstrobereturn(EEDR);//Returnbyte}ICC读写EEPROM内置函数原型intEEPROMwrite(intlocation,unsignedcharbyte){unsignedcharoldSREG;EEAR=location;EEDR=byte;oldSREG=SREG;SREG&=~0x80;//disableinterruptEECR|=0x04;//SetMASTERWRITEenableEECR|=0x02;//SetWRITEstrobewhile(EECR&0x02);//WaituntilwriteisdoneSREG=oldSREG;return0;//returnSuccess.//Couldbeexpandedsothat//theroutinechecksthattheaddress//iswithintherangeofthechip.}ICC中将变量分配至EEPROM中#pragmadata:eepromintfoo=0x1234;chartable[]={0,1,2,3,4,5};#pragmadata:data...inti;EEPROM_READ((int)&foo,i);//i等于0x1234ICC中将变量分配至EEPROM中将变量分配到EEPROM区域,可以使用编译附注#pragmadata:eeprom将产生扩展名为.eep的EEPROM初始化文件。内部EEPROM使用实例定义变量到EEPROM#pragmadata:eepromSystemInfoSysData;SysSetupTypeSetupEepData;SmsFileTypeSmsEepFile[10];AlamRecTypeAlamEepRec[20];uint8SuperPassWordEep[16];uint8InputMenuInfoEep[8][20];uint8OutputMenuInfoEep[8][20];uint8SystemInit;#pragmadata:data内部EEPROM使用实例定义RAM中的变量SystemInfosysdata={“GSMeHOMESystem”,“Ver1.0”,“05/08/13”};SysSetupTypeSetupData;SmsFileTypeSmsFile;AlamRecTypeAlamRec;uint8SuperPassWord[16];uint8InputMenuInfo[8][20;uint8OutputMenuInfo[8][20];内部EEPROM使用实例写入数据EEPROM_WRITE((uint16)&SetupEepData,SetupData);读出数据EEPROM_READ((uint16)&SetupEepData,SetupData);
本文标题:第十二章AVR看门狗及EEPROM
链接地址:https://www.777doc.com/doc-29939 .html