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:自定义 BSL 在 TX 中断标志卡住后随机挂起。

Guru**** 2577385 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/606049/msp432p401r-custom-bsl-hangs-randomly-after-tx-interrupt-flag-gets-stuck

器件型号:MSP432P401R

我正在为我们的设计开发使用 ZigBee 的无线更新软件解决  方案、并修改了原始 BSL (MSP432BSL_1_00_01_00)代码以与无线电通信。 我能够发送数据并接收来自目标器件(MSP432)的 ACK 值和消息、甚至能够成功完成更新、但 EUSCI_A_UART_SEND_INTERRUPT_FLAG 将不 会清除、并且我会卡在该循环中。 它是随机的、所以我想看看其他人是否看到过这种行为、或者它是否是已知的错误。 请参阅下面的代码以了解我的传输字节函数。  

void Radio_sendByteUART (uint8_t data)
{
/*等待 TX 缓冲区为空,然后发送*/
while (MAP_GPIO_getInputPinValue (GPIO_PORT_P2、GPIO_PIN4));//等待对讲机准备好接收数据。
while (!(MAP_UART_getInterruptStatus (BSL432_RADIO_MODULE、EUSCI_A_UART_transmit、interrupt_FLAG))));
EUSCI_A1->TXBUF =数据;
} 

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

    您好!

     请将您的更改为:

    void Radio_sendByteUART (uint8_t data)
    {
    /*等待 TX 缓冲区为空,然后发送*/
    while (MAP_GPIO_getInputPinValue (GPIO_PORT_P2、GPIO_PIN4));//等待对讲机准备好接收数据。
    // while (!(map_UART_getInterruptStatus (BSL432_radio_module、EUSCI_A_UART_Transmit _interrupt_FLAG)));
    // EUSCI_A1->TXBUF = data;
    MAP_UART_transmitData (BSL432_RADIO_MODULE、DATA);
    } 

    如果您看到相同的行为、请告知我们。 此外、您能否共享用于配置 UART 的代码。

     谢谢、

      David

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

    尊敬的 David:

    我曾尝试过你的建议,但没有那么多的东西。 我仍有一段时间内就会有这个问题。  

    现在它卡在 UART_transmitData 函数中:

    void UART_transmitData (uint32_t moduleInstance、uint_fast8_t transmitData)
    {
    /*如果未使用中断、则轮询标志*/
    IF (!BITBAND_PERI (EUSCI_A_CMSIS (模态)->Rie.r、UCTXIE_OFS))
    while (!BITBAND_peri (EUSCI_A_CMSIS (模态)->rIFG.r、UCTXIFG_OFS))
    ;
    
    EUSCI_A_CMSIS (模态)->rTXBUF.r = transmitData;
    } 

    我用于配置 UART 的代码如下所示:

    //使用与原始 BSL 代码相同的24MHz 设置。
    
    CONST eUSCI_UART_Config LBS 无线电_UARTConfig_115200 =
    {
    EUSCI_A_UART_CLOCKSOURCE_SMCLK、
    6、// UCBRx
    8、// firstModReg UCBRFx
    32、//第二模块 UCBRSx
    EUSCI_A_UART_NO_奇 偶校验、 //无奇偶校验
    EUSCI_A_UART_LSB_FIRST、 // LSB First
    EUSCI_A_UART_One_stop_bit、 //一个停止位
    EUSCI_A_UART_MODE、 // UART 模式
    EUSCI_A_UART_oversampling_BAUDRATE_generation
    //过采样};
    
    
    void Radio_UART_Config (){
    
    
    UCA1CTL1 |= UCSWRST;
    BSL432_RADIO_MODULE = EUSCI_A1_BASE;
    
    BSL432_RADIO_PORT = GPIO_PORT_P2;
    BSL432_RADIO_RXD_PIN = GPIO_PIN2;
    BSL432_RADIO_TXD_PIN = GPIO_PIN3;
    BSL432_RADIO_RXD_MODE = GPIO_PRIMARY_MODULE_FUNCTION;
    BSL432_RADIO_TXD_MODE = GPIO_PRIMARY_MODULE_FUNCTION;
    
    /*在 UART 模式下选择 P2.2和 P2.3 */
    MAP_GPIO_setPeripheralModuleFunctionInputPin (BSL432_RADIO_PORT、
    BSL432_RADIO_RXD_PIN、BSL432_RADIO_RXD_MODE);
    MAP_GPIO_setPeripheralModuleFunctionOutputPin (BSL432_RADIO_PORT、
    BSL432_RADIO_TXD_PIN、BSL432_RADIO_TXD_MODE);
    
    MAP_UART_selectDeglitchTime (BSL432_RADIO_MODULE、EUSCI_A_UART_DEGLITCH_TIME_200ns);
    
    
    /*配置 UART 模块*/
    MAP_UART_initModule (BSL432_radio_module、&lbs_radio_UARTConfig_115200);
    
    /*启用 UART 模块*/
    MAP_UART_enableModule (BSL432_RADIO_MODULE);
    
    UCA1CTL1 &=~UCSWRST;//
    
    MAP_UART_registerInterrupt (BSL432_RADIO_MODULE、Radio_Received_IRQ);
    /*启用中断*/
    MAP_UART_enableInterrupt (BSL432_RADIO_MODULE、EUSCI_A_UART_receive_interrupt);
    
    MAP_Interrupt_enableInterrupt (INT_EUSCIA1);
    
    
    } 

    感谢你的帮助。 如果我能提供更多信息、请告知我。  

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

    您好!

     我使用 您的配置创建了此示例代码、但遗憾的是、我无法重现此行为。

     您是否有可  在器件停止传输时共享的逻辑分析仪/示波器跟踪。

     谢谢、

     David

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

    我想知道您是否有机会测试我在上一帖子中附加的示例代码?? 您是否能够重现相同的行为?

    谢谢、

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

    尊敬的 David:

    我听从了你的建议。 我首先尝试了您提供的代码更改、这大大减少了问题的重复发生。 我能够运行更新软件超过500次、但没有发现问题。 但是、我仍然可以随机显示该问题。 我还检查了 TX 和 RX 信号的信号完整性、它们看起来很干净(由于是随机的、我无法捕获故障波形)。 现在、我将查看无线电和 MSP432之间的 TX 和 RX 数据、看看我是否可以捕获任何数据。

    目前、我还在进入 sendByte 函数时添加了看门狗计时器。 如果触发 WDT、ISR 函数会调用整体擦除、以便我不会丢失与 Box 的通信。  

    你有其他建议吗?