AVR硬件設(shè)計(jì)(內(nèi)含最小系統(tǒng)電路圖)
采用了在ATmega16引腳XTAL1和XTAL2上外接由石英晶體和電容組成的諧振回路,并配合片內(nèi)的OSC(Oscillator)振蕩電路構(gòu)成的振蕩源作為系統(tǒng)時(shí)鐘源的。更簡(jiǎn)單的電路是直接使用片內(nèi)的4M的RC振蕩源,這樣就可以將C1、C2、R2和4M晶體省掉,引腳XTAL1和XTAL2懸空,當(dāng)然此時(shí)系統(tǒng)時(shí)鐘頻率精準(zhǔn)度不如采用外部晶體的方式,而且也易受到溫度變化的影響。
AVR的復(fù)位源和復(fù)位方式:
復(fù)位是單片機(jī)芯片本身的硬件初始化操作,例如,單片機(jī)在上電開機(jī)時(shí)都需要復(fù)位,以便CPU以及其它內(nèi)部功能部件都處于一個(gè)確定的初始狀態(tài),并從這個(gè)初始狀態(tài)開始工作。
AVR單片機(jī)的復(fù)位操作,其主要功能是把程序計(jì)數(shù)器PC初始化為$0000(指非BOOT LOAD方式啟動(dòng)),使單片機(jī)從$0000單元開始執(zhí)行程序。同時(shí)決大部分的寄存器(通用寄存器和I/O寄存器)也被復(fù)位操作清零。
ATmega16單片機(jī)共有5個(gè)復(fù)位源,它們是:
1、上電復(fù)位。當(dāng)系統(tǒng)電源電壓低于上電復(fù)位門限Vpot時(shí),MCU復(fù)位。
2、外部復(fù)位。當(dāng)外部引腳RESET為低電平,且低電平持續(xù)時(shí)間大于1.5us時(shí),MCU復(fù)位。
3、掉電檢測(cè)(BOD)復(fù)位。BOD使能時(shí),且電源電壓低于掉電檢測(cè)復(fù)位門限(4.0v或2.7v)時(shí),MCU復(fù)位。
4、看門狗復(fù)位。WDT使能時(shí),并且WDT超時(shí)溢出時(shí),MCU復(fù)位。
5、JTAG AVR復(fù)位。當(dāng)使用JTAG接口時(shí),可由JTAG口控制MCU復(fù)位。
AVR復(fù)位啟動(dòng)后,由于程序計(jì)數(shù)器PC置為$0000,因此CPU取出的第一條指令就是在Flash空間的$0000處,即復(fù)位后系統(tǒng)程序從地址$0000處開始執(zhí)行(指非BOOT LOAD方式啟動(dòng))。通常在$0000地址中放置的指令為一條相對(duì)轉(zhuǎn)移指令RJMP或JMP指令,跳到主程序的開始。這樣,系統(tǒng)復(fù)位啟動(dòng)后,首先執(zhí)行$0000處的跳轉(zhuǎn)指令,然后轉(zhuǎn)到執(zhí)行主程序的指令。
AVR內(nèi)部的MCU控制和狀態(tài)寄存器MCUCSR還將引起復(fù)位的復(fù)位源進(jìn)行了記錄,用戶程序啟動(dòng)后,可以讀取MCUCSR中的標(biāo)記,查看復(fù)位是由于何種情況造成的,是正常復(fù)位還是異常復(fù)位,從而根據(jù)實(shí)際情況執(zhí)行不同的程序,實(shí)現(xiàn)不同的處理。
對(duì)AVR的編程下載:串行編程方式(ISP)。
mega16的熔絲位:
ATmega16單片機(jī)在售出時(shí),片內(nèi)的Flash 存儲(chǔ)器和EEPROM 存儲(chǔ)器陣列是處在擦除的狀態(tài)(即內(nèi)容 = $FF),且可被編程。同時(shí)其器件配置熔絲位的缺省值為使用內(nèi)部1M的RC振蕩源作為系統(tǒng)時(shí)鐘!
1.存儲(chǔ)器加密鎖定位
ATmage16有2個(gè)加密鎖定位LB1和LB2,用于設(shè)定對(duì)片內(nèi)存儲(chǔ)器的加密方式,用戶可在編程方式下,對(duì)LB1、LB2不編程(1),或編程(0),從而獲得對(duì)片內(nèi)存儲(chǔ)器不同的加密保護(hù)方式,見表2.3。
需要進(jìn)一步說明是:
在AVR的器件手冊(cè)中,使用已編程(Programmed)和未編程(Unprogrammed)定義加密位和熔絲位的狀態(tài)?!癠nprogrammed”表示熔絲狀態(tài)為“1”(禁止),“Programmed”表示熔絲狀態(tài)為“0”(允許),即
1:未編程
0:編程
AVR的加密位和熔絲位可多次編程,不是OPT熔絲。
AVR芯片加密鎖定后(LB2/LB1 = 1/0,0/0),在外部不能通過任何方式讀取芯片內(nèi)部Flash和EEPROM中的數(shù)據(jù),但熔絲位的狀態(tài)仍然可以讀取,不能修改配置。
需要重新下載程序時(shí),或芯片被加密鎖定后,或發(fā)現(xiàn)熔絲位配置不對(duì),都必須先在編程狀態(tài)使用芯片擦除命令,清除芯片內(nèi)部存儲(chǔ)器中的數(shù)據(jù),同時(shí)解除加密鎖定。然后重新下載運(yùn)行代碼和數(shù)據(jù),修改和配置相關(guān)的熔絲位,最后再次配置芯片的加密鎖定位。
編程狀態(tài)的芯片擦除命令是將Flash和EEPROM中的數(shù)據(jù)清除,并同時(shí)將兩位鎖定位狀態(tài)配置成無鎖定狀態(tài)(LB2/LB1 = 1/1)。但芯片擦除命令并不改變其它熔絲位的狀態(tài)。
下載編程的正確的操作程序是:在芯片無鎖定狀態(tài)下,下載運(yùn)行代碼和數(shù)據(jù),配置相關(guān)的熔絲位,最后配置芯片的加密鎖定位。
2.系統(tǒng)時(shí)鐘類型的配置
ATmega16可以使用多種類型的系統(tǒng)時(shí)鐘源,最常用的為2種:使用內(nèi)部的RC振蕩源(1M/2M/4M/8M)和外接晶體(晶體可在0-16MHz之間選擇)配合內(nèi)部振蕩放大器構(gòu)成的振蕩源。具體系統(tǒng)時(shí)鐘類型的配置由CKOPT和CKSEL[3-0]共5個(gè)熔絲設(shè)定,表2.4、表2.5給出了具體的配置值。用戶在使用中,首先要根據(jù)實(shí)際使用情況進(jìn)行正確的設(shè)置,而且千萬注意不要對(duì)這些熔絲位誤操作!
在表2.5中,當(dāng)CKOPT = 0時(shí),振蕩器的輸出振幅較大,容易起振,適合在干擾大的場(chǎng)合以及使用的晶體超過8M時(shí)的情況下使用。而CKOPT = 1時(shí),振蕩器的輸出振幅較小,這樣可以減小對(duì)電源的消耗,對(duì)外的電磁幅射也較小。
尤其需要說明的是,一旦RESET腳的電平被外部拉低,當(dāng)滿足某些特殊條件后,芯片將進(jìn)入編程狀態(tài)。例如,如果芯片帶有SPI接口,支持SPI串行編程,則通過以下方式將使芯片進(jìn)入SPI編程狀態(tài):
外部將SPI口的SCK引腳拉低,然后外部在RESET引腳上施加一個(gè)至少為2個(gè)系統(tǒng)周期以上低電平脈沖;
延時(shí)等待20ms后,由外部通過AVR的SPI口向芯片下發(fā)允許SPI編程的指令;
如果外圍連接在上電情況時(shí)表現(xiàn)為強(qiáng)上拉或強(qiáng)下拉(最極端情況為接高電平或GND),那么為了保證AVR的SPI功能的正常工作,應(yīng)該如圖2-20中所示,串入3個(gè)隔離電阻,阻值在2K左右。
AVR熔絲位的配置:
對(duì)于剛開始學(xué)習(xí)使用AVR的讀者,建議改變的熔絲位有:
系統(tǒng)時(shí)鐘采用內(nèi)部4M的RC振蕩源。其優(yōu)點(diǎn)是速度適中,且應(yīng)用于RS-232通信時(shí),分頻產(chǎn)生的9600bps速率與標(biāo)準(zhǔn)值的誤差最小(0.2%)。
禁止片內(nèi)的JTAG口功能。不使用JTAG在線仿真,將4個(gè)引腳PC2-PC5釋放,作為普通的I/O使用。
啟用低電壓檢測(cè)復(fù)位功能。檢測(cè)電平設(shè)置為4.0V。
評(píng)論