2012-09-17 29 views
4

我正在使用MSP430F2013處理器來處理沒有UART的應用程序。我需要一個UART,因此我使用TI的示例代碼「msp430x20x3_ta_uart2400.c」來模擬使用Timer模塊的代碼。這一切都很好(使用IAR Embedded Workbench編譯),使用PuTTY將其傳輸到開發板並將回送到終端的回送進行測試。TI MSP430 UART代碼端口後中斷問題

這是一個降低風險的練習,現在我已經將該代碼移植到我的應用程序的狀態機中。這樣做後,我遇到了有關定時器中斷和低功耗睡眠模式的問題。下面是我周圍的進入低功耗睡眠模式的代碼片段:

// 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經驗的人,他可能會提出一些要看的東西或某些潛在的陷阱我可能陷入了。

回答

4

的這個問題的答案在於調試安裝,更具體地說正在使用什麼類型的斷點。我有一個非常複雜的系列宏,它們在程序上傳時運行,爲了測試的目的,它們將各種鉤子設置到內存中。這些鉤子依靠軟件創建斷點,然後調用應用程序之外的函數。我沒有看到在正常使用中使用這些斷點時沒有問題,但是它們的存在意味着調試會話不會實時運行(即設備在主機PC的控制下)。由於我尚未完全瞭解的原因,在嘗試調試中斷和低功耗模式時會造成問題。 (我懷疑,如果我看起來更深一點,我會看到需要在調試時使用時鐘控制,但我會另存一天)。

因此,要解決這個問題,讓我調試我的中斷和低功耗模式重碼,其中我已經移植到我的更大的應用程序的狀態機,我必須做到以下幾點:

  1. 禁用IAR中的軟件斷點。
    默認情況下,它們實際上並未啓用,但如果您一直在使用像我這樣的宏進行聰明的事情,那麼您可能需要啓用它們,因爲大多數MSP430中沒有足夠的硬件斷點例如,我在MSP430F2013中只有兩個,而C-SPY往往不是這些中的一個!)。這個明顯的缺點是調試變得有些費力,但至少它是可靠的。
  2. 刪除.mac宏文件的鏈接。
    換句話說,如果你使用宏,不要。在我的情況下,這意味着我必須破解一些狀態機邏輯才能強迫自己停止某個特定的路線(之前宏指令爲我所做的)。這顯然不理想,但它可以讓您調試中斷/低功耗模式代碼。之後可以重新啓用宏。

事實證明,我的港口畢竟沒有問題。我對這個黑客解決方案並不滿意,但至少這是一個進步。如果我有時間,我會進行調查,看看能否找到使用軟件斷點並添加到此答案的方法。

5

在低功耗模式下使用C-Spy調試中斷會非常棘手。據Section A.3 Debugging (C-Spy) - IAR User's Guide

5)C-SPY能夠調試採用中斷和低功耗模式

應用,但也有一些「陷阱」,你應該知道的可能造成你的頭痛。

特別是:

14)當C-SPY具有設備的控制中,CPU爲ON不管的設置(即,它不是在低功率模式)低功耗 狀態寄存器中的模式位。在Step或Go之前恢復任何低功耗模式條件爲 。因此,在C-SPY控制器件時,請勿測量器件消耗的功率 。相反, 運行使用轉到與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代碼是否可以這樣工作。然後返回並嘗試重新啓用低功耗模式。

+3

謝謝你鏈接到這個文檔,凱爾。我之前沒有看到過這個,儘管它沒有具體回答我的問題,但它讓我更仔細地思考了我正在嘗試做什麼,現在我已經解決了這個問題。我會在下面發表答案。 –