我正在将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经验的人,他可能会提出一些建议,或者一些潜在的陷阱,我可能已陷入其中。
答案 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的控制)。由于我尚未完全了解的原因,在尝试调试中断和低功耗模式时会出现问题。 (我怀疑如果我看得更深一点,我会看到在调试时需要使用时钟控制,但我会在另一天保存它。)
因此,为了解决这个问题并允许我调试我的中断和低功耗模式重码,我将其移植到我的大型应用程序状态机中,我必须执行以下操作:
事实证明我的端口没有问题。我对这个hacky解决方案并不是特别满意,但至少它向前迈进了一步。如果我有时间,我会调查一下,看看我是否可以找到一种使用软件断点的方法并添加到这个答案中。