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.

[参考译文] TMS320F280038C-Q1:CPU 进入未定义状态

Guru**** 2806475 points

Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1594691/tms320f280038c-q1-cpu-goes-to-an-undefined-state

器件型号: TMS320F280038C-Q1
主题: C2000WARE 中讨论的其他器件

您好、

背景信息:我正在控制一个功率级、还在我的 C2000 上的应用板上实现了 CAN 和 UART 通信。 我的系统在正常运行时按预期工作。 我有每 1 毫秒、10 毫秒和 100 毫秒调用的后台任务。 我打开了看门狗、并在每项任务结束后提供它。

我发现一种情况、我的 MCU 出现卡滞并停止发送 CAN 消息。  我调试并发现了一些发现。 有时会实现 WD 复位、但有时不会发生复位、如我在下文中所述。

故障模式即时 :断开 USB(RS485 至 USB 转换器)。 它连接到 MCU 的 UART 引脚。 想象一下、我有一台 PC 并使用 USB 端口。 RS485 转 USB 转换器、还有转换器 RS485 转 RS422 的电路板。 我使用 RS422 线路来与 MCU 上的 UART TX-RX 引脚进行通信。

调试时、我找到了以下寄存器组。  

正常运行模式:

normal_case_WDRegs.PNG

 

故障情况:

我的 MCU 进入未定义模式。 我的 CAN 通信中断。 如果我将转换器重新插入 USB 端口、则无法再与 PC 通信。

XRSN 引脚在这种失效模式下不会变低... 这意味着、它不会进入看门狗复位模式。 它在计数时移动。

WDCNTR:一次又一次地增加和减少、但我的软件无法正常工作。

failure_case_WDRegs.PNG

failure_case_CPUSysRegs.PNG

下面的一个,当我的 WD 可以实现去重置。

WDResetted_failure_case_CPUSysRegs.PNG

我的看门狗内部如下所示;我在我的任务中喂我的看门狗。

void InitWDT(void)
{
    SysCtl_setWatchdogMode(SYSCTL_WD_MODE_RESET);

    // 10us*4096*8*256=419ms

    SysCtl_setWatchdogPredivider(SYSCTL_WD_PREDIV_2048);
    SysCtl_setWatchdogPrescaler(SYSCTL_WD_PRESCALE_8);

    SysCtl_serviceWatchdog();
    SysCtl_enableWatchdog();

    SysCtl_setWatchdogMode(SYSCTL_WD_MODE_RESET);
}

您能帮助我确定应用的情况吗?  

您能帮助我找到根本原因吗?

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

    您好、

    我有在每 1 毫秒、10 毫秒和 100 毫秒调用的后台任务。

    这是计时器中断库吗?

    我假设 CCS 已连接到 MCU、那么您能检查代码会卡住的位置。 断开 USB 连接会导致一些通信错误、我们是否有软件处理程序来处理此错误?

    此致、

    Vivek Singh

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

    您好、

    后台任务不基于计时器中断。 我计算 ADC 中断处的一个变量、并据此调用相关任务。 这意味着基于软件计数。 是的、我使用 CCS。

    我使用 SCI 模块与 USB 转 RS485 转换器进行通信。 我在 RXRDY 情况下将 SCI 配置为 GO 中断。

    __interrupt void sciaRxISR(void)
    {
        // Read a character from the RXBUF.
        ReceiveInterrupt(SCI_readCharBlockingNonFIFO(SCIA_BASE));
    
        // Acknowledge the PIE interrupt.
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
    }

    在故障情况下、我也无法进入 ADC Interrupt。 我也无法进入 SCI 中断。

    在故障时刻、我的代码被卡住了、而在循环中:sci.h 是 TI 的库。

    static inline uint16_t
    SCI_readCharBlockingNonFIFO(uint32_t base)
    {
        //
        // Check the arguments.
        //
        ASSERT(SCI_isBaseValid(base));
    
        //
        // Wait until a character is available in the receive FIFO.
        //
        while(!SCI_isDataAvailableNonFIFO(base))
        {
        }
    
        //
        // Return the character from the receive buffer.
        //
        return((uint16_t)(HWREGH(base + SCI_O_RXBUF) & SCI_RXBUF_SAR_M));
    }

    这是调用方函数。

    //*****************************************************************************
    //
    //! Waits for a character from the specified port when the FIFO enhancement
    //! is not enabled.
    //!
    //! \param base is the base address of the SCI port.
    //!
    //! Gets a character from the receive buffer for the specified port.  If there
    //! is no characters available, this function waits until a character is
    //! received before returning.
    //!
    //! \return Returns the character read from the specified port as \e uint16_t.
    //
    //*****************************************************************************
    static inline uint16_t
    SCI_readCharBlockingNonFIFO(uint32_t base)
    {
        //
        // Check the arguments.
        //
        ASSERT(SCI_isBaseValid(base));
    
        //
        // Wait until a character is available in the receive FIFO.
        //
        while(!SCI_isDataAvailableNonFIFO(base))
        {
        }
    
        //
        // Return the character from the receive buffer.
        //
        return((uint16_t)(HWREGH(base + SCI_O_RXBUF) & SCI_RXBUF_SAR_M));
    }

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

    您好、

    我使用 SCI 模块与 USB 转 RS485 转换器进行通信。 我将 SCI 配置为在 RXRDY 情况下进入中断状态。

    您是否也配置了 SCI 错误中断、以便在出现错误时触发该中断?

    话虽如此、如果您因为代码卡在这个循环中而不是维护 WD、它应该会触发复位。  WD 计数器正在运行但没有复位、这很奇怪。 我还观察到、在工作案例和非工作案例中、WD 配置已更改。 与 WDPRECLKDIV 和 WDPS 一样、在非工作情况下配置为 0。 是这样吗?   

    此致

    Vivek Singh

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

    您好、

    您是否也配置了 SCI 错误中断、以便如果有错误、它会触发该中断?

    不、您能帮忙吗? 如果有示例 SW、您能提供吗?

    我重新发布正常运行模式:
    我使用“持续刷新“更新了寄存器  
    也许前一个是误导你。

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

    似乎错过了快照。 您能重新发布吗?

    关于 SCI 示例、我得请其他专家。

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

    您好、

    能否请咨询 SCI 专家?

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

    尊敬的 Gokhan:

    有关 SCI 的一些信息:

    您可以在 C2000Ware 中找到我们的所有 SCI 软件示例 、下载位置为:{C2000Ware}\driverlib\f28003x\examples\sci;或 从此链接在线获取。  例如、C2000Ware 中的 sci_ex2_loopback_interrupts.c 示例展示了 SCI 中断的使用情况、可以参考来实现一般中断。

    器件 技术参考手册 (TRM) 还介绍了如何实现 SCI 错误中断以及需要哪些寄存器:

    • 您可以启用 SCI 接收错误中断 (SCICTL1.RXERRINTENA)
    • 您还可以在 SCI 接收状态寄存器 (SCIRXST.RXERROR) 中检查/查看接收错误的状态
      • RXERROR 是中断检测、成帧错误、溢出和奇偶校验错误使能标志(位 5-2:BRKDT、FE、OE 和 PE)的逻辑或。 您还可以查看这些单独的寄存器字段、以了解 SCI 接收错误源。
      • TRM 还介绍了如何使用软件复位来清除 SCI 错误  

    此致、

    Allison