2012-09-17 30 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

谢谢你链接到这个文档,凯尔。我之前没有看到过这个,尽管它没有具体回答我的问题,但它让我更仔细地思考了我正在尝试做什么,现在我已经解决了这个问题。我会在下面发表答案。 –