閱讀相關(guān)系列章節(jié)
單片機(jī)關(guān)鍵技術(shù)基礎(chǔ)詳解(一)
一、CPU與單片機(jī)的復(fù)位電路的作用及基本復(fù)位方式
在上電或復(fù)位過程中,控制CPU的復(fù)位狀態(tài):這段時(shí)間內(nèi)讓CPU保持復(fù)位狀態(tài),而不是一上電或剛復(fù)位完畢就工作,防止CPU發(fā)出錯誤的指令、執(zhí)行錯誤操作,也可以提高電磁兼容性能。
無論用戶使用哪種類型的單片機(jī),總要涉及到單片機(jī)復(fù)位電路的設(shè)計(jì)。而單片機(jī)復(fù)位電路設(shè)計(jì)的好壞,直接影響到整個系統(tǒng)工作的可靠性。許多用戶在設(shè)計(jì)完單片機(jī)系統(tǒng),并在實(shí)驗(yàn)室調(diào)試成功后,在現(xiàn)場卻出現(xiàn)了“死機(jī)”、“程序走飛”等現(xiàn)象,這主要是單片機(jī)的復(fù)位電路設(shè)計(jì)不可靠引起的。
基本的復(fù)位方式
單片機(jī)在啟動時(shí)都需要復(fù)位,以使CPU及系統(tǒng)各部件處于確定的初始狀態(tài),并從初態(tài)開始工作。89系列單片機(jī)的復(fù)位信號是從RST引腳輸入到芯片內(nèi)的施密特觸發(fā)器中的。當(dāng)系統(tǒng)處于正常工作狀態(tài)時(shí),且振蕩器穩(wěn)定后,如果RST引腳上有一個高電平并維持2個機(jī)器周期(24個振蕩周期)以上,則CPU就可以響應(yīng)并將系統(tǒng)復(fù)位。單片機(jī)系統(tǒng)的復(fù)位方式有:手動按鈕復(fù)位和上電復(fù)位。
1、手動按鈕復(fù)位
手動按鈕復(fù)位需要人為在復(fù)位輸入端RST上加入高電平(圖1)。一般采用的辦法是在RST端和正電源Vcc之間接一個按鈕。當(dāng)人為按下按鈕時(shí),則Vcc的+5V電平就會直接加到RST端。手動按鈕復(fù)位的電路如所示。由于人的動作再快也會使按鈕保持接通達(dá)數(shù)十毫秒,所以,完全能夠滿足復(fù)位的時(shí)間要求。

?
圖1
2、上電復(fù)位
AT89C51的上電復(fù)位電路如圖2所示,只要在RST復(fù)位輸入引腳上接一電容至Vcc端,下接一個電阻到地即可。對于CMOS型單片機(jī),由于在RST端內(nèi)部有一個下拉電阻,故可將外部電阻去掉,而將外接電容減至1?F。上電復(fù)位的工作過程是在加電時(shí),復(fù)位電路通過電 容加給RST端一個短暫的高電平信號,此高電平信號隨著Vcc對電容的充電過程而逐漸回落,即RST端的高電平持續(xù)時(shí)間取決于電容的充電時(shí)間。為了保證系統(tǒng)能夠可靠地復(fù)位,RST端的高電平信號必須維持足夠長的時(shí)間。上電時(shí),Vcc的上升時(shí)間約為10ms,而振蕩器的起振時(shí)間取決于振蕩頻率,如晶振頻率為10MHz,起振時(shí)間為1ms;晶振頻率為1MHz,起振時(shí)間則為10ms。在圖2的復(fù)位電路中,當(dāng)Vcc掉電時(shí),必然會使RST端電壓迅速下降到0V以下,但是,由于內(nèi)部電路的限制作用,這個負(fù)電壓將不會對器件產(chǎn)生損害。另外,在復(fù)位期間,端口引腳處于隨機(jī)狀態(tài),復(fù)位后,系統(tǒng)將端口置為全“l(fā)”態(tài)。如果系統(tǒng)在上電時(shí)得不到有效的復(fù)位,則程序計(jì)數(shù)器PC將得不到一個合適的初值,因此,CPU可能會從一個未被定義的位置開始執(zhí)行程序。

?
圖2
3、積分型上電復(fù)位
常用的上電或開關(guān)復(fù)位電路如圖3所示。上電后,由于電容C3的充電和反相門的作用,使RST持續(xù)一段時(shí)間的高電平。當(dāng)單片機(jī)已在運(yùn)行當(dāng)中時(shí),按下復(fù)位鍵K后松開,也能使RST為一段時(shí)間的高電平,從而實(shí)現(xiàn)上電或開關(guān)復(fù)位的操作。
根據(jù)實(shí)際操作的經(jīng)驗(yàn),下面給出這種復(fù)位電路的電容、電阻參考值。
圖3中:C:=1uF,Rl=lk,R2=10k

?
圖3 積分型上電復(fù)位電路
二、編制單片機(jī)應(yīng)用程序的步驟和難點(diǎn)
1前言
如何編寫單片機(jī)應(yīng)用程序,這是一個實(shí)踐性很強(qiáng)的題目,也是1項(xiàng)艱苦而細(xì)致的工作。如果按照一定的步驟并且找出難點(diǎn),事先對這些難點(diǎn)加以處理,能夠收到事半功倍的效果。下面根據(jù)實(shí)際工作中的經(jīng)驗(yàn),談?wù)剬?shí)際開發(fā)中必經(jīng)的幾個步驟和可能遇到的難處理。對于1個單片機(jī)應(yīng)用程序,其編制過程如圖1所示。

?
2編制步驟
2.1搞清功能和編寫方案
接到一個單片機(jī)項(xiàng)目設(shè)計(jì)文件之后,并不是馬上動手編寫程序,而是仔細(xì)研究用戶提出的技術(shù)要求或者技術(shù)說明,根據(jù)這些技術(shù)要求和技術(shù)說明,也就是客戶要求,把程序應(yīng)該具備的主要功能寫清楚,寫仔細(xì),這是最關(guān)鍵的工作。如不清楚,應(yīng)向客戶和使用者問清楚,否則在設(shè)計(jì)完成以后會發(fā)現(xiàn)有些功能由于事先沒有考慮清楚再重新設(shè)計(jì)將會很麻煩,可能有些需要重新增加的功能很容易補(bǔ)充,而有些可能由于沒有事先考慮周全而無法實(shí)現(xiàn)。
2.2編寫總流程圖和各功能模塊流程圖
根據(jù)要完成的程序功能寫出總流程圖,根據(jù)總流程圖把整個程序劃分成幾個主要的功能模塊,每個功能模塊都要寫出基本流程圖,這主要是為以后的程序編寫起到一個指導(dǎo)作用。當(dāng)然,在實(shí)際的程序編寫過程中肯定會有一些改動,1個基本的流程會指導(dǎo)您在寫程序的過程中不會出現(xiàn)太大的偏差。例如,編寫鍵盤掃描并且區(qū)分是功能鍵還是數(shù)字鍵的子程序,如果是功能鍵就轉(zhuǎn)相應(yīng)的功能處理程序;如果是數(shù)字鍵就在相應(yīng)的數(shù)碼管上顯示出來;可以寫出其流程圖,如圖2所示。

?
這些資料主要是編程語言方面的書籍、雜志等。因?yàn)槌绦蛘Z言的有些資料任何編程人員都不可能記得太清楚,如每條指令的含義,具體操作每條指令所牽涉的硬件電路等。如果資料準(zhǔn)備得比較充分,可以放在案邊,若有需要,順手查閱。
2.4人機(jī)界面的編程
用單片機(jī)實(shí)現(xiàn)的項(xiàng)目人機(jī)界面相對簡單。若為LED顯示,應(yīng)根據(jù)LED的位數(shù)選取簡單、明燎、用戶一看便知的提示符;顯示的數(shù)據(jù)位數(shù)應(yīng)充分考慮用戶提出的技術(shù)要求。
2.5分析編程的難點(diǎn)和技術(shù)解決方案
即使1個熟練的編程人員,編程過程中會遇到一些困難。為了能比較順利地完成程序設(shè)計(jì),應(yīng)根據(jù)程序所完成的功能和程序流程對整個程序的框架分析一下,并根據(jù)自己掌握的技能定位整個程序的難點(diǎn),然后找到最佳的算法。例如對于稍微大一點(diǎn)的項(xiàng)目,鍵盤掃描和顯示部分的程序編制應(yīng)該是單片機(jī)編程的難點(diǎn)。
(1)無論是鍵盤掃描還是顯示過程都和硬件部分息息相關(guān)
送片選信號選取鍵盤就必須搞清單片機(jī)芯片是高電平選通還是低電平選通;選通鍵盤后,還需要讀回鍵盤的狀態(tài)。對讀回的鍵盤狀態(tài)還要進(jìn)行防抖處理;若鍵盤抖動,放棄讀回的數(shù)據(jù),重新讀鍵盤狀態(tài);若確定為鍵盤按下,才能對按鍵值進(jìn)行處理;處理后的鍵值送顯示或作為其它使用。由此可知以上的每一過程都和硬件電路打交道。
(2)鍵盤掃描和顯示牽涉到的算法比較復(fù)雜
因?yàn)閽呙桄I盤的過程就是遍歷每個按鍵,識別抖動,識別按鍵是否松開等過程;除此之外還要延遲合適的時(shí)間,以便再次讀取鍵值。顯示過程也要遍歷每個數(shù)碼管或液晶字符;其中查表過程,送顯示過程都要用到比較復(fù)雜的循環(huán)遍歷算法。
(3)數(shù)字鍵和功能鍵的區(qū)分
是數(shù)字鍵就送顯示,是功能鍵就轉(zhuǎn)相應(yīng)的功能子程序,把兩者結(jié)合起來就構(gòu)成比較復(fù)雜的散轉(zhuǎn)程序。MCS51單片機(jī)有現(xiàn)成的散轉(zhuǎn)子程序可供參閱,PIC可以參照MCS51的散轉(zhuǎn)子程序套用。
以上3點(diǎn)都是單片機(jī)編程的難點(diǎn)部分,在編程之前都應(yīng)該找出來仔細(xì)分析。通過分析,將所有可能成為難點(diǎn)之處都一一找出并找出相應(yīng)的算法,在以后的程序編寫過程中也相應(yīng)地比較順利。
2.6寫程序
在上面的準(zhǔn)備工作完成后,就可以著手編寫程序。因?yàn)橛辛嗣鞔_的程序流程,有了充足的資料,可能遇到的難點(diǎn)基本上找到了解決方法;這樣,事先準(zhǔn)備得比較充分,即使在以后的程序編寫過程中遇到困難,也較易解決。這樣就可以節(jié)省很多時(shí)間,以便靜下心來認(rèn)真按照方案和流程編寫程序。另外,一般寫完1個功能程序就進(jìn)行調(diào)試,通過后再編寫另外1個功能代碼,這樣可以防止全部代碼編寫完畢后再調(diào)試可能帶來的相互影響,從而可以搞清楚到底是哪部分程序有問題。
2.7程序調(diào)試
程序的調(diào)試過程是1個比較復(fù)雜的過程,有些需要高度的技巧和一定的方法。一般的編程軟件都提供單步、單步越過、斷點(diǎn)、運(yùn)行到光標(biāo)處等基本方法,一般掌握這幾種基本方法就可以解決絕大部分問題。經(jīng)過長時(shí)間的調(diào)試實(shí)踐之后自然就可以掌握一定的調(diào)試技巧,即熟能生巧。
3結(jié)束語
以上是編程一般單片機(jī)程序必須經(jīng)過的7大步驟,假如這7個過程的工作做得比較充分,一定能夠編寫出令人滿意的單片機(jī)程序。
三、關(guān)于單片機(jī)中的flash和eeprom
FLASH的全稱是FLASH EEPROM,但跟常規(guī)EEPROM的操作方法不同
FLASH 和EEPROM的最大區(qū)別是FLASH按扇區(qū)操作,EEPROM則按字節(jié)操作,二者尋址方法不同,存儲單元的結(jié)構(gòu)也不同,F(xiàn)LASH的電路結(jié)構(gòu)較簡單,同樣容量占芯片面積較小,成本自然比EEPROM低,因而適合用作程序存儲器,EEPROM則更多的用作非易失的數(shù)據(jù)存儲器。當(dāng)然用FLASH做數(shù)據(jù)存儲器也行,但操作比EEPROM麻煩的多,所以更“人性化”的MCU設(shè)計(jì)會集成FLASH和EEPROM兩種非易失性存儲器,而廉價(jià)型設(shè)計(jì)往往只有 FLASH,早期可電擦寫型MCU則都是EEPRM結(jié)構(gòu),現(xiàn)在已基本上停產(chǎn)了。
至于那個“總工”說的話如果不是張一刀記錯了的話,那是連基本概念都不對,只能說那個“總工”不但根本不懂芯片設(shè)計(jì),就連MCU系統(tǒng)的基本結(jié)構(gòu)都沒掌握。在芯片的內(nèi)電路中,F(xiàn)LASH和EEPROM不僅電路不同,地址空間也不同,操作方法和指令自然也不同,不論馮諾伊曼結(jié)構(gòu)還是哈佛結(jié)構(gòu)都是這樣。技術(shù)上,程序存儲器和非易失數(shù)據(jù)存儲器都可以只用FALSH結(jié)構(gòu)或EEPROM結(jié)構(gòu),甚至可以用“變通”的技術(shù)手段在程序存儲區(qū)模擬“數(shù)據(jù)存儲區(qū)”,但就算如此,概念上二者依然不同,這是基本常識問題。
沒有嚴(yán)謹(jǐn)?shù)墓ぷ骶瘢緹o法成為真正的技術(shù)高手。
EEPROM:電可擦除可編程只讀存儲器,F(xiàn)lash的操作特性完全符合EEPROM的定義,屬EEPROM無疑,首款Flash推出時(shí)其數(shù)據(jù)手冊上也清楚的標(biāo)明是EEPROM,現(xiàn)在的多數(shù)Flash手冊上也是這么標(biāo)明的,二者的關(guān)系是“白馬”和“馬”。至于為什么業(yè)界要區(qū)分二者,主要的原因是 Flash EEPROM的操作方法和傳統(tǒng)EEPROM截然不同,次要的原因是為了語言的簡練,非正式文件和口語中Flash EEPROM就簡稱為Flash,這里要強(qiáng)調(diào)的是白馬的“白”屬性而非其“馬”屬性以區(qū)別Flash和傳統(tǒng)EEPROM。
Flash的特點(diǎn)是結(jié)構(gòu)簡單,同樣工藝和同樣晶元面積下可以得到更高容量且大數(shù)據(jù)量下的操作速度更快,但缺點(diǎn)是操作過程麻煩,特別是在小數(shù)據(jù)量反復(fù)重寫時(shí),所以在MCU中Flash結(jié)構(gòu)適于不需頻繁改寫的程序存儲器。
在很多應(yīng)用中,需要頻繁的改寫某些小量數(shù)據(jù)且需掉電非易失,傳統(tǒng)結(jié)構(gòu)的EEPROM在此非常適合,所以很多MCU內(nèi)部設(shè)計(jì)了兩種EEPROM結(jié)構(gòu),F(xiàn)LASH的和傳統(tǒng)的以期獲得成本和功能的均衡,這極大的方便了使用者。隨著ISP、IAP的流行,特別是在程序存儲地址空間和數(shù)據(jù)存儲地址空間重疊的MCU系中,現(xiàn)在越來越多的MCU生產(chǎn)商用支持IAP的程序存儲器來模擬EEPROM對應(yīng)的數(shù)據(jù)存儲器,這是低成本下實(shí)現(xiàn)非易失數(shù)據(jù)存儲器的一種變通方法。為在商業(yè)宣傳上取得和雙EEPROM工藝的“等效”性,不少采用Flash程序存儲器“模擬”(注意,技術(shù)概念上并非真正的模擬)EEPROM數(shù)據(jù)存儲器的廠家紛紛宣稱其產(chǎn)品是帶EEPROM的,嚴(yán)格說,這是非常不嚴(yán)謹(jǐn)?shù)?,但商人有商人的目的和方法,用Flash“模擬”EEPROM可以獲取更大商業(yè)利益,所以在事實(shí)上,技術(shù)概念混淆的始作俑者正是他們。
從成本上講,用Flash“模擬”EEPROM是合算的,反之不會有人干,那么那位“總工”和樓上某網(wǎng)友所說的用EEPROM模擬Flash是怎么回事呢?這可能出在某些程序存儲空間和數(shù)據(jù)存儲空間連續(xù)的MCU上。這類MCU中特別是存儲容量不大的低端MCU依然采用EEPROM作為非易失存儲器,這在成本上反而比采用Flash和傳統(tǒng)EEPROM雙工藝的設(shè)計(jì)更低,但這種現(xiàn)象僅僅限于小容量前提下。因Flash工藝的流行,現(xiàn)在很多商人和不夠嚴(yán)謹(jǐn)?shù)募夹g(shù)人員將程序存儲器稱為Flash,對于那些僅采用傳統(tǒng)EEPROM工藝的MCU而言,他們不求甚解,故而錯誤的將EEPROM程序存儲器稱為“ 模擬Flash”,根本的原因是他們未理解Flash只是一種存儲器結(jié)構(gòu)而非存儲器的用途,錯誤的前提自然導(dǎo)致錯誤的結(jié)論。商業(yè)上講,用EEPROM模擬 Flash是不會有人真去做的愚蠢行為,這違背商業(yè)追求最大利益的原則,技術(shù)上也不可行,而對于技術(shù)人員而言,尤其是IC業(yè)內(nèi)的“總工”如果再這么講那只能說明他或她要么根本不了解相關(guān)技術(shù)細(xì)節(jié),要么非常不嚴(yán)謹(jǐn),這都不符合“總工”的身份。本質(zhì)的問題是Flash是一種存儲器類型而非MCU中的程序存儲器,即使MCU的程序存儲器用的是Flash,但其逆命題不成立。
在此寫此文,一方面是要澄清技術(shù)概念,另一方面更是不想令錯誤的說法誤人子弟,搞技術(shù)也需要嚴(yán)謹(jǐn)?shù)目茖W(xué)精神。
28系列是最早的EEPROM,28F則是最早的Flash,甚至Flash一詞是Intel在1980S為推廣其28F系列起的“廣告名”,取其意“快”,僅此而已。當(dāng)年的Flash不比傳統(tǒng)EEPROM容量更大只是容量起點(diǎn)稍高。至于現(xiàn)在的手冊中有無EEPROM字樣并不重要,非要“較枝”的話,看看內(nèi)容有無“電可擦除”存儲器的說法,至少我隨手打開SST的Flash手冊上都寫的很清楚,不過這些根本就是無意義的皮毛,典型的白馬非馬論。
至于AVR的地址連續(xù)問題是我隨手之誤,應(yīng)指68HC系列,但即使如此,就算我沒有用過包括AVR在內(nèi)的任何MCU也跟Flash的性質(zhì)毫無關(guān)系。
四、自制AVR仿真器
自制AVR仿真器用JtagICE仿真Mega16芯片進(jìn)行開發(fā),開發(fā)成功后,才移植到M8/48/88/168上。只要開發(fā)時(shí)留意一下,移植并不會有困難。
使用貼面IC的效果圖:
?
但使用貼面IC一個不好的地方是,芯片無法拆下來(如果我們要重新燒錄芯片的ROM,能拆下來就方便多了)。所以,這個活動,我們推薦使用DIP40封裝的Mega16. 以下是實(shí)物圖:
?
?
網(wǎng)上關(guān)于自制Jtag的線路有許多種。根據(jù)搜集到的資料,設(shè)計(jì)出本文介紹的最簡易、制作最容易的 JTAG。RS232接口是用分立件制作,就地取材,簡單可靠.
本線路的J1雙排十針座,既可以做Jtag,又可以做ISP(通過跳針JP1控制)。JP1跳針短路時(shí),J1用作ISP下載,方便更新本Jtag的ROM。J1 跳針開路時(shí), 用作JTAG.
?
如果你有232芯片,可以按以下線路代替上面的分立件RS232部分:

?
燒錄文件:
按以上的硬件制作好PCB后,檢查焊接無誤,就可以進(jìn)行燒錄了。
燒錄的方法有很多,我(armok)推薦的一個方法是:將M16芯片從JTAG板上拆下來,放到普通的帶ISP口的實(shí)驗(yàn)板,使用SL-ISP1.32 軟件,將本文附錄所帶的將AVR Studio 4.10 Rom 燒錄文件中的flash.rom 及 epprom.rom 直接燒入到Jtag ATmega16 就可以了。

五、80C51的復(fù)位技術(shù)盤點(diǎn)
?
標(biāo)準(zhǔn)80C51片內(nèi)現(xiàn)有的復(fù)位邏輯比較簡單,只有通過一條復(fù)位引腳RST進(jìn)行外部擴(kuò)展。技術(shù)手冊中給出了上電復(fù)位(POR,power on reset)和人工復(fù)位(MRST,manual reset)電路的接線方法;借助于一只專用外圍芯片,如MAX813L或DS1323等,來擴(kuò)充欠壓復(fù)位(LVR,low voltage reset)和看門狗復(fù)位(WDR,watch dog timer reset)也有文章介紹。
本文將介紹三種非常規(guī)擴(kuò)展復(fù)位方式:軟件復(fù)位(SWR,software reset)、軟硬件復(fù)位(SHR,software and hardware reset)和非法地址復(fù)位(IAR,illegal address reset)。
軟件陷阱技術(shù)及其改良方法
軟件陷阱(software trap)是一種捕捉程序“跑飛”的編程方法。通??梢栽诔绦蛑性O(shè)置軟件陷阱,引導(dǎo)程序失控的單片機(jī)跳轉(zhuǎn)到一個指定的地址去執(zhí)行,最終回復(fù)到正常軌道上來。軟件陷阱可以設(shè)置在用戶程序的空隙處或者轉(zhuǎn)移指令之后,還可以利用一系列的陷阱指令來填充程序存儲器的空白區(qū)。實(shí)現(xiàn)軟件陷阱功能的指令是一個“5字節(jié)指令串”,通常包含2條單字節(jié)NOP指令和1條3字節(jié)跳轉(zhuǎn)指令。
NOP ;利用空操作指令
NOP ;來增加捕捉有效性
LJMP SWRST;無條件跳轉(zhuǎn)到指定地址去
其中“SWRST”可以是一段“軟件復(fù)位程序”的入口地址標(biāo)號,也可以是復(fù)位矢量“0000H”,即主程序入口地址。
如果SWRST等于復(fù)位矢量0000H,則會把捕捉到的跑飛程序引導(dǎo)到初始化程序入口地址去執(zhí)行,從而達(dá)到回復(fù)到正常軌道的目的。這種處理方法只適合中斷功能沒有被啟用的場合??梢栽O(shè)想,假如是在(低級或高級)中斷服務(wù)程序中跑飛的,這時(shí)即使把程序拉回到起點(diǎn),而中斷激活觸發(fā)器不能夠被清除,會影響以后的中斷請求無法被 CPU響應(yīng)。
如果SWRST等于“軟件復(fù)位程序”的入口地址,則會引發(fā)一次“軟件復(fù)位”。關(guān)于軟件復(fù)位程序的設(shè)計(jì)方法,隨后介紹。
總之,這種方法的指導(dǎo)思想是指,把未使用的ROM空間用跳轉(zhuǎn)引導(dǎo)指令填滿,作為軟件“陷阱”,以捕獲“飛掉”的程序,并強(qiáng)行將捕獲到的跑飛程序引向一個特定的地址,在那里由一段專門處理錯誤的程序進(jìn)行處理,以恢復(fù)系統(tǒng)的正常運(yùn)行。為提高跑飛程序的捕獲率,通常還要在引導(dǎo)指令之前放置上幾條空操作指令 NOP。理由是,8051的指令編碼采用的是不等長方式,長度分別為1~3字節(jié),而程序跑飛又是通過非法隨機(jī)改變PC值形成的。假若跑飛后的PC值落到3 字節(jié)指令LJMP的中間,就會把操作數(shù)當(dāng)作操作碼來執(zhí)行,將會產(chǎn)生不可預(yù)知的結(jié)果。為了提高捕捉的有效性,就在LJMP指令之前至少填充2條單字節(jié)的 NOP指令。
如果把“5字節(jié)指令串”改換成如下作者新設(shè)計(jì)的“4字節(jié)指令串”,陷阱指令將會更加有效。理由是,該指令對應(yīng)的目標(biāo)碼為“00 20 00 20H”,這段碼無論重復(fù)多少次都是等同的。另外,應(yīng)該在程序存儲器0020H開始的3字節(jié)中再放置一條跳轉(zhuǎn)到“軟件復(fù)位程序”真正入口的中轉(zhuǎn)指令 LJMP SWRST。經(jīng)過核查,0020H~0022H字節(jié)恰好位于定時(shí)器T1中斷矢量區(qū)尾部和串口中斷矢量之前。
SWRST0 EQU 0020H;定義“軟件復(fù)位程序”的間接入口地址為“0020H”
NOP ;填充一條單字節(jié)的空操作指令,機(jī)器碼是“00H”
LJMP SWRST0 ;無條件跳轉(zhuǎn)到指定地址去。對應(yīng)的機(jī)器碼是“20 00 20H”
軟件復(fù)位技術(shù)
軟件復(fù)位是一種新技術(shù),目前有越來越多的新型單片機(jī)配備了該功能。例如Philips公司的P87LPC700和P89LPC900系列、TI- BB公司的MSC1200系列和SunPlus公司的SPMC65系列等,內(nèi)部都設(shè)計(jì)了專門用于實(shí)現(xiàn)軟件復(fù)位的控制寄存器或者控制位。
軟件復(fù)位是在利用軟件陷阱技術(shù)或軟件看門狗技術(shù)時(shí),必需配套實(shí)施的一項(xiàng)后續(xù)處理工作。所謂“軟件復(fù)位”是一種由用戶軟件控制的復(fù)位活動,就是利用一系列指令來模擬硬件復(fù)位所實(shí)現(xiàn)的各種操作內(nèi)容,并且重新從頭開始執(zhí)行用戶程序。
其中的操作內(nèi)容應(yīng)該包含:(1)對于標(biāo)準(zhǔn)80C51的21個特殊功能寄存器SFR的復(fù)位操作,利用MOV指令很容易實(shí)現(xiàn)。全部復(fù)位可能不是必需的,只管那些在用戶程序中用到的SFR即可,可以由用戶自己定制。
2)對于無統(tǒng)一編址的程序計(jì)時(shí)器PC的復(fù)位,利用一條跳轉(zhuǎn)指令即可。(3)中斷激活觸發(fā)器的復(fù)位既容易被人們忽略,也不容易實(shí)現(xiàn)。理由是它們對于用戶程序是不可見的,無法直接讀寫其內(nèi)容。有的編程人員采用LJMP 0000H(機(jī)器碼為20 00 00H)作為軟件陷阱,認(rèn)為直接跳轉(zhuǎn)到復(fù)位矢量就完成了軟件復(fù)位,就是這類失誤案例的典型代表。
清除中斷激活觸發(fā)器有何必要呢?程序的跑飛是隨機(jī)發(fā)生的,其起飛點(diǎn)完全可能發(fā)生在低級或高級中斷服務(wù)子程序中,這時(shí)的中斷激活觸發(fā)器已經(jīng)被置位。如果在程序回復(fù)之后沒有及時(shí)清除它們,將阻止以后出現(xiàn)的所有的同級或低級中斷請求。

?
圖1 中斷激活觸發(fā)器示意圖
中斷激活觸發(fā)器包含高權(quán)組和低權(quán)組兩個觸發(fā)器,電路組成如圖1所示,該圖是根據(jù)作者的理解和經(jīng)驗(yàn)繪制的。電路中包括1個邏輯或門G1、兩個S-R觸發(fā)器FF1和FF2。當(dāng)CPU響應(yīng)低級中斷請求之后,F(xiàn)F1被置位,其Q = 0,封鎖“低權(quán)組”不再受理新的低級中斷請求;當(dāng)CPU響應(yīng)高級中斷請求之后,因?yàn)镚1的作用而使FF1和FF2同時(shí)被置位,F(xiàn)F1的Q = 0封鎖“低權(quán)組”,F(xiàn)F2的Q = 0封鎖“高權(quán)組”,不再受理新的高級和低級中斷請求。
如何設(shè)計(jì)“軟件復(fù)位程序”呢?其編寫方法如下。
SWRST: ;定義軟件復(fù)位程序的實(shí)際入口地址
CLR EA ;首先關(guān)閉中斷源總使能位
SETB F0 ;設(shè)置一個軟件復(fù)位標(biāo)志位
MOV P0,#0FFH ;設(shè)定通用端口P0為高阻輸入狀態(tài)
MOV P1,#0FFH ;設(shè)定通用端口P1為高阻輸入狀態(tài)
MOV P2,#0FFH ;設(shè)定通用端口P2為高阻輸入狀態(tài)
MOV P3,#0FFH ;設(shè)定通用端口P3為高阻輸入狀態(tài)
MOV PSW,#00H ;設(shè)定程序狀態(tài)字寄存器為原始值
…… ;(據(jù)實(shí)際需要還可初始化其他SFR)
MOV DPTR,#SWR0 ;為RETI準(zhǔn)備彈出地址,而又不想改變執(zhí)行順序
PUSH DPL ;壓棧低字節(jié),在先
PUSH DPH ;壓棧高字節(jié),在后
RETI ;中斷返回指令,清除高級中斷激活觸發(fā)器
SWR0: CLR A ;準(zhǔn)備復(fù)位地址
PUSH ACC ;壓棧低字節(jié)00H
PUSH ACC ;壓棧高字節(jié)00H
RETI ;清除低級中斷激活觸發(fā)器,并跳到0000H
以下幾點(diǎn)需要說明:(1)首先關(guān)閉總的中斷使能位,以確保軟件復(fù)位過程順利完成;(2)其中的核心指令是中斷返回指令RETI,因?yàn)樵谡麄€指令集中只有該指令能夠清除中斷激活觸發(fā)器;(3)末尾RETI指令的作用還代替了一條3字節(jié)的“LJMP 0000H”指令;(4)由軟件陷阱捕獲的跑飛程序并不一定同時(shí)置位了所有兩個中斷激活觸發(fā)器,但是該程序仍然適用,并且也沒有任何負(fù)面影響;(5)軟件復(fù)位標(biāo)志這里利用了PSW中的一個通用位F0,也可以利用F1、GF0、GF1以及RAM字節(jié)單元或位單元等;(6)軟件復(fù)位是一種不外擴(kuò)任何硬件電路、不導(dǎo)致單片機(jī)發(fā)生狀態(tài)遷移、純軟件的復(fù)位方法。
軟硬件復(fù)位技術(shù)
軟硬件復(fù)位是軟件復(fù)位功能的一種延伸,也是單片機(jī)的一種自主復(fù)位方式,既具有軟件復(fù)位的特點(diǎn)(可以由編程人員按需要來啟用),又具有硬件復(fù)位的特點(diǎn)(能夠?qū)崿F(xiàn)硬件復(fù)位的全部操作內(nèi)容)。這種復(fù)位方式是本文作者自行規(guī)劃、設(shè)計(jì)和命名的。

?
(a)分立件電路方式

?
(b)IC電路方式
在上述軟件復(fù)位的基礎(chǔ)上很容易實(shí)現(xiàn)這里所說的軟硬件復(fù)位方式,不過需要外擴(kuò)一定的硬件電路的支持。圖2是兩種配合軟硬件復(fù)位的外擴(kuò)電路。其中,圖2 (a)電路是在普通復(fù)位電路的基礎(chǔ)上,添加1只三極管Q1和3只阻容元件而成的,并且其導(dǎo)通與截止由一條并口引腳控制,如P1.0。平時(shí)P1.0維持高電平,Q1截止;當(dāng)內(nèi)部軟件需要實(shí)施該復(fù)位時(shí),從P1.0腳輸出低電平,Q1導(dǎo)通把RST腳拉高,強(qiáng)行復(fù)位單片機(jī)。這里R3、R4和C2起著延時(shí)和限流的雙重作用。圖2(b)電路是在MAX812M對接80C51電路基礎(chǔ)上添加一條連線而成的,其工作原理與上類似。該連線把MAX812M的人工復(fù)位輸入腳 MR和一條通用I/O腳(如P1.0)連接起來即可。
如何設(shè)計(jì)“軟硬件復(fù)位程序”呢?其編寫方法如下。
SHRST: ;定義軟硬件復(fù)位程序的入口地址
SET F1 ;設(shè)置一個軟件復(fù)位標(biāo)志位
CLR P1.0 ;從P1.0輸出低電平,開始實(shí)施軟硬件復(fù)位
ORL PCON,#02H;置位PD,令單片機(jī)進(jìn)入停機(jī)狀態(tài),即PD模式;經(jīng)過延時(shí)后RST被拉高,迫使單片機(jī)進(jìn)入復(fù)位狀態(tài);在復(fù)位操作完成并且喚醒單片機(jī)之后,將重新從0000H開始執(zhí)行用戶程序
以下幾點(diǎn)需要說明:(1)如果利用這里的“軟硬件復(fù)位程序”代替前面的“軟件復(fù)位程序”,可以簡化用戶程序并且復(fù)位進(jìn)行得徹底,但是需要增加一些硬件,并且也把可以定制的復(fù)位操作給轉(zhuǎn)化成了固定的復(fù)位操作。(2)在圖2所示的軟硬件復(fù)位的支撐電路,除了可以提供復(fù)位信號給單片機(jī),還有一個很大的好處,就是可以為其他外圍電路提供復(fù)位信號,這彌補(bǔ)了傳統(tǒng)80C51的一個欠缺。
標(biāo)準(zhǔn)80C51的復(fù)位引腳RST是只能輸入的單向結(jié)構(gòu),不能由單片機(jī)主動地為外圍芯片提供同步的復(fù)位信號;而MC68HC05和MC68HC08系列、ST公司的ST7系列,以及許多新款51兼容單片機(jī)都把RST引腳設(shè)計(jì)為可輸入/輸出的雙向結(jié)構(gòu),在內(nèi)部看門狗溢出復(fù)位的同時(shí),也從RST輸出一個高電平脈沖,控制其他外圍芯片與單片機(jī)進(jìn)行同步復(fù)位操作。例如,ATMEL公司的AT89S51/52、T89C51RD2、AT89C51RC等型號和 Philips公司的P89C51RC、P89C51RA2/RB2/RD2等型號,它們都帶有內(nèi)部看門狗。
非法地址復(fù)位技術(shù)
一般來說,非法地址復(fù)位是指由于意外原因?qū)е鲁绦蛴?jì)時(shí)器PC內(nèi)容被破壞,而迫使CPU試圖到一個非法地址去抓取指令代碼來執(zhí)行,就強(qiáng)迫單片機(jī)進(jìn)行復(fù)位操作。
由于51系列單片機(jī)的硬件結(jié)構(gòu)采用的是“哈佛架構(gòu)”,其程序區(qū)和數(shù)據(jù)區(qū)截然分開、獨(dú)立編址,不存在CPU到RAM區(qū)抓取指令的可能性,因此這極大地降低了非法尋址的概率。但是這并不能徹底杜絕非法尋址的可能性,尤其是對于哪些實(shí)際配備ROM容量遠(yuǎn)小于64Kb的情況。這時(shí)就可以狹義地定義非法地址是 PC值超出ROM實(shí)際容量的地址編碼。

?
(a)IC電路直接復(fù)位方式

?
(b)先中斷后復(fù)位方式
圖3是兩種實(shí)現(xiàn)非法地址復(fù)位的支撐電路。其中,圖3(a)電路是在圖2(b)的基礎(chǔ)上改變一條連線而成的。該連線一端連接PSEN信號引腳,該引腳專門用來提供選通外擴(kuò)程序存儲器ROM的片選信號;另一端連接MAX812M的人工復(fù)位輸入腳MR。平時(shí)PSEN引腳一直維持在高電平上;只有當(dāng)CPU試圖非法到外部ROM抓取指令時(shí),PSEN引腳才會送出低電平脈沖,就是巧妙地利用該脈沖作為復(fù)位信號源,來強(qiáng)迫單片機(jī)進(jìn)行復(fù)位操作。圖3(b)電路可以看作是在圖2(b)基礎(chǔ)上改變添加一條連線而成的。該連線把PSEN信號引腳和一條外部中斷源引腳INT0連接起來,并且設(shè)定INT0為下降沿觸發(fā)和高級中斷源。當(dāng)出現(xiàn)非法地址時(shí),PSEN引腳上的低電平脈沖經(jīng)過INT0向CPU請求中斷;在CPU響應(yīng)該中斷之后可以設(shè)置標(biāo)志,然后實(shí)施軟件復(fù)位或者軟硬件復(fù)位。

?

?
需要提示一點(diǎn):非法地址復(fù)位方式的啟用是有前提條件的,它僅適用于那些純粹利用片上ROM(指程序存儲器),即無外擴(kuò)ROM,并且片上ROM不足64Kb的情況。
復(fù)位方式小結(jié)
標(biāo)準(zhǔn)80C51只有一個外接復(fù)位源引腳RST,基本所有硬件中斷都是通過RST腳引入的,并且是根據(jù)實(shí)際需要逐個進(jìn)行擴(kuò)充的。其中只有上電復(fù)位POR是什么場合下都必不可少的。其擴(kuò)充順序大致符合(不是絕對符合)表1中的規(guī)律。
在此對于可能用到的多種復(fù)位源和復(fù)位的方式,進(jìn)行如下幾種不同的分類。
1 傳統(tǒng)復(fù)位方式和非傳統(tǒng)復(fù)位方式
傳統(tǒng)復(fù)位方式(包含上電復(fù)位和人工復(fù)位)是80C51技術(shù)手冊和所有教科書中幾乎都提及的;而非傳統(tǒng)復(fù)位方式(包含欠壓復(fù)位、看門狗復(fù)位、軟件復(fù)位、軟硬件復(fù)位和非法地址復(fù)位)是為了滿足技術(shù)發(fā)展的需要而擴(kuò)充的,這也是一些新款單片機(jī)在片內(nèi)新增的幾種復(fù)位方式。
2 硬件復(fù)位、軟件復(fù)位和軟硬件復(fù)位
復(fù)位分類如表2所示,將除了軟件復(fù)位之外的所有復(fù)位方式外部都引入到RST復(fù)位引腳上。
3 電源電壓監(jiān)控復(fù)位和程序運(yùn)行監(jiān)控復(fù)位
電源電壓監(jiān)控復(fù)位包含上電復(fù)位和欠壓復(fù)位,它們都是在電源電壓的非常時(shí)期實(shí)施的復(fù)位;程序運(yùn)行監(jiān)控復(fù)位包含人工復(fù)位、看門狗復(fù)位、非法地址復(fù)位、軟件復(fù)位和軟硬件復(fù)位,它們都是在用戶程序失常的情況下實(shí)施的復(fù)位。
4 內(nèi)部復(fù)位和外部復(fù)位
內(nèi)部復(fù)位包含看門狗復(fù)位、軟件復(fù)位、軟硬件復(fù)位和非法地址復(fù)位,它們基本都由內(nèi)部原因?qū)е碌膹?fù)位;外部復(fù)位包含上電復(fù)位、人工復(fù)位和欠壓復(fù)位,它們基本都由外部原因?qū)е碌膹?fù)位。
5 快速復(fù)位和延時(shí)復(fù)位
前者希望復(fù)位操作越快越好,例如人工復(fù)位、看門狗復(fù)位、非法地址復(fù)位等;而后者則希望復(fù)位操作有一個延遲時(shí)間,例如上電復(fù)位、欠壓復(fù)位等。
6 冷復(fù)位和熱復(fù)位
只有上電復(fù)位屬于冷復(fù)位,其余均屬于熱復(fù)位。在冷復(fù)位實(shí)施之前單片機(jī)處于無電狀態(tài)。
評論