This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] EVM430-FR6043:超声波感应(USS)库:测量期间中断会导致零星复位

Guru**** 2450140 points
Other Parts Discussed in Thread: EVM430-FR6043, MSP430FR6043

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1491075/evm430-fr6043-ultrasonic-sensing-uss-library-interrupt-during-measurement-causes-sporadic-resets

器件型号:EVM430-FR6043
主题中讨论的其他器件:MSP430FR6043

工具与软件:

大家好!

我们正在设计 OEM 燃气流量计、以替代基于热线测量的传感器。 测量期间的功耗不是主要问题、但测量速率应尽可能高、以缩短测量死区时间并允许取平均值、从而降低测量值的标准偏差。

使用包含 MSP430FR6043及其集成 USS_A 模块的 EVM430-FR6043完成开发。 I²C 本身很简单:一个 I ² C 接口用于启动/停止测量和读取测量结果、当然还有两个用于实际流量测量的超声波换能器。

固件大致基于示例代码、该代码使用 UART 在循环中执行测量并输出结果。 I²C 进行了修改、以便在主 while (1)循环中尽快进行测量(不再使用计时器)、并将 UART 替换为 μ C 接口。 这一切都能正常工作、但现在我们看到在测量运行时 MCU 随机复位、并且使用 μ I²C 以高速率读出值。

观察结果:

  • 在没有 μ I²C 通信的情况下、全速(~160Hz)运行测量不会导致问题。
  • 以最大速率运行 μ I²C 事务时停止测量也不会导致问题。
  • 仅当 I²C 测量且 μ C 通信发生时才会发生"复位"。
  • 该问题只是偶尔出现;在160Hz 的测量频率和200Hz I²C 的事务(100kHz 位时钟)中、通常每分钟发生几次。
  • 这些崩溃并不总是会导致真正的 PUC、有时 MCU 看起来只会执行部分初始化代码。
  • 这样重新启动后的复位原因(SYSRSTIV)通常为0x16 (看门狗超时)、但(用于测试)我在循环体的开头放置` WDTCTL=WDTPW|WDTHOLD `μ s、因此除非 USS 代码在某个位置启用 WDT、否则肯定不会使用它。
  • 在 MCU 重新启动并位于 main ()的开始处之后、会发生 SYSRSTIV 为0x00的情况。
  • 将堆栈大小从默认的512字节增加到1k 甚至2k 没有任何帮助。
  • 在对 USS_startLowPowerUltrasonicCapture ()和 USS_runAlgorithms ()的调用中禁用 μ I²C 中断似乎可以有效地避免问题、但会严重减慢 μ I²C 流量、时钟延展事件会持续几毫秒(测量和计算的整个持续时间)。
  • 仅为两个调用之一禁用中断没有帮助、仍然可以观察到崩溃。
  • μ I²C ISR 不直接访问任何 USS 数据结构、只访问在 main.c 中定义和处理的数据
  • μ I²C ISR 主要需要5us 来执行、但偶尔需要50us、即需要准备要发射的数据。
  • 即使从 while 环路中删除了对共享数据的所有访问、该问题也会出现、只会进行两个 USS 函数调用。

我现在对可能导致这些问题的原因很不清楚。

我的问题:USS 函数运行时中断是否存在任何限制? 例如最大执行时间、可能未使用的某些模块或存储器区域等。

谢谢、此致、
Philipp

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    问题迎刃而解。 为了实现尽可能短的转换时间、我将 DCO 设置为24MHz、由后者为 MCLK 供电。 很显然、我没有仔细查看数据表、因为 FR6043具有指定的最大 MCLK 频率16MHz。 这部分解释了无真实模式时的怪异行为、但有趣的是、仅在使用 USS 和 μ I²C 时才会出现该问题、但仅在使用其中任何一个时不会出现该问题。 不管怎么说,问题解决了,教训教训.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    还有一点要说明。 我本来可以在更早的时候发现这个频率问题、因为我实际上曾经测试过降低 MCLK 频率、但是崩溃并没有消失。 然而,它现在显示,我实际上在同一时间遇到了两个错误,几乎相同的症状:

    • MCLK 频率过大会导致随机 MCU 崩溃、如、和所述
    • 在进入 USS_startLowPowerUltrasonicCapture ()时全局启用中断、如果在函数运行时请求了 I²C 中断、这也会导致 MCU 随机崩溃(或更像是挂起)。

    因此、我的修复过程最终非常简单:

                /* Disable interrupts globally around capture function. This
                 * seems to be required, as otherwise random crashes happen
                 * when there is I2C traffic. Since the capture is mostly
                 * about waiting in an LPM, interrupts are mostly enabled
                 * anyway, so this is not too bad for latency.
                 */
                __disable_interrupt();
                code = USS_startLowPowerUltrasonicCapture(&gUssSWConfig);
                __enable_interrupt();
    

    我再次检查了相关文档、没有发现关于在输入时禁用中断的提示。 鉴于在库函数中已十分小心地在适当的地方禁用和恢复中断标志、我认为这不是一个错误而不是文档中的遗漏、但是除非已修复、我认为此要求应该在库文档中着重指出。

    事实上、我刚刚在另一个线程中找到了一个用户"Cash Hao11"的响应、指出"这些中断不会影响 USS 捕获过程。": https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1379232/msp430fr5043-water-demo-in-ccs-scale-factor-in-resultsfixpoints/5270922#5270922

    谁知道,我只是运气不好...