本文主要介紹TIMSP430微控制器軟件編程設計中的實踐經驗和應用技巧 。
第一部分講述基于中斷的標準程序流程模式, 適用于大多數的產品應用編程;另外一部分講述MSP430微控制器編程人員在開發產品時需要注意的一些關鍵問題、重要方法與注意事項, 如:程序初始化流程, 晶振初始化時的注意事項等, 利用這些方法可以極大程度地減少產品的開發周期和提高產品的穩定性 。
1.MSP430微控制器標準軟件設計流程MSP430微控制器軟件設計的標準流程均可參考圖1 。 該標準的軟件流程可將系統整體功耗降至最低 。

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