簡體   English   中英

UART代碼端口后的TI MSP430中斷問題

[英]TI MSP430 Interrupt Problems After UART Code Port

我將MSP430F2013處理器用於沒有UART的應用程序。 我需要一個UART,因此我使用TI的示例代碼“msp430x20x3_ta_uart2400.c”來模擬使用定時器模塊。 這一切都運行良好(使用IAR Embedded Workbench編譯),使用PuTTY測試它以將字符傳輸到開發板,並使用環回將它們回顯到終端。

這是一個降低風險的練習,現在我已將該代碼移植到我的應用程序的狀態機中。 完成此操作后,我遇到了有關定時器中斷和低功耗睡眠模式的問題。 這是我進入低功耗(睡眠)模式的代碼片段:

// Prepare the UART to receive one byte.
prepare_receiver();

// Enter low power mode 1.
__bis_SR_register(LPM1_bits + GIE);

// Check whether the full message has been received.
if(true == get_message_complete())
{
    process_event(e_euart_message_received, NULL);
}

我在調試器(C-Spy)上看到的是,有時它會在第一個條目上執行bis_SR_register()行,然后轉到if語句,即忽略我要求它進入睡眠狀態的事實。 在其他情況下,當它確實進入睡眠狀態時,ISR會正確觸發並最終將我帶回if語句以繼續執行程序(正如我所料)。 但是,如果我嘗試跳到下一個語句,應用程序會凍結第一行,即我無法前進。

我想不出任何功能上與我正在做的TI示例有什么不同,所以我認為我的問題必須與我如何移植它有關。 例如,我的Timer ISR和我在這里發布的代碼是在不同的編譯單元 - 這種決定會對事情有什么影響嗎? 我知道我的問題可能有點模糊,但不幸的是我無法發布我的所有代碼,所以相反,我正在尋找有MSP經驗的人,他可能會提出一些建議,或者一些潛在的陷阱,我可能已陷入其中。

在低功耗模式下使用C-Spy調試中斷將會非常棘手。 根據A.3節調試(C-Spy) - IAR用戶指南

5) C-SPY可以調試利用中斷和低功耗模式的應用程序

但是你應該注意到一些可能引起頭痛的“陷阱”。

尤其是:

14) 當C-SPY控制器件時,無論狀態寄存器中的低功耗模式位的設置如何, CPU都為ON (即,它不處於低功耗模式)。 在Step或Go之前恢復任何低功耗模式條件。 因此,在C-SPY控制設備時,請勿測量設備消耗的功率。 相反,使用Go發布JTAG運行您的應用程序

19)C-SPY利用系統時鍾在調試期間控制設備。 因此, 當C-SPY控制器件時,由主系統時鍾(MCLK)提供時鍾的器件計數器等會受到影響 采取特殊預防措施以盡量減少對看門狗定時器的影響。 CPU核心寄存器被保留。 所有其他時鍾源(SMCLK,ACLK)和外設在仿真期間繼續正常運行。 換句話說, Flash仿真工具是一種部分侵入式工具

支持時鍾控制的設備(仿真器→高級→時鍾控制)可以通過選擇在調試期間停止時鍾來進一步減少這些影響

24) 在正常程序執行期間讀取時清除的外設位 (即中斷標志) 在被調試時被讀取 (即內存轉儲,外設寄存器)。

使用某些MSP430器件(例如MSP430F15x,MSP430F16x,MSP430F43x和MSP430F44x器件)時,位不會以這種方式運行(即,C-SPY讀操作不會清零這些位)。

26) 雖然單步執行有效和已啟用中斷,但似乎只有中斷服務程序(ISR)處於活動狀態 (即,非ISR代碼永遠不會執行,並且單步操作始終在第一行停止ISR)。 但是,此行為是正確的,因為在處理非ISR(即主線)代碼之前,設備始終處理活動且已啟用的中斷。 此行為的解決方法是,在ISR內,禁用堆棧上的GIE位,以便在退出ISR后禁用中斷。 這允許調試非ISR代碼(但沒有中斷)。 稍后可以通過在寄存器窗口的狀態寄存器中設置GIE來重新啟用中斷。

在具有時鍾控制仿真功能的設備上,可以在單個步驟之間暫停時鍾並延遲中斷請求(仿真器→高級→時鍾控制)。

要嘗試的一件事是評論所有低功耗代碼並查看您的UART代碼是否正常工作。 然后返回並嘗試重新啟用低功耗模式。

這個問題的答案在於調試設置,更具體地說是使用什么類型的斷點。 我有一系列復雜的宏在程序上傳時運行,它們將各種鈎子設置到內存中以進行測試。 這些鈎子依賴於正在創建的軟件斷點,然后調用應用程序外部的函數。 我在正常使用中看到使用這些斷點沒有問題,但是它們的存在意味着調試會話不能實時運行(即,設備受主機PC的控制)。 由於我尚未完全了解的原因,在嘗試調試中斷和低功耗模式時會出現問題。 (我懷疑,如果我要看得更深一點,我會看到在調試時需要使用時鍾控制,但我將保存另一天)。

因此,為了解決這個問題並允許我調試我的中斷和低功耗模式重碼,我將其移植到我的大型應用程序狀態機中,我必須執行以下操作:

  1. 禁用IAR中的軟件斷點。
    它們實際上並沒有在默認情況下啟用,但是如果你像我一樣使用宏做聰明的東西,你可能需要啟用它們,因為大多數MSP430中沒有足夠的硬件斷點(例如,我在MSP430F2013中只有兩個,而C-SPY往往不是其中之一!)。 顯而易見的缺點是調試變得有點費力,但至少它是可靠的。
  2. 刪除.mac宏文件的鏈接。
    換句話說,如果您使用的是宏,請不要這樣做。 在我的情況下,這意味着我不得不破解一些狀態機邏輯,以迫使自己走下某條路線(之前宏已經為我做過)。 這顯然不太理想,但它允許您調試中斷/低功耗模式代碼。 然后可以重新啟用宏。

事實證明,我的端口畢竟沒有問題。 我對這個hacky解決方案並不是特別滿意,但至少它向前邁進了一步。 如果我有時間,我會調查,看看我是否可以找到一種使用軟件斷點的方法並添加到這個答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM