我将 MSP430F2013 处理器用于没有 UART 的应用程序。我需要一个 UART,因此我使用了 TI 的示例代码“msp430x20x3_ta_uart2400.c”来模拟一个使用 Timer 模块的代码。这一切都很好(使用 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 经验的人,他们可能能够提出一些值得关注的事情或一些潜在的陷阱我可能陷入了。