《STM8S系列單片機(jī)原理與應(yīng)用》課件第11章_第1頁
《STM8S系列單片機(jī)原理與應(yīng)用》課件第11章_第2頁
《STM8S系列單片機(jī)原理與應(yīng)用》課件第11章_第3頁
《STM8S系列單片機(jī)原理與應(yīng)用》課件第11章_第4頁
《STM8S系列單片機(jī)原理與應(yīng)用》課件第11章_第5頁
已閱讀5頁,還剩114頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第11章STM8S應(yīng)用系統(tǒng)設(shè)計(jì)

11.1硬件設(shè)計(jì)

11.2軟件設(shè)計(jì)

11.3STM8芯片提供的可靠性功能11.4軟件可靠性設(shè)計(jì)

11.1硬件設(shè)計(jì)在設(shè)計(jì)系統(tǒng)硬件電路時(shí),一般遵循以下原則:

(1)硬件結(jié)構(gòu)應(yīng)結(jié)合控制程序設(shè)計(jì)一并考慮。同一般的計(jì)算機(jī)系統(tǒng)一樣,單片機(jī)應(yīng)用系統(tǒng)的軟件和硬件在邏輯功能上是等效的。具有相同功能的單片機(jī)應(yīng)用系統(tǒng),其軟硬件功能可以在很寬的范圍內(nèi)變化。一些硬件電路的功能可以由軟件來實(shí)現(xiàn),反之亦然。例如,系統(tǒng)日歷時(shí)鐘可以用實(shí)時(shí)/日歷時(shí)鐘芯片(如MC146818、PCF8563)實(shí)現(xiàn),也可以用定時(shí)中斷方式實(shí)現(xiàn);無線或紅外解碼電路(PWM編碼或曼徹斯特編碼),既可由相應(yīng)解碼芯片承擔(dān),也可以通過軟件方式(如利用具有上、下沿觸發(fā)捕獲功能的定時(shí)器)實(shí)現(xiàn)。在應(yīng)用中,系統(tǒng)軟件和硬件功能的劃分要根據(jù)系統(tǒng)的要求而定,用硬件實(shí)現(xiàn)可提高系統(tǒng)反應(yīng)速度、減少存儲(chǔ)容量、縮短軟件開發(fā)周期,但會(huì)增加系統(tǒng)的硬件成本、降低硬件的利用率,使系統(tǒng)的靈活性與適應(yīng)性變差。若用軟件來實(shí)現(xiàn)某些硬件功能,可以節(jié)省硬件開支,增強(qiáng)系統(tǒng)的靈活性和適應(yīng)性,但系統(tǒng)反應(yīng)速度會(huì)有所下降(對(duì)實(shí)時(shí)性要求很高的控制系統(tǒng),可優(yōu)先考慮用硬件實(shí)現(xiàn)),軟件設(shè)計(jì)費(fèi)用和所需存儲(chǔ)器的容量將相應(yīng)增加。對(duì)產(chǎn)量大、價(jià)格敏感的民用產(chǎn)品,原則上能用軟件實(shí)現(xiàn)的功能,不用硬件電路完成。在總體設(shè)計(jì)時(shí),必須權(quán)衡利弊,仔細(xì)劃分好硬件功能和軟件功能,軟件能實(shí)現(xiàn)的功能盡可能由軟件來完成,以簡(jiǎn)化系統(tǒng)的硬件電路,降低成本,提高系統(tǒng)的可靠性。

(2)系統(tǒng)中關(guān)聯(lián)器件要盡可能地做到性能匹配。例如,在低功耗單片機(jī)應(yīng)用中,包括MCU在內(nèi),系統(tǒng)中所有芯片都應(yīng)選擇低功耗器件。

(3)單片機(jī)外接電路較多時(shí),必須考慮其驅(qū)動(dòng)能力。若驅(qū)動(dòng)能力不足,則系統(tǒng)工作不穩(wěn)定。這時(shí)應(yīng)增設(shè)線驅(qū)動(dòng)器或降低電源電壓,減小芯片功耗,降低總線負(fù)載。

(4)可靠性及抗干擾設(shè)計(jì)是硬件系統(tǒng)設(shè)計(jì)中不可缺少的一部分。可靠性、抗干擾能力與硬件系統(tǒng)自身的品質(zhì)有關(guān),諸如構(gòu)成系統(tǒng)的各種芯片及元器件的選擇、電路設(shè)計(jì)的合理性、印刷電路板的布線、去耦濾波、通道隔離等,都必須認(rèn)真對(duì)待。為了提高單片機(jī)控制系統(tǒng)的可靠性,單片機(jī)控制系統(tǒng)中的IC芯片的連線中必須放置相應(yīng)的濾波電容,這點(diǎn)最容易被線路設(shè)計(jì)者忽略。在74系列及CMOS小規(guī)模數(shù)字集成電路中,每1~2塊芯片的電源引腳和地之間應(yīng)加接一個(gè)容量為0.01~0.22μF的高頻濾波電容,濾波電容放置的位置盡可能接近芯片的電源引腳,原則是“先濾波后使用”,如圖11-1所示。工作頻率越高,濾波電容的容量就可以越小。例如,當(dāng)系統(tǒng)工作頻率大于10MHz時(shí),濾波電容的容量可取0.01~0.047μF。圖11-1IC電源引腳濾波

(5)?TTL電路未用引腳的處理。在TTL單元電路中,一些單元含有多個(gè)引腳,當(dāng)僅使用其中部分引腳時(shí),如將“2輸入與非門”作為反相器使用時(shí),就遇到多余引腳問題。對(duì)于未用的與門(包括與非門)引腳,可采取下列方法進(jìn)行處理:●當(dāng)電路工作頻率不高時(shí),可懸空(視為高電平,但不允許帶長(zhǎng)開路線)?!癞?dāng)電源電壓不超過5.5V時(shí),可直接與電源VCC相連。其優(yōu)點(diǎn)是無須增加額外的元器件;缺點(diǎn)是當(dāng)電源部分出現(xiàn)故障,如電壓大于5.5V時(shí),可能損壞與電源相連的與非門電路芯片?!駥⑺形从玫妮斎攵诉B在一起,并通過2.0kΩ電阻接電源VCC。其缺點(diǎn)是需要增加一個(gè)電阻?!裨谇凹?jí)驅(qū)動(dòng)能力足夠時(shí),將多余的輸入端并接到已使用的輸入端上。其缺點(diǎn)是除了要求前級(jí)電路具有足夠的驅(qū)動(dòng)能力外,還增加了前級(jí)電路的功耗。對(duì)于未用的或門(包括或非門)引腳,一律接地。

(6)?CMOS、HCMOS電路未用引腳的處理。對(duì)于未用的與非門(包括與門)引腳,可采取下列方法進(jìn)行處理:●直接與電源VDD相連。其優(yōu)點(diǎn)是不需要增加額外的元器件;缺點(diǎn)是當(dāng)電源部分出現(xiàn)故障時(shí),可能損壞與電源相連的與非門電路芯片?!駥⑺形从玫妮斎攵诉B在一起,并通過100kΩ電阻接電源VDD。其缺點(diǎn)是需要增加一個(gè)電阻?!癞?dāng)輸入信號(hào)為低頻脈沖信號(hào)或電平信號(hào)時(shí),也可將多余的輸入端并接到已使用的輸入端上。其缺點(diǎn)是除了要求前級(jí)電路具有足夠的驅(qū)動(dòng)能力外,還增加了前級(jí)電路的功耗。對(duì)于未用的或非門(包括或門)引腳,一律接地。對(duì)于CMOS、HCMOS電路芯片來說,如果是數(shù)字IC,則同一個(gè)封裝管座中未用單元的所有輸入端一律接地??傊?,CMOS、HCMOS數(shù)字IC芯片的輸入引腳在任何時(shí)刻都不允許懸空。對(duì)于模擬比較器、放大器來說,反相端接地,同相端接輸出端。

(7)工藝設(shè)計(jì),包括機(jī)架機(jī)箱、面板、配線、接插件等,必須兼顧電磁兼容的要求,并考慮安裝、調(diào)試、維護(hù)等操作是否方便。11.1.1硬件資源分配

1.引腳資源分配

STM8SMCU芯片I/O口任意一個(gè)引腳的輸入/輸出方式均可編程選擇,對(duì)引腳分配的要求并不嚴(yán)格,只需注意以下幾點(diǎn):

(1)?PA口~PE口引腳具有中斷功能,而PF口~PI口引腳沒有中斷功能。此外在PA口~PE口中,同一個(gè)I/O引腳上的外中斷輸入只能選擇同一種觸發(fā)方式。

(2)由于STM8S內(nèi)嵌外設(shè)種類很多,因此絕大部分I/O引腳均具有復(fù)用功能,既可作為通用I/O引腳使用,當(dāng)相應(yīng)外設(shè)處于使能狀態(tài)時(shí),又可作為對(duì)應(yīng)外設(shè)的輸入/輸出引腳。當(dāng)系統(tǒng)中需要使用對(duì)應(yīng)外設(shè)時(shí),與外設(shè)復(fù)用的引腳一般不能作為通用引腳使用。在STM8S系列MCU中,與外設(shè)輸入/輸出有關(guān)的I/O引腳大致如下:●與TIM1輸入捕獲/輸出比較有關(guān)的引腳為PC4~PC1(對(duì)應(yīng)TIM1_CH4~TIM1_CH1)引腳、PB3~PB0(對(duì)應(yīng)TIM1_ETR、TIM1_CHN3~TIM1_CHN1)引腳。●與TIM2輸入捕獲/輸出比較有關(guān)的引腳為PD4(TIM2_CH1)、PD3(TIM2_CH2)、PA3(TIM2_CH3)引腳。●與TIM3輸入捕獲/輸出比較有關(guān)的引腳為PD2(TIM3_CH1)、PD0(TIM3_CH2)引腳?!衽c通用串行總線UART1接口有關(guān)的引腳為PA4(UART1_RX)、PA5(UART1_TX)、PA6(UART1_CK)引腳?!衽c通用串行總線UART3接口有關(guān)的引腳為PD6(UART3_RX)、PD5(UART3_TX)引腳?!衽cSPI總線有關(guān)的引腳為PC7(SPI_MISO)、PC6(SPI_MOSI)、PC5(SPI_SCK)、PE5(SPI_NSS)引腳。SPI通信協(xié)議簡(jiǎn)單,作為主設(shè)備的MCU,通過I/O引腳模擬SPI時(shí)序的方式實(shí)現(xiàn)SPI串行通信不難,但將MCU作SPI總線從設(shè)備時(shí),最好保留SPI硬件接口的輸入/輸出引腳,以便通過中斷方式接收SPI總線上的數(shù)據(jù)。

●與I2C總線有關(guān)的引腳為PE1(I2C_SCL)、PE2(I2C_SDA)。如果系統(tǒng)中存在I2C總線器件,即使不打算采用MCU內(nèi)硬件I2C總線接口電路,即在采用軟件模擬I2C總線的情況下,也建議使用這兩個(gè)引腳作為I2C總線時(shí)鐘線和數(shù)據(jù)線,原因是這兩個(gè)引腳是STM8S系列芯片唯一的真正意義上的OD輸出引腳?!衽cADC有關(guān)的引腳為PB口引腳、PF口引腳以及PE7、PE6引腳。

(3)?PE1、PE2引腳沒有內(nèi)置保護(hù)二極管,處于輸出狀態(tài)時(shí),屬于真正意義上的OD輸出。

(4)部分引腳可以承受20mA灌電流??紤]到MCU功耗限制,當(dāng)負(fù)載較重(拉電流或灌電流超過2mA)時(shí),最好外接驅(qū)動(dòng)芯片。

(5)作為輸出引腳使用時(shí),并非所有引腳均可編程選擇高速輸出方式(即輸出信號(hào)頻率最高為10MHz)。實(shí)際上,STM8S系列MCU大部分引腳僅支持O1輸出特性(輸出信號(hào)上限頻率為2MHz,這類引腳輸出高低電平驅(qū)動(dòng)電流也不大),也就是說,這類引腳在輸出狀態(tài)下Px_CR2寄存器位沒有意義。在STM8S中,可以選擇O3(最高輸出頻率為10MHz)或O1輸出特性的引腳為TIM1~TIM3的輸出比較引腳、時(shí)鐘輸出引腳CLK_CCO(即PE0)、UART發(fā)送及接收引腳、SPI總線收發(fā)及時(shí)鐘信號(hào)引腳、PH0與PH1引腳等。因此,當(dāng)需要從MCU引腳輸出2MHz以上的高速信號(hào)時(shí),必須選擇具有O3、O4輸出特性的引腳(具有O3、O4輸出特性的引腳也同時(shí)具有HS特性,高、低電平驅(qū)動(dòng)能力很強(qiáng),最高可達(dá)20mA)。

2.定時(shí)器資源分配

STM8S提供了1個(gè)16位高級(jí)定時(shí)器TIM1和兩個(gè)通用定時(shí)器TIM2及TIM3。盡管這三個(gè)16位定時(shí)器的基本功能相同或相似,但彼此之間還是有差別的。在實(shí)際應(yīng)用系統(tǒng)中,必須根據(jù)具體情況選擇,如按定時(shí)精度、待測(cè)量輸入信號(hào)性質(zhì)、輸出信號(hào)特征等,從簡(jiǎn)單到復(fù)雜依次分配TIM3、TIM2、TIM1,避免出現(xiàn)殺雞用牛刀的現(xiàn)象。

3.外中斷資源分配在STM8S系統(tǒng)中,處于輸入方式的PA~PE口引腳均具有中斷輸入功能,且數(shù)量多,外中斷資源分配容易,唯一需要注意的是:同一個(gè)I/O引腳外中斷只能選擇相同的觸發(fā)方式。在原理圖設(shè)計(jì)階段,只需確定非可選的硬件資源,如串行通信口、AD轉(zhuǎn)換器輸入端等的分配,而對(duì)于可選擇的資源只能隨機(jī)分配。這是因?yàn)樵赑CB布局、布線過程中,應(yīng)依據(jù)信號(hào)特征、連線交叉最少原則,在可選的引腳資源中重新調(diào)整。換句話說,控制系統(tǒng)中MCU外圍接口單元電路系統(tǒng)信號(hào)的輸入、輸出引腳具體接MCU的哪一個(gè)引腳,只有在完成了PCB布線后才能最終確定。11.1.2硬件可靠性設(shè)計(jì)單片機(jī)應(yīng)用系統(tǒng)主要面向工業(yè)控制、智能化、自動(dòng)化儀器儀表等,任何差錯(cuò)都可能造成非常嚴(yán)重的后果。此外,單片機(jī)應(yīng)用系統(tǒng)的工作環(huán)境惡劣,個(gè)別系統(tǒng)甚至要求在無人值守的情況下工作??梢?,系統(tǒng)對(duì)可靠性的要求高,而影響單片機(jī)應(yīng)用系統(tǒng)可靠性的因素很多,如電磁干擾、電網(wǎng)電壓波動(dòng)、溫度及濕度變化、元器件參數(shù)等,需要針對(duì)不同的使用條件及可靠性要求,在硬件、軟件上采取相應(yīng)的措施。有關(guān)STM8S芯片未用引腳的處理方式參閱2.3.2節(jié)有關(guān)內(nèi)容;電源供電與濾波方式參閱2.4節(jié)有關(guān)內(nèi)容。

1)抑制輸入/輸出通道的干擾采用隔離和濾波技術(shù)抑制輸入/輸出通道可能出現(xiàn)的干擾。常用的隔離器件有:隔離變壓器、光電耦合器、繼電器和隔離放大器等,應(yīng)根據(jù)傳輸信號(hào)的種類(模擬信號(hào)還是開關(guān)信號(hào)、頻率、幅度)選擇相應(yīng)的隔離器件。例如,對(duì)于低速開關(guān)、電平信號(hào),優(yōu)先選用光電耦合器作為隔離器件;對(duì)于高頻開關(guān)信號(hào),采用脈沖變壓器作為隔離器件;對(duì)微弱模擬信號(hào),采用隔離放大器作為隔離器件。

2)抑制供電系統(tǒng)干擾單片機(jī)應(yīng)用系統(tǒng)的供電線路是干擾的主要入侵途徑,常采用下列措施進(jìn)行抑制:

(1)單片機(jī)系統(tǒng)的供電線路和產(chǎn)生干擾的用電設(shè)備分開供電。通常干擾源為各類大功率設(shè)備,如電機(jī)。對(duì)于小功率的單片機(jī)系統(tǒng),在干擾嚴(yán)重的系統(tǒng)中,必要時(shí)采用CMOS器件,設(shè)計(jì)成低功耗系統(tǒng),并用電池供電,干擾即可大大減少。

(2)通過低通濾波器和隔離變壓器接入電網(wǎng)。低通濾波器可以吸收大部分電網(wǎng)中的“毛刺”,隔離變壓器在初級(jí)繞組和次級(jí)繞組之間多加了一層屏蔽層,并將它和鐵芯一起接地,防止干擾通過初次級(jí)之間的寄生電容耦合進(jìn)入單片機(jī)的供電系統(tǒng)。該屏蔽層也可用加繞的一層線圈來充當(dāng)(一頭接地,一層空置)。

(3)整流元件上并接濾波電容,可以在很大程度上削弱高頻干擾,濾波電容可選用容量在1000pF~0.1μF之間的無感瓷片電容或CBB電容。

(4)數(shù)字信號(hào)采用負(fù)邏輯傳輸。如果定義低電平為有效電平,高電平為無效電平,就可以減少干擾引起的誤動(dòng)作,提高數(shù)字信號(hào)傳輸?shù)目煽啃浴?/p>

3)抑制電磁場(chǎng)干擾可采取的措施抑制電磁場(chǎng)的干擾可采用屏蔽和接地兩種措施。用金屬外殼或金屬屏蔽罩將整機(jī)或部分元器件包起來,再將金屬外殼接地,起到屏蔽的作用。單片機(jī)系統(tǒng)中有數(shù)字地、模擬地、交流地、信號(hào)地、屏蔽地(機(jī)殼地),應(yīng)分別接不同性質(zhì)的地。印制板中的地線應(yīng)接成網(wǎng)狀,而且其他布線不要形成回路,特別是環(huán)繞外周的環(huán)路,接地線最好根據(jù)電路通路逐漸加寬,而高頻電路板多采用大面積接地連接方式。強(qiáng)信號(hào)地線和弱信號(hào)地線要分開。

4)減小CPU芯片工作時(shí)產(chǎn)生的電磁輻射如果CPU工作時(shí)產(chǎn)生的電磁輻射干擾了系統(tǒng)內(nèi)的無線接收電路,則除了應(yīng)對(duì)CPU芯片采取屏蔽措施外,還必須在滿足速度要求的前提下,盡可能地降低系統(tǒng)時(shí)鐘頻率。其原因是系統(tǒng)時(shí)鐘頻率越低,晶振電路產(chǎn)生的電磁輻射量越小。11.1.3元器件選擇原則單片機(jī)應(yīng)用系統(tǒng)中使用的各種元器件的種類繁多、功能各異、價(jià)格不等,這就為用戶在元器件的功能、特性等方面進(jìn)行選擇提供了較大的自由度。用戶必須對(duì)所設(shè)計(jì)的系統(tǒng)的要求及芯片的特性有充分了解后才能做出正確、合理的選擇。選擇元器件的基本原則是選擇那些滿足性能指標(biāo)、可靠性高、經(jīng)濟(jì)性好的元器件。選擇元器件時(shí)應(yīng)考慮下列因素。

1)性能參數(shù)和經(jīng)濟(jì)性在選擇元器件時(shí),必須按照器件手冊(cè)所提供的各種參數(shù),如工作條件、電源要求、邏輯特性等指標(biāo)綜合考慮,不能單純追求超出系統(tǒng)指標(biāo)要求的高速、高精度、高性能等。按工作條件分類,電子元器件分為民用級(jí)、工業(yè)級(jí)、汽車級(jí)、軍用級(jí)四大類。例如,雙OC輸出比較器LM393(民用級(jí),工作溫度范圍為0~70℃)、LM293(工業(yè)級(jí),工作溫度范圍為?-25~+85℃)、LM2903(汽車級(jí),工作溫度范圍為?-40~+85℃)、LM193(軍用級(jí),工作溫度范圍為?-55~+125℃);又如LM358通用運(yùn)放,對(duì)應(yīng)的工業(yè)級(jí)型號(hào)為L(zhǎng)M258,對(duì)應(yīng)的汽車級(jí)型號(hào)為L(zhǎng)M2904,對(duì)應(yīng)的軍用級(jí)型號(hào)為L(zhǎng)M158。盡管這些元器件功能相同、引腳兼容,甚至絕大部分的性能指標(biāo)也非常相近,但價(jià)格差異卻很大,因此應(yīng)根據(jù)產(chǎn)品的實(shí)際工作環(huán)境、用途以及該元器件對(duì)系統(tǒng)性能指標(biāo)的影響,來選擇對(duì)應(yīng)級(jí)別的芯片,使產(chǎn)品具有較高的性價(jià)比。

2)通用性在應(yīng)用系統(tǒng)中,盡量采用通用的大規(guī)模集成電路芯片,這樣能簡(jiǎn)化系統(tǒng)的設(shè)計(jì)、安裝和調(diào)試,也有助于提高系統(tǒng)的可靠性。一般原則是:能用一塊中大規(guī)模芯片完成的功能,不用多個(gè)中小規(guī)模電路芯片實(shí)現(xiàn);能用MCU實(shí)現(xiàn)的功能,盡量避免用多塊中小規(guī)模數(shù)字IC芯片實(shí)現(xiàn)。

3)型號(hào)和公差在確定元器件參數(shù)之后,還要確定元器件的型號(hào),這主要取決于電路所允許元器件的公差范圍。如電解電容器可滿足一般的應(yīng)用,但對(duì)于電容公差要求高的電路,電解電容就不宜采用。電路系統(tǒng)中限流、降壓電阻,一般可選擇E24系列普通精度電阻(誤差為5%),而對(duì)于有源濾波器、振蕩器中的參數(shù)電阻,須選擇E96系列精密電阻(誤差小于1%),甚至E192(誤差小于0.5%)系列超高精密電阻。

4)與系統(tǒng)速度匹配單片機(jī)時(shí)鐘頻率一般可在一定的范圍內(nèi)選擇,在不影響系統(tǒng)性能的前提下,選擇較低的時(shí)鐘頻率,這樣可降低系統(tǒng)內(nèi)其他元器件對(duì)速度的要求,從而降低成本,提高系統(tǒng)的可靠性。另外,也將降低晶振電路潛在的電磁干擾。

5)外圍電路芯片類型由于TTL數(shù)字IC芯片功耗大,已廣泛被速度與之相近、邏輯及引腳與之兼容、功耗小得多的74HC系列所取代,因此無論系統(tǒng)對(duì)功耗有無要求,都盡可能不用TTL數(shù)字電路芯片。對(duì)于低功耗、慢速系統(tǒng),應(yīng)采用微功耗的CMOS系列數(shù)字電路,如CD4000系列或CD4500系列。

6)元件封裝方式的選擇為減小元件的體積,減小元件引腳的寄生電感和電阻,提高系統(tǒng)的工作速度,小功率元件盡量采用表面封裝元件和芯片,如SMC封裝電阻、電容(電源高頻濾波電容應(yīng)采用穿通封裝CBB電容);無引線封裝二極管;各類貼片三極管、IC芯片等。采用貼片元件,不僅減小了系統(tǒng)的體積,提高了系統(tǒng)的工作頻率,方便了印制板加工,還提高了裝配、焊接工藝的質(zhì)量。在貼片元件中,對(duì)于無源器件,在體積沒有特殊要求情況下,應(yīng)盡量選擇0805封裝尺寸的電阻、電容。對(duì)于中小規(guī)模IC芯片,盡量選擇引腳間距較大的SOP封裝形式。個(gè)別耗散功率較大的電阻,可選擇1206封裝規(guī)格,或用兩個(gè)0805封裝電阻并聯(lián)擴(kuò)大耗散功率代替一個(gè)1206封裝電阻(依次類推,可用兩個(gè)1206封裝電阻并聯(lián)以獲得更大的耗散功率)。例如,某電路需要一個(gè)1/4W的510Ω電阻,可以選擇1206封裝的510Ω電阻;也可以用兩個(gè)1kΩ的0805封裝電阻并聯(lián)來代替。實(shí)踐證明:元器件尺寸越小,印制板線條寬度與焊盤尺寸就越小,焊接工藝的可靠性就越低。11.1.4印制電路設(shè)計(jì)原則單片機(jī)應(yīng)用系統(tǒng)產(chǎn)品在結(jié)構(gòu)上離不開用于固定單片機(jī)芯片及其他元器件的印制板。通常這類印制板布線密度高、焊點(diǎn)分布密度大,常需要雙面(個(gè)別情況下可采用多層板)才能滿足電路電磁兼容性的要求。此外,無論采用何種電路CAD軟件完成PCB設(shè)計(jì),都不宜采用自動(dòng)布局、布線方式,必須通過手工方式進(jìn)行。在編輯印制板時(shí),需要遵循下列原則:

(1)晶振必須盡可能地靠近MCU晶振引腳,且晶振電路周圍的元件面及焊錫面內(nèi)不能走其他的信號(hào)線,最好在元件面內(nèi)晶振電路的位置放置一個(gè)與地線相連的屏蔽層,必要時(shí)將晶振外殼和與地線相連的屏蔽層焊接在一起,如圖11-2所示。圖11-2在PCB板上晶振與MCU位置關(guān)系當(dāng)兩片MCU或其他器件通過小電容共用同一個(gè)晶振電路時(shí),在PCB板上這兩個(gè)元件必須盡量靠近,使時(shí)鐘信號(hào)的走線盡量短,避免高頻時(shí)鐘信號(hào)干擾其他信號(hào),如圖11-3所示(U12與U16共用晶振Y1,即U12振蕩信號(hào)通過C56接U16的外時(shí)鐘信號(hào)輸入端)。圖11-3兩MCU或其他器件共用時(shí)鐘信號(hào)

(2)對(duì)電源、地線的要求。在雙面印制板上,電源線和地線應(yīng)盡可能地安排在不同的面上,且平行走線,這樣線間寄生電容將起濾波作用。對(duì)于功耗較大的數(shù)字電路芯片,如MCU、驅(qū)動(dòng)器等盡可能地采用單點(diǎn)接地方式,即這類芯片電源、地線應(yīng)單獨(dú)走線,并連到印制板電源、地線入口處。電源線和地線寬度應(yīng)盡可能地大一些,或采用微帶走線方式,或采用大面積接地方式。

(3)模擬信號(hào)和數(shù)字信號(hào)不能共地,即采用單點(diǎn)接地方式。

(4)在中低頻(晶振頻率小于20MHz)應(yīng)用系統(tǒng)中,走線轉(zhuǎn)角可取45°;在高頻系統(tǒng)中,必要時(shí)可選擇圓角模式,不宜采用90°轉(zhuǎn)角模式。

(5)在連線時(shí),一般應(yīng)按原理圖中元件連接關(guān)系連線,但當(dāng)電路中存在若干地位等同的單元電路時(shí),可根據(jù)連線是否方便重新調(diào)整原理圖中單元電路的位置。例如,對(duì)于四單元模擬比較器LM339來說,假設(shè)原理圖中局部電路A使用1單元,局部電路B使用2單元,局部電路C使用3單元。如果連線時(shí)發(fā)現(xiàn),局部電路A使用3單元,局部電路B使用1單元,局部電路C使用2單元連接交叉最少,則立刻調(diào)整原理圖中的連接關(guān)系,這是因?yàn)樗膯卧容^器LM339內(nèi)各單元的地位完全相同。對(duì)于輸入信號(hào)線,其走線應(yīng)盡可能地短,必要時(shí)在信號(hào)線兩側(cè)放置地線屏蔽,防止可能出現(xiàn)的干擾。不同的信號(hào)線應(yīng)避免平行走線,上下兩面的信號(hào)線最好垂直或斜交叉走線,這樣相互間的干擾可減到最小。11.2軟件設(shè)計(jì)11.2.1存儲(chǔ)器資源分配

STM8S系列MCU內(nèi)嵌的RAM容量較大,在1~6?KB之間(具體數(shù)目與芯片型號(hào)有關(guān)),地址在0000H~17FFH之間。盡管不同單元讀寫指令形式相同,但訪問位于00頁內(nèi)的RAM存儲(chǔ)單元(地址在00H~FFH)時(shí),指令代碼短,因此常用變量應(yīng)盡可能地安排在00頁內(nèi)的RAM空間內(nèi),并將地址標(biāo)號(hào)定義為字節(jié)類型。例如:

LDA,00H ;?00單元送累加器A,該指令機(jī)器碼為B6、00,僅為2個(gè)字節(jié)

LDA,0100H ;?0100單元送累加器A,該指令機(jī)器碼為C6、01、00,占3個(gè)字節(jié)

MOV10H,80H ;把00頁內(nèi)80H單元的內(nèi)容送到00頁內(nèi)的10H單元中,該指令為3個(gè)

;字節(jié)MOV10H,1080H ;把00段內(nèi)1080H單元的內(nèi)容送到00頁內(nèi)的10H單元中,該指令為

;?5個(gè)字節(jié)表面上看,一條指令省下一兩個(gè)字節(jié)存儲(chǔ)空間似乎意義不大,但當(dāng)系統(tǒng)控制程序中存在多條這樣的指令時(shí),節(jié)省的存儲(chǔ)空間卻非常可觀。

FlashROM容量為8~128?KB(地址在8000H~27FFFH之間),其容量的大小與芯片的容量有關(guān)。但當(dāng)程序代碼、數(shù)表位于00段內(nèi)(8000H~FFFFH,即前32KB)時(shí),指令代碼短,尋址方式多,可直接使用多分支散轉(zhuǎn)指令,因此常用數(shù)表應(yīng)盡量安排在00段內(nèi)。11.2.2程序語言及程序結(jié)構(gòu)選擇設(shè)計(jì)控制程序時(shí),可以選擇匯編語言,也可以根據(jù)特定MCU開發(fā)環(huán)境,選擇相應(yīng)的C語言。例如,開發(fā)基于MCS-51或ARM內(nèi)核MCU芯片應(yīng)用系統(tǒng),選擇KeilC;開發(fā)基于STM8內(nèi)核MCU芯片應(yīng)用系統(tǒng),選擇CosmicC、RaisonnaceC或IAR等。選擇C語言時(shí),可充分利用芯片生產(chǎn)商或編譯器開發(fā)商提供的所謂“標(biāo)準(zhǔn)”庫函數(shù),程序的編寫、調(diào)試、維護(hù)相對(duì)容易,但編譯后程序代碼長(zhǎng),存儲(chǔ)程序代碼所需的存儲(chǔ)空間大,執(zhí)行速度慢,而采用匯編語言時(shí)情況正好相反。一個(gè)設(shè)計(jì)優(yōu)良的單片機(jī)應(yīng)用系統(tǒng),應(yīng)盡可能地采用匯編語言編寫監(jiān)控程序。單片機(jī)芯片程序存儲(chǔ)空間較小,在某些應(yīng)用系統(tǒng)中所用的MCU片內(nèi)程序存儲(chǔ)器容量只有幾千字節(jié)(KB),如STM8S103F2芯片,無法存放由特定C語言編寫獲得的代碼。即使程序存儲(chǔ)器容量不是問題,但C語言源程序編譯效率低,相同的操作對(duì)應(yīng)了多條指令,運(yùn)行速度變慢,這意味著在速度相同的情況下,要采用更高頻率的晶振—這在單片機(jī)應(yīng)用系統(tǒng)中不可取。此外,利用匯編語言編寫控制程序時(shí),可在源程序中增加與可靠性相關(guān)的指令,強(qiáng)化了系統(tǒng)的可靠性、穩(wěn)定性。因此,在程序設(shè)計(jì)過程中,使用匯編語言并多花一些時(shí)間優(yōu)化程序代碼,以便使用更低的MCU主頻和較小的程序存儲(chǔ)空間。根據(jù)系統(tǒng)的監(jiān)控功能,正確、合理地選擇程序結(jié)構(gòu)—是串行多任務(wù)程序結(jié)構(gòu)還是并行多任務(wù)程序結(jié)構(gòu)。當(dāng)系統(tǒng)中存在多個(gè)需要實(shí)時(shí)處理的任務(wù)時(shí),必須選擇并行多任務(wù)程序結(jié)構(gòu),否則系統(tǒng)的實(shí)時(shí)性將無法保證。11.3STM8芯片提供的可靠性功能

11.3.1提高晶振電路的可靠性在對(duì)定時(shí)精度要求很高的系統(tǒng)中,一般均使用穩(wěn)定性好、精度高的晶體振蕩器,然而不幸的是:晶振電路往往比較脆弱—強(qiáng)烈振動(dòng)、碰撞等原因可能會(huì)造成晶振損壞,嚴(yán)重干擾也可能使晶振停振。為此,STM8S提供了CSS(時(shí)鐘安全機(jī)制),當(dāng)CSS有效時(shí),一旦晶振停振,STM8芯片會(huì)自動(dòng)使用內(nèi)部高速HSI振蕩器的8分頻(頻率為2?MHz)作主時(shí)鐘信號(hào),繼續(xù)運(yùn)行。只要外晶振頻率為2?MHz、4?MHz、8?MHz或16?MHz之一,那么MCU檢測(cè)到晶振失效后,在時(shí)鐘中斷服務(wù)程序中,重新設(shè)定HSI時(shí)鐘的分頻系數(shù),獲得相同頻率的主時(shí)鐘信號(hào),以保證系統(tǒng)繼續(xù)運(yùn)行。11.3.2使用存儲(chǔ)器安全機(jī)制保護(hù)程序代碼不被意外改寫

STM8芯片復(fù)位以后,F(xiàn)lash區(qū)、DATA區(qū)、選項(xiàng)字節(jié)就自動(dòng)處于寫保護(hù)狀態(tài),避免意外寫入造成數(shù)據(jù)丟失。對(duì)這些區(qū)域進(jìn)行寫操作前,需要按特定的步驟進(jìn)行解鎖操作方能寫入。此外,在定義UBC存儲(chǔ)區(qū)后,就不能通過IAP方式向UBC存儲(chǔ)區(qū)寫入信息,這在一定程度上避免了代碼的意外丟失。11.3.3硬件看門狗

STM8內(nèi)核MCU具有獨(dú)立硬件看門狗計(jì)數(shù)器和窗口看門狗計(jì)數(shù)器,在啟動(dòng)后,若未能在特定時(shí)刻前刷新,則看門狗計(jì)數(shù)器溢出,觸發(fā)芯片復(fù)位,有效地提高了系統(tǒng)的可靠性。11.4軟件可靠性設(shè)計(jì)單片機(jī)主要面向工業(yè)控制、智能化儀器儀表以及家用電器,這對(duì)單片機(jī)應(yīng)用系統(tǒng)的可靠性提出了很高的要求。在數(shù)字系統(tǒng)中,總會(huì)存在這樣或那樣的干擾。導(dǎo)致計(jì)算機(jī)系統(tǒng)不可靠的因素很多,無論是TTL,還是CMOS數(shù)字電路芯片,在邏輯轉(zhuǎn)換瞬間,電源電流ICC存在尖峰現(xiàn)象;繼電器吸合,尤其是斷開瞬間會(huì)在電源線上出現(xiàn)尖峰干擾脈沖;外界雷電干擾脈沖、接在同一個(gè)相線上的大功率電機(jī)啟動(dòng),尤其是關(guān)閉瞬間形成的干擾脈沖也會(huì)通過電源線串入控制系統(tǒng)中。此外,環(huán)境溫度的波動(dòng)、濕度的變化等因素也可能影響數(shù)字系統(tǒng)輸入/輸出信號(hào)的幅度,甚至造成程序計(jì)數(shù)器PC“跑飛”、內(nèi)部RAM、EEPROM、FlashROM存儲(chǔ)單元數(shù)據(jù)丟失等不可預(yù)測(cè)的后果。這些干擾信號(hào)除了借助硬件低通濾波器、施密特觸發(fā)器,以及良好的PCB布局與布線等措施消除外,在單片機(jī)控制系統(tǒng)中還必須借助軟件方式提高系統(tǒng)的可靠性,以降低系統(tǒng)的硬件成本。此外,僅依靠硬件方式并不能完全解決單片機(jī)控制系統(tǒng)的可靠性問題,因此,軟件可靠性設(shè)計(jì)技術(shù)在單片機(jī)控制系統(tǒng)中得到了廣泛應(yīng)用。11.4.1PC“跑飛”及其后果

CPU的工作過程總是不斷地重復(fù)“取操作碼→譯碼→取操作數(shù)→執(zhí)行”過程。在正常情況下,程序計(jì)數(shù)器PC按程序員的意圖遞增或跳轉(zhuǎn)。但當(dāng)系統(tǒng)受到干擾時(shí),程序計(jì)數(shù)器PC出錯(cuò),致使CPU不按程序員的意圖執(zhí)行程序中的指令系列,脫離正常軌道而“跑飛”,這可能會(huì)導(dǎo)致下列后果。

1)跳過部分指令或程序段的執(zhí)行一般來說,跳過程序中任何一條有效指令都會(huì)影響程序的執(zhí)行結(jié)果,進(jìn)而影響系統(tǒng)的可靠性,只是嚴(yán)重程度不同而已。例如,跳過的指令系列正好是數(shù)據(jù)輸入指令,則隨后的數(shù)據(jù)處理結(jié)果將不正確;跳過子程序返回指令RET或中斷服務(wù)程序返回IRET指令時(shí)將無法返回,除引起堆棧錯(cuò)誤外,對(duì)中斷服務(wù)程序來說還阻止了CPU響應(yīng)低優(yōu)先級(jí)的中斷請(qǐng)求。

2)拆分指令在復(fù)雜指令集(CISC)計(jì)算機(jī)系統(tǒng)(如MCS-51、STM8內(nèi)核)中,CPU受到干擾后,可能將指令操作數(shù)當(dāng)成操作碼執(zhí)行而引起混亂。當(dāng)程序計(jì)數(shù)器PC彈飛到某一個(gè)單字節(jié)指令時(shí),會(huì)自動(dòng)納入正軌(最多跳過某些指令)。在取指階段,PC“跑飛”落到雙字節(jié)或多字節(jié)指令操作數(shù)上,多字節(jié)指令必然被拆分,即把指令的操作數(shù)當(dāng)“操作碼”取出,如圖11-4所示。如果操作數(shù)對(duì)應(yīng)的“指令碼”屬于多字節(jié)指令,又有可能繼續(xù)拆分緊隨其后的多字節(jié)指令,會(huì)再出錯(cuò),如圖11-4(a)所示。除非被拆分的指令后為m?-?1條單字節(jié)指令(m是CPU最長(zhǎng)指令字節(jié)數(shù),MCS-51內(nèi)核CPU最長(zhǎng)指令碼為3字節(jié);STM8內(nèi)核CPU最長(zhǎng)指令碼為5個(gè)字節(jié)),如圖11-4(b)所示。圖11-4指令拆分示意圖對(duì)于圖11-4(a)來說,不論“跑飛”的PC指針落入當(dāng)前指令操作數(shù)中的首字節(jié)還是最后一個(gè)字節(jié),情況都非常糟糕。當(dāng)拆分點(diǎn)不是當(dāng)前指令的最后一個(gè)字節(jié)時(shí),無論拆分點(diǎn)對(duì)應(yīng)的“操作碼”是單字節(jié)指令還是多字節(jié)指令,都有可能再拆分(或跳過)隨后的第n?+?1條指令。除非拆分點(diǎn)為當(dāng)前指令的最后一個(gè)字節(jié),且對(duì)應(yīng)的“操作碼”為單字節(jié)指令時(shí),才不再拆分(包括跳過)隨后的第n?+?1條指令。對(duì)于圖11-4(b)來說,不論“跑飛”的PC指針落入當(dāng)前指令操作數(shù)中的首字節(jié)還是最后一個(gè)字節(jié),也不論拆分重組指令是單字節(jié)還是多字節(jié),均不會(huì)再拆分第n?+?4條指令后的指令系列,即執(zhí)行到第n?+?5條指令時(shí),PC一定能納入正軌。不過,當(dāng)拆分重組“指令碼”為多字節(jié)指令時(shí),可能會(huì)跳過第n?+?1條指令后的一條或多條單字節(jié)指令的執(zhí)行。在CISC指令集CPU芯片中,多字節(jié)指令不因其以上的多字節(jié)指令拆分而被拆分的條件是該指令前為m?-?1條單字節(jié)指令;多字節(jié)指令被拆分而不再拆分緊隨其后指令的條件是其后為m?-?1條單字節(jié)指令。

PC“跑飛”的后果不能預(yù)測(cè),原因是無法預(yù)料PC將從何處“飛入”何處,也就無法預(yù)測(cè)會(huì)跳過哪些指令,也不能預(yù)測(cè)將會(huì)拆分哪一指令,更無法預(yù)測(cè)拆分重組后獲得的“指令”的功能。也許,會(huì)因?yàn)楦膶慠AM存儲(chǔ)單元的內(nèi)容造成數(shù)據(jù)丟失;改寫外設(shè)控制寄存器的內(nèi)容,造成外設(shè)工作異常;關(guān)閉中斷(如在STM8S中系統(tǒng)執(zhí)行了SIM指令對(duì)應(yīng)的機(jī)器碼9B)或異常返回(執(zhí)行RET指令對(duì)應(yīng)的機(jī)器碼81H、IRET指令對(duì)應(yīng)的機(jī)器碼80H),造成堆?;靵y;或進(jìn)入死循環(huán)(如執(zhí)行了JRT$指令對(duì)應(yīng)的機(jī)器碼20FE);執(zhí)行停機(jī)(執(zhí)行了Halt的機(jī)器碼)等。

3)跳到數(shù)據(jù)區(qū),把數(shù)據(jù)當(dāng)指令執(zhí)行

PC“飛入”數(shù)據(jù)區(qū),把數(shù)據(jù)當(dāng)指令執(zhí)行的后果也同樣不能預(yù)料,原因是不能限定數(shù)表中各數(shù)據(jù)項(xiàng)的內(nèi)容。為減小PC“跑飛”,拆分重組指令造成的破壞,STM8系列芯片引入了非法指令碼檢查機(jī)制—當(dāng)執(zhí)行到非法指令碼時(shí)將強(qiáng)迫系統(tǒng)復(fù)位,但希望拆分重組后獲得的指令碼為非法指令碼的概率也不會(huì)很大,原因是不能夠限定每條指令中操作數(shù)的編碼,且非法指令碼數(shù)量畢竟有限。11.4.2降低PC“跑飛”對(duì)系統(tǒng)的影響在計(jì)算機(jī)系統(tǒng)中,理論上PC“跑飛”不可避免,“跑飛”的后果無法預(yù)測(cè)。因此只能在軟件設(shè)計(jì)時(shí),采取適當(dāng)措施盡可能地減小PC“跑飛”對(duì)系統(tǒng)造成的影響,提高系統(tǒng)的可靠性。

1.指令冗余為避免拆分多字節(jié)指令時(shí)跳過的指令不影響程序的執(zhí)行結(jié)果,可在多字節(jié)指令的前、后分別插入n?-?1條單字節(jié)的空操作指令NOP。此外,為防止PC“跑飛”時(shí),跳過某些對(duì)系統(tǒng)有重要影響的指令,在可靠性要求較高的系統(tǒng)中,在速度與存儲(chǔ)器空間許可的情況下重寫特定操作指令,如輸出信號(hào)控制指令、外設(shè)工作方式設(shè)置指令、中斷控制指令、中斷優(yōu)先級(jí)設(shè)置指令等。這就是所謂的“指令冗余”方式。采用“指令冗余”方式會(huì)增加程序代碼的存儲(chǔ)量、降低系統(tǒng)的運(yùn)行效率。在實(shí)踐中不可能在所有雙字節(jié)、多字節(jié)指令的前后分別插入n?-?1條空操作指令,只在對(duì)程序流向起決定作用的指令前后插入。對(duì)MCS-51系統(tǒng)來說,在LJMP、SJMP、LCALL、JC、JNC、JB、JNB、CJNE、DJNZ等多字節(jié)指令前,插入2條NOP指令;在RET、RETI等單字節(jié)指令前,增加1~2條冗余指令。對(duì)STM8系統(tǒng)來說,在JP、JRT、CALL、JRNE、JREQ、JRNC、JRC、BTJT、BTJF等多字節(jié)指令前,插入4條NOP指令;在RET、IRET等單字節(jié)指令前,增加1~4條冗余指令(返回指令前多一條單字節(jié)指令,可少增加一條返回指令)。這樣系統(tǒng)在可靠性、速度、代碼存儲(chǔ)量三者之間可達(dá)到較好的平衡。例如,多字節(jié)指令冗余方式為

NOP

NOP

NOP

NOP ;防止其以上的指令被拆分而受到影響,正常時(shí)會(huì)影響系統(tǒng)的效率

JRNCNEXT 例如,單字節(jié)指令冗余方式為

RET

RET

RET

RET ;增加1~4條冗余指令,防止其以上的指令被拆分而跳過

RET ;正常時(shí)不影響系統(tǒng)的速度,僅多占用4個(gè)單元的存儲(chǔ)空間為防止“PC”跑飛,拆分重組指令關(guān)閉中斷、禁止定時(shí)/計(jì)數(shù)器工作,尤其是軟件類看門狗定時(shí)器。為此,在主程序的適當(dāng)?shù)胤剑绮⑿卸嗳蝿?wù)程序結(jié)構(gòu)中的任務(wù)調(diào)度處或作業(yè)調(diào)度處,插入重開中斷、重復(fù)啟動(dòng)定時(shí)/計(jì)數(shù)器、軟件看門狗計(jì)數(shù)器等冗余指令。盡管在RISC指令集計(jì)算機(jī)系統(tǒng)中,每條指令長(zhǎng)度都相同,不存在指令被拆分的問題,但PC“跑飛”同樣存在跳過某些指令或程序段的風(fēng)險(xiǎn),在程序中重復(fù)書寫關(guān)鍵操作指令的方式依然必要。

2.增加數(shù)據(jù)可靠性的方法為防止PC“跑飛”時(shí)跳過數(shù)據(jù)輸入指令系列,造成隨后的數(shù)據(jù)處理不正確,可在數(shù)據(jù)輸入處理指令前設(shè)置接收標(biāo)志(如55H、5AH、A5H或AAH),在數(shù)據(jù)處理前先檢查接收標(biāo)志是否正確,待數(shù)據(jù)處理結(jié)束后再清除正確接收標(biāo)志。一旦發(fā)現(xiàn)接收標(biāo)志異常,幾乎可以肯定PC已“跑飛”,視情況采取相應(yīng)的對(duì)策。由于無法預(yù)測(cè)PC“跑飛”拆分重組指令的功能,因此對(duì)存放在RAM中的重要數(shù)據(jù)應(yīng)增加校驗(yàn)信息字節(jié),可根據(jù)需要選擇“和”校驗(yàn)、某特征值倍數(shù)校驗(yàn),甚至CRC校驗(yàn)方式。當(dāng)存儲(chǔ)空間允許時(shí),除了采用某種校驗(yàn)方式外,還可采用備份方式來進(jìn)一步提高數(shù)據(jù)的可靠性。一旦發(fā)現(xiàn)校驗(yàn)錯(cuò),就可以肯定PC已“跑飛”,視情況采取相應(yīng)的對(duì)策。11.4.3PC“跑飛”攔截技術(shù)在CISC指令系統(tǒng)中,采用指令冗余技術(shù)只保證了PC“跑飛”后迅速將其納入正軌,避免錯(cuò)誤擴(kuò)大化而已,但依然跳過了被拆分指令,可視為重組指令操作數(shù)的指令碼的執(zhí)行,更為嚴(yán)重的是無法預(yù)測(cè)拆分重組指令執(zhí)行后對(duì)系統(tǒng)造成的危害。此外,無論是CISC指令系統(tǒng),還是RISC指令系統(tǒng),PC“跑飛”均可能跳過若干指令系列。在理論上,在做好重要數(shù)據(jù)、系統(tǒng)狀態(tài)備份或保護(hù)的情況下,采用有效的軟件攔截技術(shù),在感知PC“跑飛”后,利用軟件復(fù)位功能或進(jìn)入循環(huán)等待看門狗計(jì)數(shù)器溢出方式強(qiáng)迫系統(tǒng)復(fù)位,避免系統(tǒng)帶病運(yùn)行,才能徹底解決PC指針“跑飛”帶來的可靠性問題。所謂攔截技術(shù)是指將“跑飛”的PC指針引向指定位置,進(jìn)行出錯(cuò)處理后,再?gòu)?qiáng)迫系統(tǒng)復(fù)位的方法。常用的攔截手段包括傳統(tǒng)的軟件陷阱攔截和遠(yuǎn)程攔截兩種方式。

1.軟件陷阱所謂軟件陷阱,就是一條引導(dǎo)指令,強(qiáng)行將捕獲的程序引向一個(gè)指定的地址,在那里有一段專門對(duì)程序出錯(cuò)進(jìn)行處理的指令。對(duì)于STM8系統(tǒng)來說,軟件陷阱就是一條軟件中斷TRAP指令。為了增強(qiáng)捕獲效果,一般需要5條TRAP指令,保證軟件不因其以上多字節(jié)指令被拆分而失效。在STM8系統(tǒng)中,真正的軟件陷阱由5條單字節(jié)指令TRAP構(gòu)成:

TRAP TRAP TRAP TRAP TRAP ;軟件中斷指令在軟件中斷服務(wù)程序中,完成了相應(yīng)的錯(cuò)誤處理(如數(shù)據(jù)保護(hù)、設(shè)置相關(guān)標(biāo)志)后,執(zhí)行非法指令碼,如05H(STM8具有05H、0BH、71H、75H四個(gè)單字節(jié)非法指令碼),強(qiáng)迫MCU芯片復(fù)位。軟件中斷服務(wù)程序結(jié)構(gòu)如下:InterruptTRAP_ServiceTRAP_Service.L ;錯(cuò)誤處理DC.B05H,05H,05H,05H,05H ;用非法指令碼代替軟件中斷服務(wù)返回指令

;IRET ;為增強(qiáng)捕獲效果使用了多條TRAP指令,只能復(fù)位 在PC“跑飛”后,不需要進(jìn)行數(shù)據(jù)保護(hù),可直接采用STM8系統(tǒng)的單字節(jié)非法指令碼構(gòu)成STM8系統(tǒng)的軟件陷阱。在這種情況下,軟件陷阱為5個(gè)單字節(jié)非法指令碼(用5個(gè)單字節(jié)非法指令碼構(gòu)成軟件陷阱的原因也是為了增強(qiáng)捕獲效果)。

DC.B05H,05H,05H,05H,05H ;用非法指令碼代替軟件中斷指令,形成軟件陷阱軟件陷阱可安排在無條件跳轉(zhuǎn)指令之后,未使用的中斷服務(wù)區(qū)、未使用的大片F(xiàn)lashROM存儲(chǔ)區(qū)以及數(shù)表的前后等正常程序執(zhí)行不到的地方,這樣做不影響程序的執(zhí)行效率。

(1)在跳轉(zhuǎn)指令之后,插入軟件陷阱指令系列,如下所示:NOPNOPNOPNOP ;根據(jù)需要,增加冗余指令,防止跳轉(zhuǎn)指令被拆分JRT NEXT ;在無條件跳轉(zhuǎn)JRT、JP、JPF指令后,加軟件陷阱指令系列TRAPTRAPTRAPTRAPTRAP

;軟件中斷指令NEXT:(2)在數(shù)表的前、后插入軟件陷阱指令系列,如下所示:

TRAP ;在數(shù)表前插入軟件陷阱指令系列

TRAP TRAP TRAP TRAP ;軟件中斷指令DATATAB: DC.B23H,… ;數(shù)表

TRAP ;在數(shù)表前插入軟件陷阱指令系列

TRAP TRAP TRAP TRAP ;軟件中斷指令(3)在子程序及中斷返回指令之后,插入軟件陷阱指令系列,如下所示:

RET TRAP ;在子程序、中斷返回指令后插入軟件陷阱指令系列

TRAP TRAP TRAP TRAP ;軟件中斷指令(4)在未用的中斷服務(wù)區(qū)內(nèi),插入軟件陷阱指令系列,如下所示:

interruptNonHandledInterruptNonHandledInterrupt.l TRAP TRAP TRAP TRAP TRAP ;軟件中斷指令

iret

(5)在未用的FlashROM存儲(chǔ)空間,用軟件陷阱指令碼(83H)或單字節(jié)非法指令碼05H填充。擦除操作后,STM8未用的存儲(chǔ)單元為00H。寫片時(shí),未用存儲(chǔ)單元最好用軟件中斷指令碼“83H”(PC“跑飛”后需要進(jìn)行數(shù)據(jù)保護(hù)時(shí))或非法指令碼,如05H、0BH填充(無須進(jìn)行保護(hù)數(shù)據(jù)時(shí)),原因是STM8內(nèi)核CPU“NOP”指令碼為9DH而不是00H。其實(shí),在STM8指令系統(tǒng)中,00H對(duì)應(yīng)“NEG(XX,SP)”指令的操作碼。如果不用軟件中斷指令機(jī)器碼83H或單字節(jié)非法指令碼,如05H、0BH填充,則當(dāng)PC“飛”入未用程序存儲(chǔ)區(qū)時(shí),不僅不能返回正常的操作狀態(tài),還可能改寫了RAM存儲(chǔ)單元的內(nèi)容。設(shè)置了軟件陷阱后,一旦PC“跑飛”掉入陷阱內(nèi),在完成了相應(yīng)的錯(cuò)誤處理,如保護(hù)數(shù)據(jù)、設(shè)置復(fù)位標(biāo)志后,執(zhí)行非法指令碼,觸發(fā)系統(tǒng)進(jìn)入復(fù)位狀態(tài)。軟件陷阱方式對(duì)PC在模塊內(nèi)“跑飛”、模塊間“跑飛”均有效,但它攔截的成功率并不高,原因是:第一,程序中無條件跳轉(zhuǎn)指令、子程序或中斷返回指令的數(shù)目畢竟有限。第二,由于受MCU存儲(chǔ)空間的限制,因此未必能在每一條無條件跳轉(zhuǎn)指令后插入軟件陷阱指令系列,換句話說,陷阱的個(gè)數(shù)有限。第三,上述軟件陷阱的尺寸太小,僅由5個(gè)字節(jié)組成,結(jié)果“跑飛”的PC剛好落入數(shù)量有限的小陷阱中的概率不大。

2.遠(yuǎn)程攔截技術(shù)對(duì)于采用模塊化程序結(jié)構(gòu)的MCU控制系統(tǒng)程序,可采用具有遠(yuǎn)程攔截功能的模塊結(jié)構(gòu)檢測(cè)PC是否從其他模塊“飛”入。

1)攔截原理

MCU控制系統(tǒng)程序,在進(jìn)入每一個(gè)模塊后執(zhí)行其他指令前,先保存模塊入口地址,再執(zhí)行模塊實(shí)體內(nèi)的指令系列。離開時(shí),算出模塊出口地址與入口地址的差,并與模塊長(zhǎng)度比較。如果相同,則說明進(jìn)入本模塊時(shí)PC未“跑飛”,可復(fù)位看門狗定時(shí)器(簡(jiǎn)稱喂狗),并按正常步驟退出;反之,說明PC指針異常飛入,可根據(jù)需要執(zhí)行錯(cuò)誤處理,如數(shù)據(jù)、系統(tǒng)狀態(tài)保護(hù)等操作后,再執(zhí)行軟件復(fù)位或關(guān)閉中斷后執(zhí)行循環(huán)指令,等待看門狗計(jì)數(shù)器溢出,強(qiáng)迫系統(tǒng)復(fù)位。如圖11-5所示。圖11-5遠(yuǎn)程攔截判別流程圖

2)模塊結(jié)構(gòu)舉例下列分別給出具有遠(yuǎn)程攔截功能的幾種典型模塊結(jié)構(gòu)。

(1)通過堆棧保護(hù)入口地址低16位的模塊結(jié)構(gòu)。當(dāng)堆棧深度較大時(shí),將模塊入口地址壓入堆棧保存,即可獲得適用于主程序、子程序以及中斷服務(wù)程序的具有PC“跑飛”檢測(cè)功能的通用模塊結(jié)構(gòu),如下所示:Model_Name.w ;模塊名(子程序名);PUSHA ;保護(hù)現(xiàn)場(chǎng);PUSHCC;PUSHWX;PUSHWYModel_Name_IN_Adr.w ;模塊入口地址PUSH#{LOWModel_Name_IN_Adr} ;先把模塊入口地址低8位壓入堆棧PUSH#{HIGHModel_Name_IN_Adr} ;再把模塊入口地址高8位壓入堆棧;模塊實(shí)體指令系列Model_Name_OUT_Adr.w ;模塊出口地址

POPWX ;從堆棧中彈出模塊入口地址

SUBWX,#{OFFSETModel_Name_OUT_Adr} ;減去模塊出口地址低16位

NEGWX ;求補(bǔ)獲得模塊出口地址與入口地址的差

CPWX,#{OFFSETModel_Name_OUT_Adr-OFFSETModel_Name_IN_Adr};與模塊長(zhǎng)度低16位比較

JREQModel_Name_RIGHT ;相同,說明正常進(jìn)入本模塊,PC沒有“跑飛”

;不同,說明由其他模塊飛入,進(jìn)入軟件陷阱

;DC.B05H ;不需進(jìn)行數(shù)據(jù)保護(hù)時(shí)用非法指令碼,如用05H代替TRAP;DC.B05H;DC.B05H;DC.B05H;DC.B05H

TRAPModel_Name_RIGHT.W ;正常返回

;POPWY;POPWX;POPCC

;POPARET

(2)通過堆棧保護(hù)入口地址低8位的模塊結(jié)構(gòu)。當(dāng)堆棧深度有限時(shí),也可以僅保存模塊入口地址的低8位,離開時(shí)僅計(jì)算模塊出口地址與入口地址低8位之差,并與模塊長(zhǎng)度低8位比較??梢?,這種結(jié)構(gòu)是上述模塊的簡(jiǎn)化,盡管在理論上攔截的準(zhǔn)確性有所下降,但實(shí)踐表明其效果也不錯(cuò),原因是實(shí)際應(yīng)用程序中兩模塊低位地址差相同的概率不大。Model_Name.L ;模塊名(子程序名);PUSHA ;保護(hù)現(xiàn)場(chǎng);PUSHCC;PUSHWX;PUSHWYModel_Name_IN_Adr.L ;模塊入口地址

PUSH#{LOWModel_Name_IN_Adr} ;僅把模塊入口地址低8位壓入堆棧

;模塊實(shí)體指令系列Model_Name_OUT_Adr.L ;模塊出口地址

POPA ;從堆棧中彈出模塊入口地址低8位

SUBA,#{LOWModel_Name_OUT_Adr} ;減去模塊出口地址低8位

NEGA ;求補(bǔ)獲得模塊出口地址與入口地址差

CPA,#{LOWModel_Name_OUT_Adr-LOWModel_Name_IN_Adr};與模塊長(zhǎng)度低8位比較

JREQModel_Name_RIGHT ;相同,說明正常進(jìn)入本模塊,PC沒有“跑飛”不同,

;說明由其他模塊飛入,進(jìn)入軟件陷阱

;DC.B05H ;無須進(jìn)行數(shù)據(jù)保護(hù)時(shí)用非法指令碼,如05H代替TRAPTRAPModel_Name_RIGHT.L ;正常返回;POPWY;POPWX;POPCC

;POPARETF以上模塊結(jié)構(gòu)不僅適用于子程序、中斷服務(wù)程序,而且適用于多任務(wù)程序結(jié)構(gòu)中的任務(wù)模塊、任務(wù)內(nèi)的作業(yè)模塊。由于在地址標(biāo)號(hào)前加入了OFFSET、LOW、HIGH等操作符,因此與模塊入/出口地址標(biāo)號(hào)類型無關(guān),即模塊可以位于00段內(nèi)(地址標(biāo)號(hào)類型為?.W),也可以位于01段及其以上段內(nèi)(地址標(biāo)號(hào)類型為?.L)。在STM8系統(tǒng)中,對(duì)于中斷服務(wù)程序或不需要保護(hù)現(xiàn)場(chǎng)的子程序來說,模塊入口地址Model_Name_IN_Adr就是模塊名Model_Name,即不必設(shè)置模塊入口地址標(biāo)號(hào)Model_Name_IN_Adr。可見,為檢查PC“跑飛”增加的指令不多,保護(hù)低16位入口地址時(shí),每一模塊僅需要額外的15個(gè)字節(jié)存儲(chǔ)空間(當(dāng)只保護(hù)低8位入口地址時(shí),僅需11個(gè)字節(jié)),對(duì)運(yùn)行速度影響也很小。當(dāng)模塊代碼規(guī)模較大時(shí),對(duì)運(yùn)行效率的影響幾乎可忽略不計(jì)(因此不推薦在代碼長(zhǎng)度短或?qū)崟r(shí)性要求高的模塊中采用);每一模塊也只額外占用1~2個(gè)字節(jié)堆棧,對(duì)堆棧深度要求不高。不過當(dāng)堆棧深度有限時(shí),尤其是嵌套層次較多時(shí),要特別注意堆棧溢出問題(所幸的是STM8系統(tǒng)堆棧深度較大,一般不會(huì)出現(xiàn)堆棧溢出問題)。

(3)直接保護(hù)入口地址的模塊結(jié)構(gòu)。當(dāng)堆棧深度有限時(shí),可直接將模塊入口地址保存到內(nèi)部RAM單元中,其模塊結(jié)構(gòu)如下所示:Model_Name_INAdr_ram ds.w 1 ;在RAM段定義模塊入口地址保存單元Model_Name.w ;模塊名(子程序名);PUSHA;PUSHCC;PUSHWX;PUSHWYModel_Name_IN_Adr.w

LDWX,#{OFFSETModel_Name_IN_Adr} ;取模塊入口地址低16位

LDWModel_Name_INAdr_ram,X ;把模塊入口地址低16位送

;Model_Name_INAdr_ram字單元

;模塊程序?qū)嶓wModel_Name_OUT_Adr.wLDWX,#{LOWModel_Name_OUT_Adr) ;取模塊出口地址低16位

SUBWX,Model_Name_INAdr_ram ;減去模塊入口地址低16位

CPWX,#{OFFSETModel_Name_OUT_Adr-OFFSETModel_Name_IN_Adr};與模塊長(zhǎng)度比較

JREQModel_Name_RIGHT ;相同,說明正常進(jìn)入模塊,PC沒有“跑飛”

;不同,說明由其他模塊飛入,進(jìn)入軟件陷阱

TRAPModel_Name_RIGHT.W

CLRWModel_Name_INAdr_ram ;清除模塊入口地址保存單元

;POPWY

;POPWX

;POPCC

;POPA

RET需要注意的是:直接保護(hù)模塊入口地址攔截方式不支持嵌套操作,即它在主程序模塊中使用后,就不能在子程序模塊、中斷服務(wù)程序模塊中使用;在低優(yōu)先級(jí)中斷服務(wù)程序中使用后,就不能在高優(yōu)先級(jí)中斷服務(wù)程序中使用,除非每一個(gè)優(yōu)先級(jí)使用不同的內(nèi)部RAM單元存放各自的入口地址(由于同優(yōu)先級(jí)中斷不能嵌套,因此同優(yōu)先級(jí)中斷服務(wù)程序可以使用同一單元記錄入口地址)。

3)攔截效果遠(yuǎn)程攔截結(jié)構(gòu)模塊能有效地?cái)r截模塊間(遠(yuǎn)距離)“跑飛”現(xiàn)象。顯然,模塊規(guī)模越小,攔截的成功率就越高(為使攔截可靠性與效率之間取得一定的平衡,實(shí)踐表明,模塊長(zhǎng)度控制在0.5~2KB為宜)。它不僅能準(zhǔn)確感知PC是否正常進(jìn)入本模塊,還可以從模塊入口地址單元中判斷出從哪一模塊飛入,為失控后的系統(tǒng)恢復(fù)提供了有價(jià)值的線索(如可根據(jù)模塊功能,將模塊入口地址裝入PC,重新執(zhí)行“跑飛”的模塊)。這種具有遠(yuǎn)程攔截功能的模塊程序經(jīng)編譯后,模塊入口地址和出口地址固定,還能有效地阻止非授權(quán)用戶通過反匯編方式在模塊內(nèi)添加或刪除指令,在一定程度上增加了代碼的安全性。11.4.4檢查并消除STM8指令碼中不需要的關(guān)鍵字節(jié)如果在STM8內(nèi)核MCU指令碼中出現(xiàn)以下4個(gè)關(guān)鍵字節(jié),則一旦PC“跑飛”,落入包含這些關(guān)鍵字節(jié)的指令碼,并將這些關(guān)鍵字節(jié)作為指令的操作碼時(shí),后果可能非常嚴(yán)重。●?8EH,HALT指令機(jī)器碼,強(qiáng)迫MCU進(jìn)入低功耗模式。當(dāng)它在主程序中出現(xiàn),將停止運(yùn)行,直到能喚醒的中斷出現(xiàn),或看門狗計(jì)數(shù)器溢出,強(qiáng)迫系統(tǒng)復(fù)位;在中斷服務(wù)程序中出現(xiàn),則會(huì)改變中斷優(yōu)先級(jí)而造成混亂?!?8FH,WFI指令機(jī)器碼,等待一個(gè)中斷事件產(chǎn)生指令。當(dāng)它在主程序中出現(xiàn),問題還不是很大,但在中斷服務(wù)程序中出現(xiàn),就會(huì)改變中斷優(yōu)先級(jí),造成中斷嵌套混亂。●?82H,INT指令機(jī)器碼,僅用來跳轉(zhuǎn)到一個(gè)中斷子程序入口的指令?!?8BH,SWBRK指令機(jī)器碼,在調(diào)試模式時(shí)停止CPU的軟件斷點(diǎn)指令。在計(jì)算一個(gè)相對(duì)或者絕對(duì)尋址模式中時(shí)的分支指令(如條件跳轉(zhuǎn)指令、無條件跳轉(zhuǎn)指令或CALL)的目標(biāo)地址時(shí),通過鏈接器連接后可能會(huì)出現(xiàn)這些關(guān)鍵字節(jié)。當(dāng)這些指令運(yùn)行的最后一個(gè)機(jī)器碼為82H、8BH、8FH時(shí),可在目標(biāo)地址之前插入一條NOP指令消除;當(dāng)最后一個(gè)機(jī)器碼為8EH時(shí),可在目標(biāo)地址之前插入兩條NOP指令消除。如果CALL指令調(diào)用的子程序首地址位于8200H~82FFH(256B)、8B00H~8BFFH(256?B)、8E00H~8FFFH(512?B)之間,則對(duì)應(yīng)的CALL指令倒數(shù)第二個(gè)字節(jié)肯定為82H、8BH、8EH、8FH之一,解決辦法是調(diào)整子程序存放的位置,使其首地址在上述空間之外。當(dāng)JP指令、JPF指令的目標(biāo)地址在8200H~82FFH、8B00H~8BFFH、8E00H~8FFFH之間時(shí),對(duì)應(yīng)指令機(jī)器碼倒數(shù)第二字節(jié)也包含82H、8BH、8EH、8FH之一,解決方法也是調(diào)整程序的存放位置。待程序調(diào)試結(jié)束后,在列表文件(.LST)中查找上述關(guān)鍵字節(jié),按規(guī)則修改源程序,重新編譯、連接后即可消除這些關(guān)鍵字節(jié)。11.4.5提高信號(hào)輸入/輸出的可靠性

1.提高電平(變化緩慢)信號(hào)輸入/輸出的可靠性

1)提高輸入信號(hào)的可靠性讀取變化緩慢的電平信號(hào),如判別某個(gè)按鍵是否被按下,交流電源是否存在時(shí),可采用“定時(shí)讀取、多數(shù)判決”的方式來消除寄生的低頻與高頻干擾。

為消除低頻干擾可采用定時(shí)讀取方法。定時(shí)讀取方法是每隔特定時(shí)間讀取輸入信號(hào)狀態(tài),并用3個(gè)寄存器位記錄最近3次獲取的狀態(tài)信息,然后根據(jù)狀態(tài)編碼確定輸入信號(hào)的當(dāng)前狀態(tài)。至于定時(shí)間隔取多少合適與輸入信號(hào)的性質(zhì)有關(guān)。例如,對(duì)于經(jīng)全波整流、電容濾波后的交流信號(hào),根據(jù)全波整流、電容濾波輸出信號(hào)特征(周期為10ms),可每各5ms讀一次輸入信號(hào)狀態(tài),于是最近3個(gè)狀態(tài)編碼的含義為●?111:表示交流存在?!?110:表示交流可能不存在,但尚不能準(zhǔn)確判定?!?100:表示交流消失?!?000:表示無交流?!?001:表示可能屬于交流恢復(fù)狀態(tài)?!?011:表示交流恢復(fù)?!?010:表示正脈沖干擾,應(yīng)判定為“000”態(tài)?!?101:表示負(fù)脈沖干擾,應(yīng)判定為“111”態(tài)。為消除高頻干擾,定時(shí)時(shí)間到可用“3中取2”或“5中取3”的方式代替“一讀”方式。假設(shè)交流輸入信號(hào)接PD1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論