本文主要介紹TIMSP430微控制器軟件編程設(shè)計(jì)中的實(shí)踐經(jīng)驗(yàn)和應(yīng)用技巧。
第一部分講述基于中斷的標(biāo)準(zhǔn)程序流程模式,適用于大多數(shù)的產(chǎn)品應(yīng)用編程;另外一部分講述MSP430微控制器編程人員在開發(fā)產(chǎn)品時(shí)需要注意的一些關(guān)鍵問題、重要方法與注意事項(xiàng),如:程序初始化流程,晶振初始化時(shí)的注意事項(xiàng)等,利用這些方法可以極大程度地減少產(chǎn)品的開發(fā)周期和提高產(chǎn)品的穩(wěn)定性。
1.MSP430微控制器標(biāo)準(zhǔn)軟件設(shè)計(jì)流程
MSP430微控制器軟件設(shè)計(jì)的標(biāo)準(zhǔn)流程均可參考圖1。該標(biāo)準(zhǔn)的軟件流程可將系統(tǒng)整體功耗降至最低。
圖1
圖1所描述的軟件流程代碼是基于中斷程序的,平時(shí)MCU處于睡眠狀態(tài),直到有中斷產(chǎn)生時(shí)MCU被喚醒,最大程度降低系統(tǒng)功耗,優(yōu)化電源效率。
理解圖1所示的中斷服務(wù)子程序(1SRs)流程,能更好的掌握MSP430微控制器處理低功耗的模式。MSP430微控制器的低功耗模式由狀態(tài)寄存器SR的控制位控制,在執(zhí)行中斷服務(wù)子程序之前,狀態(tài)寄存器SR的低功耗模式控制位可以被優(yōu)先壓棧。當(dāng)中斷服務(wù)子程序返回時(shí),主程序調(diào)用中斷之前的低功耗模式控制位,從而進(jìn)入中斷之前的低功耗模式狀態(tài)。當(dāng)然,如果我們在ISR中斷服務(wù)子程序返回前修改了保存在SR中的低功耗模式控制位,那么ISR中斷子程序執(zhí)行完之后,主程序流程可以轉(zhuǎn)到另一個(gè)不同的低功耗工作模式。
中斷喚醒機(jī)制作為MSP430微控制器內(nèi)部低功耗模式的一部分,允許系統(tǒng)快速喚醒,響應(yīng)中斷事件。例如,當(dāng)一中斷事件發(fā)生之前MSP430微控制器處于低功耗LPM0模式,MCU在執(zhí)行中斷服務(wù)子程序之前首先向堆棧保存SR中的低功耗模式控制位值然后清除SR值,清除SR值使MCU從LPMO模式進(jìn)入到執(zhí)行中斷活動(dòng)模式狀態(tài)。在ISR中斷服務(wù)子程序中,軟件設(shè)計(jì)者可以寫一條語句清除SR中的低功耗模式控制位,當(dāng)中斷程序完成后,MCU從堆棧中重新裝載調(diào)用各自寄存器的狀態(tài)值。如果沒有修改SR的低功耗模式控制位,退出中斷后系統(tǒng)仍然返回進(jìn)入LPM0低功耗模式,若此時(shí)已修改SR控制位,當(dāng)從ISR中斷程序退出后,系統(tǒng)會(huì)工作于活動(dòng)模式時(shí),并且按進(jìn)入中斷之前的PC指針?biāo)傅牡刂防^續(xù)執(zhí)行程序。
由于可以在fSR中斷服務(wù)子程序中改變低功耗模式,所以設(shè)計(jì)者可以選擇在ISR程序中執(zhí)行全部任務(wù),也可以選擇在ISR喚醒MCU后在主程序中處理任務(wù)。
在ISR程序中處理時(shí)確保能立即響應(yīng)中斷事件,中斷事件發(fā)生時(shí)即能立刻處理中斷任務(wù),但是,在處理一個(gè)中斷事件時(shí),其它中斷將不能被載入,直到該中斷任務(wù)完成,而這樣長時(shí)間的中斷將會(huì)降低系統(tǒng)的響應(yīng)靈敏,所以設(shè)計(jì)者須根據(jù)不同系統(tǒng)要求選擇最佳處理方式。
圖1所示的流程圖中主程序需處理兩個(gè)中斷事件,這兩個(gè)中斷事件所要處理的任務(wù)是在主循環(huán)中處理的。ISRs執(zhí)行兩個(gè)不同的事件任務(wù)。第一個(gè)中斷,ISRs改變了保存在堆棧中SR的值,可以使系統(tǒng)退出中斷后進(jìn)入活動(dòng)工作模式,中斷事件是在主程序中被執(zhí)行,中斷事件可以是一任意應(yīng)用事件,例如定時(shí)器、按鍵處理、AD轉(zhuǎn)換等。第二個(gè)中斷,在ISR中斷服務(wù)子程序設(shè)置一標(biāo)志位,在主程序檢測該標(biāo)志位來判斷是否執(zhí)行相應(yīng)的任務(wù)。如果需處理的中斷事件能在較短的時(shí)間內(nèi)迅速完成,這樣就能夠在中斷服務(wù)子程序中直接執(zhí)行,無需進(jìn)入主程序處理,此時(shí)ISR中斷服務(wù)子程序沒必要設(shè)置標(biāo)志位或改變SR低功耗控制位退出睡眠模式,退出ISR中斷服務(wù)子程序后MCU仍然返回到睡眠模式。該流程可以根據(jù)系統(tǒng)應(yīng)用的復(fù)雜性來定,例如,只有一個(gè)中斷事一件可喚醒主程序時(shí),則無需設(shè)置系統(tǒng)標(biāo)志位,此時(shí),通過中斷喚醒主程序,然后主程序進(jìn)行相應(yīng)的任務(wù)操作,最后MCU重新進(jìn)入睡眠模式。
圖1中所提到的睡眠模式LPMn是系統(tǒng)所要用到的睡眠低功耗模式,每種應(yīng)用所涉及的模式可能會(huì)有所不同,實(shí)際的睡眠模式由整個(gè)系統(tǒng)所用到的模塊(如定時(shí)器、AD、串口等)決定,取決于系統(tǒng)模塊在相應(yīng)的睡眠模式下可否被中斷喚醒。例如由MCU的定時(shí)器負(fù)責(zé)喚醒CPU,且該定時(shí)器時(shí)鐘為ACLK時(shí),則ACLK必須保持活動(dòng)模式,則MCU可以工作在LPM3模式;但是如果定時(shí)器時(shí)鐘為DCO時(shí),則MCU必須工作在LPMO。
2方案設(shè)計(jì)技巧
2.1看門狗和晶振的配置
在任何一款MSP430微控制器中,看門狗默認(rèn)開啟32ms復(fù)位,所以程序初始化第一步應(yīng)先進(jìn)行看門狗WDT的配置。如果在初始化中不快速處理WDT的話,則看門狗可能很快溢出造成芯片程序復(fù)位。為避免CPU進(jìn)入復(fù)位死循環(huán),所以看門狗需在程序最開始配置,通過設(shè)置時(shí)間、設(shè)置控制位或者關(guān)閉看門狗。
MSP430F4xx或MSP430F2xx微控制器中,使用LFXT1低頻率晶振時(shí),代碼運(yùn)行之前需通過FLL_CTL0寄存器配置晶振相應(yīng)的負(fù)載電容,否則晶振可能會(huì)運(yùn)行不正常,該技巧在許多TI的MSP430微控制器應(yīng)用實(shí)例代碼中均可見。
2.2使用TI的標(biāo)準(zhǔn)頭文件
TJ為每一款MSP430微控制器均提供~標(biāo)準(zhǔn)頭文件,文件中包含相應(yīng)芯片型號(hào)中的所有寄存器和位常數(shù)定義信息,使用文件中定義的信息能極大地提高程序的可讀性,同時(shí)增加系統(tǒng)可移植性,使其它設(shè)計(jì)者能快速掌握該程序的設(shè)計(jì)。TI的每~個(gè)應(yīng)用方案和代碼實(shí)例都可以應(yīng)用這些頭文件。
2.3運(yùn)用內(nèi)部函數(shù)處理低功耗模式和其它函數(shù)
MSP430微控制器利用C語言開發(fā)軟件時(shí),可以直接調(diào)用編譯器包含的幾個(gè)內(nèi)部函數(shù)。有時(shí)一些關(guān)鍵事件的處理唯一方法就是使用內(nèi)部函數(shù),利用內(nèi)部函數(shù)會(huì)很大程度地提高任務(wù)處理的效率。
使用內(nèi)部函數(shù)最普通的例子就是進(jìn)入與退出低功耗模式,通常用C語言時(shí)必須對CPU寄存器中的某些位進(jìn)行操作,例如在IAR編譯環(huán)境中如果需要進(jìn)入LPM3模式,則即可直接使用內(nèi)部函數(shù):
BISSR(LPM3_bits+GIE)。
其它內(nèi)部函數(shù)有時(shí)也具有優(yōu)化功能,例如MSP430微控制器轉(zhuǎn)換BCD碼的內(nèi)部指令函數(shù),如果沒有這些指令組合,則需要一長串C語言代碼完成,且編輯器不能直接將代碼轉(zhuǎn)換成MSP430微控制器識(shí)別的BCD數(shù)學(xué)指令。使用內(nèi)部函數(shù)使得利用C語言編程的人員最大程度地優(yōu)化了程序代碼,也降低了系統(tǒng)功耗。
MSP430微控制器的開發(fā)環(huán)境編譯器包含一系列功能函數(shù),開發(fā)設(shè)計(jì)時(shí)需注意最新版本。
2.4晶振失效的處理函數(shù)
MSP430微控制器具有檢查時(shí)鐘是否失效的功能。所有的微控制器系列提供內(nèi)部DCO和高頻頻晶振的失效檢測功能,MSP430F4xx和MSP430F2xx系列具有全部時(shí)鐘失效檢測的功能,如:外部32768Hz低頻時(shí)鐘與高頻時(shí)鐘失效檢測。
本文主要考慮兩種會(huì)出現(xiàn)晶振失效的情況以及考慮是否需要做出相應(yīng)的處理。
(1)在每一次MCU上電時(shí)晶振穩(wěn)定的過程。在這個(gè)過程中會(huì)造成晶振的失效,特別對于低頻晶振初始化,時(shí)鐘穩(wěn)定需要一定時(shí)間,經(jīng)常是幾千毫秒。
(2)在程序運(yùn)行過程中出現(xiàn)晶振失效,比如某種導(dǎo)體將晶振管腳短路,因此需要一些特殊的方法處理,當(dāng)晶振失效時(shí),DC0時(shí)鐘模塊將繼續(xù)支持CPU的工作。
如果時(shí)鐘源ACLK、SMCLK或者晶振未穩(wěn)定時(shí),任何使用這些時(shí)鐘的外圍設(shè)備都將受到影響,唯一方法即是通過軟件進(jìn)行檢測與處理。當(dāng)一些對時(shí)間敏感的外圍(如定時(shí)器)以低頻晶振為時(shí)鐘源,若晶振未振蕩穩(wěn)定時(shí),將導(dǎo)致初始化失敗,同時(shí)若程序代碼未等到晶振穩(wěn)定就開始工作,則外設(shè)輸出的結(jié)果是不可預(yù)知的。
如果由LFXT1、LT×T2提供系統(tǒng)的MCLK時(shí)鐘源,晶振失效了,則MCLK時(shí)鐘源會(huì)自動(dòng)切換到內(nèi)部DCO時(shí)鐘模塊,由內(nèi)部的DCO做為MCLK時(shí)鐘源。
處理晶振初始化的一個(gè)簡單方法就是可以不停重復(fù)清零、等待檢測默認(rèn)的晶振失效標(biāo)志位,直到晶振失效標(biāo)志不在置位,可參考用戶手冊。如MSP430F:2xx系列,LF×T1的低頻晶振并不能檢測晶振是否失敗,此時(shí)可調(diào)用一延時(shí)程序以保證有足夠的初始化穩(wěn)定時(shí)間。這種方法在一般程序正常操作過程中并不能捕獲到晶振是否失效,但可以通過設(shè)置OFIE位在NMI中斷服務(wù)子程序中處理。
2.5逐漸增加MCLK頻率
大多數(shù)MSP430微控制器的MCLK可以配置為8MHz,MSP430F2xx可以達(dá)到16MHz,系統(tǒng)要求VCC電壓值隨著頻率的升高相應(yīng)有所增加。程序運(yùn)行時(shí),若設(shè)定MCLK頻率所需的VCC電壓比真正提供給微控制器的電壓值高,則運(yùn)行過程中將發(fā)生不可預(yù)知的問題。
即使MCU實(shí)際工作VCC值比工作頻率需要的實(shí)際工作電壓高出很多,但VCC上升到穩(wěn)定狀態(tài)是需要一定時(shí)間的,所以我們要在工作頻率升高之前確保芯片電壓已經(jīng)能夠支持晶振正常工作。
如果MCU具備SVS(電壓檢測模塊)模塊,則SVS可以提醒系統(tǒng)的VCC電壓達(dá)到所需的電壓值;若MCU不具備SVS模塊,但是含有可利用的ADC模塊,則ADC模塊可以采樣VCC電壓,從而判斷在提升頻率之前芯片電壓值是否能滿足高頻工作要求。
2.6使用初始化函數(shù)
通常在C編譯器編寫代碼時(shí),程序會(huì)自動(dòng)初始化所有定義的存儲(chǔ)器,并且將代碼值插入到main()主程序中。如果定義的存儲(chǔ)器很多(大量變量),則將導(dǎo)致看門狗的溢出問題。當(dāng)初始化許多變量時(shí),占用的時(shí)間相應(yīng)就會(huì)很長,以至于在執(zhí)行main()主程序第一條語句之前看門狗已經(jīng)溢出,那么將導(dǎo)致死循環(huán)的產(chǎn)生。這種現(xiàn)象一般會(huì)發(fā)生在微控制器的RAM超過2K的情況。
為避免上述情況的發(fā)生,最簡單、直接的方法就是對不需要最先初始化的變量在最開始時(shí)不進(jìn)行初始化設(shè)置。例如使用IAR時(shí),用一句長代碼矩陣語句_no_init_intx_arrav[2500]替代一長串的初始化代碼,避免看門狗溢出。
除上述方法外,設(shè)計(jì)者還可以定義初始化函數(shù)處理看門狗的溢出問題。RAM存儲(chǔ)器仍然被初始化,但是首先配置看門狗。在IAR環(huán)境中,我們通??梢栽诳撮T狗配置代碼中增加一段_low_level_init()代碼,例如:
void_low_level_init(){WDTCTL=WDTPW+WDTHOLD]
如果上述初始化函數(shù)在開發(fā)環(huán)境中也不可用,那么可以修改在每一個(gè)C程序之前的啟動(dòng)文件。當(dāng)初始化MSP430F4xx系列的大量初始化代碼時(shí),可以在初始化或啟動(dòng)文件中配置LF×T1晶振電容,這樣即可在主程序開始執(zhí)行之前提供給晶振所需要的更多起振時(shí)間,使晶振穩(wěn)定,參考2.1節(jié)。
2.7 支持在線編程(ISP)
如果使用MSP430微控制器的ISP功能對FALSH存儲(chǔ)器進(jìn)行擦寫操作,為確保正確讀寫正常,需注意以下幾點(diǎn):
?。?)設(shè)置正確的FLASH擦寫時(shí)頻率Fftg值,否則燒寫的結(jié)果是不可預(yù)知的。
(2)當(dāng)ISP操作完成后設(shè)置FALSH鎖定位,防止意外的程序干擾寫入。
(3)注意FALSH模塊的累積編程時(shí)間。
?。?)提供足夠的VCC電壓,F(xiàn)LASH燒寫電壓VCC值必須比數(shù)據(jù)手冊中最小的燒錄/擦除電壓大,比CPU工作電壓要求略高。
在進(jìn)行FLASH燒錄時(shí),可能在上電過程中會(huì)受到電壓的干擾,也可能在供電電池電壓不足(但是還可以維持CPU工作時(shí))時(shí)受到干擾,甚至當(dāng)初始電壓足夠高,但是當(dāng)開始進(jìn)行FLASH擦寫電流消耗較大,將電壓拉下使其小于最小閾值電壓。
VCC電壓可以通過SVS或ADC模塊校驗(yàn)。SVS模塊優(yōu)勢在于在操作過程中可以提供連續(xù)檢測,在進(jìn)行FLASH擦寫之前如何配置SVS模塊監(jiān)測VCC電壓可參考2.5講述的mclk.c程序。
2.8使用校驗(yàn)和功能校驗(yàn)Flash的完整性
在一些關(guān)鍵性的應(yīng)用方案中,周期性地執(zhí)行校驗(yàn)和功能可以確保FLASH存儲(chǔ)器的完整性。根據(jù)冗余數(shù)據(jù)的需要,校驗(yàn)值可以存儲(chǔ)一個(gè)或多個(gè)存儲(chǔ)器內(nèi),同時(shí)校驗(yàn)值提供的的校驗(yàn)圖表可以作為處理錯(cuò)誤發(fā)生進(jìn)行處理的依據(jù)。
3結(jié)束語
本文所講述的MSP430微控制器的編程方法與編程過程中的注意事項(xiàng)是作者多年在MSP430開發(fā)產(chǎn)品過程中的一些經(jīng)驗(yàn)之談,遵循這些原則可大大提高產(chǎn)品的可靠性。
評論
查看更多