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.

[参考译文] CCS/MSP430FR2633:校准例程无限循环

Guru**** 2551110 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/590199/ccs-msp430fr2633-calibration-routine-infinite-loop

器件型号:MSP430FR2633

工具/软件:Code Composer Studio

我正在调试一个使用 CapTIvate 演示板("手机"键盘)的应用、旨在通过 UART 与设计中心进行通信。  

我在代码方面取得了一些良好的进展、在上个月、电容式触控没有问题。 但是、几天前、在调试过程中、设计中心突然没有收到消息。 我跟踪了错误、程序似乎卡在命令中:  

CAPT_MANAGER_CALIBRATE SENSOR (PAPP->pSensorList[ui8SensorID]);  

CAPT_MANAGER_c (在示例代码中)中有一个 for 循环、该循环仅包含这一行、但程序永远不会超过该行。 这是一个 ROM 命令、因此我只能看到我单步执行汇编代码时执行的操作(并且很长)。 那么、我想知道其他人是否对此有疑问? 当我在 UART 上进行一些编码以更改自定义接收消息的处理方式时、出现了这个问题、因此我不确定如何干扰此函数。 任何见解都将不胜感激!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    相关功能在 CapTIvate 技术指南的"软件库"->"操作方法"部分中进行了介绍、解决方案需要进行校准才能正常运行。 您是否尝试使用全新的演示构建重新启动? 如果您更改为 I2C 通信而不是 UART、会怎么样? 在测试/评估解决方案时、硬件是否可能已损坏?

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

    您好、Ryan、

    感谢您的回答。 我确实找到了解决该问题的方法、但我对根本原因非常好奇。 (不、硬件肯定不是问题)

    我正在为我的应用程序运行一串使用 SPI 的 Neopixels。 启动时、在触摸板进行任何校准之前、我只需打开所有 LED (16)、然后再次关闭、即可显示程序已启动。 如果我在所有16个程序中执行此例程、则会遇到我所写的问题(输入校准例程、但代码永远不会超过此例程。 不过、中断仍会触发)。 如果我将启动例程更改为仅使用8个 LED、程序将按预期运行。 SPI (B0)是否会干扰校准? 还是校准必须在执行任何其他操作之前运行?

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

    您是否能够先校准、然后打开/关闭所有16个 LED、而不会出现任何问题? 启动8个或16个 LED 之间是否只有计时差异? MSP430代码启动后、可能需要在特定时间之前运行校准。 e2e.ti.com/.../505564

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

    我刚刚尝试更改顺序(先校准、然后触发16个 LED)。 在这种情况下、代码不起作用。 同样、对于8个 LED、这两种方法都很好。 只有8个和16个 LED 之间存在时间差、没错。 请注意、由于 neopixels 的时序非常严格、因此当我更新 LED 时、我会禁用该时间的中断。 LED 稍后会在代码中更改(根据状态)、但它对电容式触控没有明显的不良影响。 唯一的问题是在开始时切换它们。

    校准的运行时间是否会比实际功能允许的更长? 很明显、我的 LED 更新会中断 ROM 函数的某些关键过程、但如果不知道限制是什么、就很难进行编码。 设计中心有关此功能的唯一注意事项是:

    校准 CapTIvateTm应用程序(UI)。

    此函数在应用中的每个传感器上调用触控库校准函数。

    参数
    PAPP是指向 CapTIvateTm应用程序的指针,用于校准。
    返回
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Joanna、

    我认为、在通过 SPI 更新 LED 时禁用中断可能会导致问题的发生。 我目前正在咨询 CapTIvate 专家、以便就此事发表进一步的评论。

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

    校准功能会对系统中的每个元件执行一系列测量、并调整模拟调优值、直到每个元件的测量结果处于目标范围内(由 CapTIvate 设计中心中的转换增益和转换计数参数指定)。 它不是时间确定性的(CAPT_calibrateSensor 中花费的时间取决于外部电极电容以及这些转换参数)。 话虽如此、函数存在严格的限制-它的编写方式不会使它永远持续下去。 如果转换过程无法收敛于一组调优值、它将完成测试所有值、然后设置校准错误标志。 如果由于某种原因未发出 CapTIvate 转换结束中断、则可能会卡在该函数中。

    由于在 CAPT_calibrateSensor 中执行一系列 CapTIvate 测量、因此需要启用中断才能完成序列(CPU 被编程为在转换期间进入 LPM0/CPUOFF 以节省功耗、 并在每次转换结束时通过 CapTIvate 转换结束中断唤醒)。 只要 GIE 最终被恢复以便校准过程能够完成、临时清除 GIE 就非常好。 也就是说,CAPT_calibrateUI()是从主线程调用的,因此,从应用程序的角度来看,它应该被视为一个分块函数,除非您设置了其他中断处理程序,否则它将开始运行并结束。 我看不到在程序运行时如何启用/禁用 GIE、除非您是通过中断处理程序来操作它。 因此、当您进入校准功能时、GIE 应该被启用。 您能否确认在调用 CAPT_calibrateUI()之前启用了 GIE?

    根据我的经验、这些看起来与时间和/或大小相关的问题最终通常是由于看门狗计时器复位或意外覆盖存储器(例如指针错误或调用堆栈溢出)等简单问题造成的。 您在代码中的哪个位置禁用看门狗计时器?使用哪种方法? 由于器件头文件的更改、预编译的看门狗计时器保持 DriverLib 函数现在存在已知错误。 您最近是否更新了 IDE/工具链? 如果是、则可能是看门狗问题。 奇怪的是、它可以在8 LED 情况下工作、正如您所描述的那样。 如果是 WDT 问题、我希望根本不起作用。

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

    沃尔特

    这是有问题的代码片段。 从 CapTIvate 设计中心的演示代码中直接获取几个函数(包括看门狗计时器保持功能)。  

    void main (void)

    //
    //初始化 MCU
    // bsp_configureMCU()设置器件 IO 和计时
    //全局中断使能被设置为允许外设
    //唤醒 MCU。
    //
    WDT_A_HOLD (WDT_A_base);
    bsp_configureMCU();

    //
    //初始化所有 LED 以打开,然后关闭以启动
    //不是程序的必要部分...只是启动信号
    //
    for (configureLED =(NUM_LED - 9);configureLED >= 0;configureLEDs--)
    setLEDColor (configureLED、0、0、0xFF);

    configureLED();

    _DELAY_CYCLES (10000000);

    for (configureLED =(NUM_LED - 9);configureLED >= 0;configureLEDs--)
    setLEDColor (configureLED、0、0、0);

    configureLED();

    _bis_SR_register (GIE);


    //
    //启动 CapTIvate 应用程序
    //
    MAP_CAPT_registerCallback (modeKeypadSensor、&STOP_Callback);
    MAP_CAPT_registerCallback (&numicKeypadSensor、&numer_Callback);
    CAPT_AppStart();


    //
    //后台循环
    //
    while (1)

    //CAPT_updateUI (&G);
    //awsMessage = CAPT_checkForInboundPacket();

    CAPT_appHandler();

    您可以看到,在调用 CAPT_AppStart()函数之前,GIE 会被置位。 在该函数中(在 CAPT_calibrateUI (&g_uiApp)函数中)、如果我取出配置 LED 变量中的"-9"、代码将挂起。 请注意、稍后在主代码中、我将 LED 复位以表示状态。 此时、所有16个都可以工作。 只有一开始它们才会导致问题。  

    还设置了其他中断处理程序(在 P1.1信号电平上中断、并接收 UART)、但由于程序不会挂起、这些处理程序似乎对校准没有影响(我假设 CapTIvate 中断具有优先级?)

    我在新计算机上运行此软件、因此我有 CCS  版本:7.0.0.00043

    谢谢、

    Joanna

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

    您好、Joanna、


    感谢您分享您的代码。  从我在这里看到的情况来看、我没有任何东西会导致应用程序挂起。

    让我们尝试两件事:

    为了确保不存在已知的 WDT 函数编译问题、您能否关闭 WDT_A_HOLD (WDT_A_base);WDTCTL = WDTPW | WDTHOLD;以及重新测试

    2.如果#1未发生任何变化,请尝试使用您提到的禁用的其他中断(GPIO 和 UART)运行 CapTIvate 设置(CAPT_AppStart())。  实际上、看看您是否可以禁用任何其他启用的中断。  CapTIvate 本身是一个低优先级 IRQ;GPIO 和串行接口具有更高的优先级。  这是因为可以将读取 CapTIvate 结果的时间延迟几毫秒、但可能不能延迟读取 UART。  您还可以通过在 CapTIvate ISR (位于/captivate/BASE/CAPT_ISR.c 内)中设置断点来验证您是否遇到了 CapTIvate 中断。

    Walter

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

    您好、Walter、

    以下是您的建议结果:

    1.我将 WDT_A_HOLD (WDT_A_base)替换 为 WDTCTL = WDTPW | WDTHOLD;并重新运行代码(启用16个 LED)、但没有变化。 同样、如果我使用更换的线路仅使用8个 LED 运行该程序、程序将按预期运行。

    2.有3个非 CapTIvate 中断:运行 LED 的 SPI、P1矢量中断和 UART。 UART 中断在 CAPT_AppStart()内启用,因此我不用担心禁用该中断。 我将代码更改为 P1vector 直到调用 CAPT_AppStart()后才启用。 SPI I 在开始时启用了闪存、但在调用 CAPT_AppStart()之前被禁用。 同样、同样的结果是8个 LED 未出现问题、但16个 LED 确实出现了问题。 下面是对代码的更改。

    void main (void)

    //
    //初始化 MCU
    // bsp_configureMCU()设置器件 IO 和计时
    //全局中断使能被设置为允许外设
    //唤醒 MCU。
    //
    //WDT_A_HOLD (WDT_A_base);
    WDTCTL = WDTPW | WDTHOLD;
    bsp_configureMCU();

    //
    //初始化所有 LED 以打开,然后关闭以启动
    //不是程序的必要部分...只是启动信号
    //
    for (configureLED =(NUM_LED);configureLED >= 0;configureLEDs--)
    setLEDColor (configureLED、0、0、0xFF);

    configureLED();

    _DELAY_CYCLES (10000000);

    for (configureLED =(NUM_LED);configureLED >= 0;configureLEDs--)
    setLEDColor (configureLED、0、0、0);

    configureLED();

    _bis_SR_register (GIE);


    EUSCI_B_SPI_DISABLE (EUSCI_B0_BASE);
    //
    //启动 CapTIvate 应用程序
    //
    MAP_CAPT_registerCallback (modeKeypadSensor、&STOP_Callback);
    MAP_CAPT_registerCallback (&numicKeypadSensor、&numer_Callback);
    CAPT_AppStart();

    P1IE |= BIT6;
    EUSCI_B_SPI_ENABLE (EUSCI_B0_BASE);

    //
    //后台循环
    //
    while (1)

    CAPT_appHandler();

    在运行16个 LED 的两种情况下、我在 CAPT_ISR.c 中设置一个断点 在运行16的任何情况下、它都不会跳闸。

    我再次单步执行以查看 CAPT_AppStart()中的哪个函数导致程序挂起,在 出现问题的每个情况下,它会卡在 CAPT_calibrateUI (&g_uiApp);(在 CAPT_App.c 中)。

    再次感谢您的帮助!

    Joanna