UART代码端口后的TI MSP430中断问题

时间:2012-09-17 16:55:26

标签: debugging embedded interrupt msp430 iar

我正在将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经验的人,他可能会提出一些建议,或者一些潜在的陷阱,我可能已陷入其中。

2 个答案:

答案 0 :(得分:5)

在低功耗模式下使用C-Spy调试中断将会非常棘手。根据{{​​3}}:

  

5) C-SPY可以调试利用中断和低功耗模式的应用程序

但是你应该注意到一些可能引起头痛的“陷阱”。

特别是:

  

14)当C-SPY控制设备时,无论低功耗设置如何,CPU都处于开启(即,它不处于低功耗模式)   状态寄存器中的模式位。任何低功耗模式条件都是   在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代码是否正常工作。然后返回并尝试重新启用低功耗模式。

答案 1 :(得分:4)

这个问题的答案在于调试设置,更具体地说是使用什么类型的断点。我有一系列复杂的宏在程序上传时运行,它们将各种钩子设置到内存中以进行测试。这些钩子依赖于正在创建的软件断点,然后它将调用应用程序外部的函数。我在正常使用中看到使用这些断点没有问题,但是它们的存在意味着调试会话不能实时运行(即,设备受主机PC的控制)。由于我尚未完全了解的原因,在尝试调试中断和低功耗模式时会出现问题。 (我怀疑如果我看得更深一点,我会看到在调试时需要使用时钟控制,但我会在另一天保存它。)

因此,为了解决这个问题并允许我调试我的中断和低功耗模式重码,我将其移植到我的大型应用程序状态机中,我必须执行以下操作:

  1. 禁用IAR中的软件断点。
    它们实际上并没有默认启用,但是如果你像我一样使用宏做聪明的事情,你可能会需要启用它们,因为大多数MSP430中没有足够的硬件断点(例如,我在MSP430F2013中只有两个,而C-SPY通常不会占用其中一个!)。显而易见的缺点是调试变得有点费力,但至少它是可靠的。
  2. 删除指向.mac宏文件的链接。
    换句话说,如果您使用的是宏,请不要这样做。在我的情况下,这意味着我不得不破解一些状态机逻辑,以迫使自己走下某条路线(之前宏已经为我做过)。这显然不太理想,但它允许您调试中断/低功耗模式代码。然后可以重新启用宏。
  3. 事实证明我的端口没有问题。我对这个hacky解决方案并不是特别满意,但至少它向前迈进了一步。如果我有时间,我会调查一下,看看我是否可以找到一种使用软件断点的方法并添加到这个答案中。