【问题标题】:TI MSP430 Interrupt Problems After UART Code PortUART 代码端口后的 TI MSP430 中断问题
【发布时间】:2012-09-09 22:36:10
【问题描述】:

我将 MSP430F2013 处理器用于没有 UART 的应用程序。我需要一个 UART,因此我使用了 TI 的示例代码“msp430x20x3_ta_uart2400.c”来模拟一个使用 Timer 模块的代码。这一切都很好(使用 IAR Embedded Workbench 编译),使用 PuTTY 将字符传输到开发板并使用环回将它们回显到终端对其进行了测试。

这是一个降低风险的练习,现在我已经将该代码移植到我的应用程序的状态机中。完成此操作后,我遇到了有关定时器中断和低功耗睡眠模式的问题。这是我进入低功耗(睡眠)模式的代码的 sn-p:

// 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 经验的人,他们可能能够提出一些值得关注的事情或一些潜在的陷阱我可能已经陷入了。

【问题讨论】:

    标签: debugging embedded interrupt msp430 iar


    【解决方案1】:

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

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

    1. 禁用 IAR 中的软件断点。
      默认情况下它们实际上并未启用,但如果您像我一样使用宏做一些聪明的事情,您可能需要启用它们,因为在大多数 MSP430 中没有足够的硬件断点可用(例如,我在 MSP430F2013 中只有两个,而 C-SPY 经常占用其中一个!)。这样做的明显缺点是调试变得有点费力,但至少它是可靠的。
    2. 删除指向 .mac 宏文件的链接。
      换句话说,如果您使用的是宏,请不要这样做。就我而言,这意味着我必须破解一些状态机逻辑才能迫使自己走上某个路线(以前宏一直为我做的)。这显然并不理想,但它可以让您调试中断/低功耗模式代码。之后可以重新启用宏。

    结果证明我的端口根本没有问题。我对这个骇人听闻的解决方案并不特别满意,但至少它向前迈出了一步。如果我有时间,我会调查一下是否可以找到一种使用软件断点的方法并添加到这个答案中。

    【讨论】:

      【解决方案2】:

      在低功耗模式下使用 C-Spy 调试中断会很棘手。根据Section A.3 Debugging (C-Spy) - IAR User's Guide

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

      但是您应该注意一些“陷阱”,这可能会导致您头疼。

      特别是:

      14) 当C-SPY控制设备时,CPU开启(即不处于低功耗模式)不管低功耗的设置如何 状态寄存器中的模式位。任何低功耗模式条件都是 在 Step 或 Go 之前恢复。因此,不要测量功率 由设备消耗,而 C-SPY 控制设备。反而, 使用发布了 JTAG 的 Go 运行您的应用程序

      19) C-SPY 利用系统时钟来控制设备 调试。因此,设备计数器等,由 当 C-SPY 控制主系统时钟 (MCLK) 设备。采取了特殊的预防措施,以尽量减少对 看门狗定时器。 CPU 内核寄存器被保留。所有其他时钟 源(SMCLK,ACLK)和外围设备继续正常运行 在仿真过程中。换句话说,Flash Emulation Tool 是一个 部分侵入式工具

      支持时钟控制的设备(模拟器 → 高级 → 时钟控制)可以进一步减少这些 通过选择在调试期间停止时钟来产生效果

      24) 在正常程序期间读取时清除的外围位 执行(即中断标志)在被读取的同时被清除 已调试(即内存转储、外设寄存器)。

      使用某些 MSP430 器件(如 MSP430F15x、MSP430F16x、 MSP430F43x 和 MSP430F44x 器件),位不以这种方式运行 (也就是说,C-SPY 读取操作不会清除这些位)。

      26) 当单步激活并启用中断时,它可以 似乎只有中断服务程序 (ISR) 处于活动状态(即 是,非 ISR 代码似乎永远不会执行,并且单步 操作总是在 ISR 的第一行停止)。然而,这 行为是正确的,因为该设备总是处理一个活动和 在处理非 ISR(即主线)代码之前启用中断。 此行为的解决方法是在 ISR 中禁用 堆栈上的 GIE 位,以便在退出后禁用中断 ISR。这允许调试非 ISR 代码(但没有 中断)。稍后可以通过在 在注册窗口中注册状态。

      在具有时钟控制仿真功能的设备上,可能 在单步之间暂停时钟并延迟中断请求 (模拟器→高级→时钟控制)。

      要尝试的一件事是注释掉所有低功耗代码并查看您的 UART 代码是否可以这样工作。然后返回并尝试重新启用低功耗模式。

      【讨论】:

      • 感谢您提供指向此文档的链接,凯尔。我以前没见过这个,虽然它没有具体回答我的问题,但它让我更仔细地思考我想要做什么,现在我已经解决了这个问题。我将在下面发布答案。
      猜你喜欢
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多