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.

[参考译文] MSP432P401R:微控制器未执行代码?

Guru**** 2589275 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/627988/msp432p401r-microcontroller-not-executing-code

器件型号:MSP432P401R

您好! 我将通过 UART 将 MSP432微控制器与 WIZ550S2E 串行转以太网转换器相连。 我的程序在中断中工作、并使用16字节消息与 TCP 服务器(Hercules)进行通信。 当一条消息被接收时、ISR 唤醒 MCU、然后 MCU 对消息进行解释并发送一个响应(例如:接收 hello 并以 ACK - 16字节编码消息进行响应)。

问题是、有时(在从服务器发送10-20 (有时更少)个 hello 消息之后) MCU 不响应。 我可以确认消息已被接收、因为我使用逻辑分析仪将其可视化、并且当 MCU 不响应时、消息存储在 RX 缓冲器中。

我可以看到消息存储在 RX 缓冲区中、因为我看到 MCU 不响应并检查 RX 缓冲区内容后暂停程序执行。

我将这种情况解释为 MCU 在收到消息后不执行代码或不从睡眠状态唤醒。 这是我的中断代码:

void EUSCIA0_IRQHandler (void)
{
unsigned int status;
STATUS = MAP_SPI_getEnabledInterruptStatus (EUSCI_A0_BASE);
MAP_SPI_clearInterruptFlag (EUSCI_A0_BASE、STATUS);

if (extension1_spiMode = true)
{
IF (STATUS 和 EUSCI_A_SPI_Transmit 中断)
{
extension1SpiTxFlag = true;
MAP_Interrupt_disableSlepOnIsrExit();
返回;
}
IF (STATUS & EUSCI_A_SPI_Receive_interrupt)
{
extension1SpiRxFlag = true;
MAP_Interrupt_disableSlepOnIsrExit();
返回;
}
}
其他
{
IF (STATUS & EUSCI_A_UART_Transmit _INTERRUPT)
{
extension1UartTxFlag = true;
MAP_Interrupt_disableSlepOnIsrExit();
返回;
}
IF (STATUS & EUSCI_A_UART_receive_interrupt)
{
extension1UartRxFlag = true;

IF (WIZ550S2E_EXTENSION_IN_USE)
{
//if (extensionManager_rxFined=false)
//{
extensionManager_rxBuffer[extensionManager_rxBytes]= MAP_UART_receiveData (EUSCI_A0_BASE);
extensionManager_rxBytes++;

IF (WIZ550S2E_isInCommandMode = true)
{
if (extensionManager_rxBuffer[extensionManager_rxBytes-1]== extensionManager_rxTerminator)//'\n'
{
extensionManager_rxFined= true;
MAP_Interrupt_disableSlepOnIsrExit();
返回;
}
}
其他
{//"[R、0、16]\r\nabcdefghifdmf\r\n";16字节消息+ 10字节消息+\r\n
if (extensionManager_rxBuffer[extensionManager_rxBytes-1]== extensionManager_rxTerminator)//'\n'
{
WIZ550S2E_endLineCount++;
}
IF (WIZ550S2E_endLineCount = 2)
{
WIZ550S2E_endLineCount = 0;
extensionManager_rxFined= true;
}
if (enableOxines= true & extensionManager_rxFined= true)
{
CommandReceived = true;
MAP_Interrupt_disableSlepOnIsrExit();
返回;
}
if (extensionManager_rxFined== true)
{
MAP_Interrupt_disableSlepOnIsrExit();
返回;
}
}
//}
}
}

MAP_Interrupt_enableSlepOnIsrExit();
} 

我使用的是 SimpleLink SDK 1.50.0.0、CCS 7.2.0、未进行优化。

是否有人遇到这种行为? 您是否知道导致这种情况的原因以及如何避免这种情况?

如果您需要其他信息、请告诉我。

谢谢、
克里斯蒂安

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

    我建议您不要在 ISR 中执行此操作、因为无论执行什么操作、它都会导致前景冻结。

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

    我将其替换为 Interrupt_disableSlepOnIsrExit(),但我得到的行为相同:

    void EUSCIA0_IRQHandler (void)
    {
    unsigned int status;
    STATUS = MAP_SPI_getEnabledInterruptStatus (EUSCI_A0_BASE);
    MAP_SPI_clearInterruptFlag (EUSCI_A0_BASE、STATUS);
    
    if (extension1_spiMode = true)
    {
    IF (STATUS 和 EUSCI_A_SPI_Transmit 中断)
    {
    extension1SpiTxFlag = true;
    }
    IF (STATUS & EUSCI_A_SPI_Receive_interrupt)
    {
    extension1SpiRxFlag = true;
    }
    }
    其他
    {
    IF (STATUS & EUSCI_A_UART_Transmit _INTERRUPT)
    {
    extension1UartTxFlag = true;
    }
    IF (STATUS & EUSCI_A_UART_receive_interrupt)
    {
    extension1UartRxFlag = true;
    
    IF (WIZ550S2E_EXTENSION_IN_USE)
    {
    //if (extensionManager_rxFined=false)
    //{
    extensionManager_rxBuffer[extensionManager_rxBytes]= MAP_UART_receiveData (EUSCI_A0_BASE);
    extensionManager_rxBytes++;
    
    IF (WIZ550S2E_isInCommandMode = true)
    {
    if (extensionManager_rxBuffer[extensionManager_rxBytes-1]== extensionManager_rxTerminator)//'\n'
    {
    extensionManager_rxFined= true;
    }
    }
    其他
    {//"[R、0、16]\r\nabcdefghifdmf\r\n";16 octeti mesaj + 10 octeti mesaj at +\r\n
    if (extensionManager_rxBuffer[extensionManager_rxBytes-1]== extensionManager_rxTerminator)//'\n'
    {
    WIZ550S2E_endLineCount++;
    }
    IF (WIZ550S2E_endLineCount = 2)
    {
    WIZ550S2E_endLineCount = 0;
    extensionManager_rxFined= true;
    }
    if (enableOxines= true & extensionManager_rxFined= true)
    {
    命令接收器= true;
    }
    }
    //}
    }
    }
    
    MAP_Interrupt_disableSlepOnIsrExit();
    } 


    我尝试将 MAP_Interrupt_disableSlepOnIsrExit()放置在 ISR 的开头,并在进入睡眠时将 MAP_PCM_gotoLPM0InterruptSafe ()替换为 MAP_PCM_gotoLPM0 (),但行为是相同的。

    我在这里有什么误解?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我明白了! 我激活了一个计时器,该计时器有时触发 MAP_Interrupt_enableSlepOnIsrExit()。 我删除了该行、它起作用了。 感谢您的建议!