说明条件:
1.MCU为MSP432P401R, 硬件为 TI官方的DEMO板developement kit。
2.串口时钟源为 SMCLK,波特率115200。 SMCLK时钟源为DCO, DCO 配置为3MHz;
3.串口开了EUSCI_A0 和 EUSCI_A2, A0接PC做调试口,A2接模块做应用;
4.串口收发均开启了中断;
问题描述:
串口A2在发送大约14KB的数据量,分包发送,每次发送约950字节,因组包代码耗时 ,等效包间延时约为20ms, 在发送随机的几包后,串口就不进中断了,仿真的时候可以看到,UCTXIFG未置位。串口发送停了。 然后,手动将此位改为1后,串口又能继续发送,直至所有数据发送完毕。
此情况经常出现在从LPM3级的唤醒后。 不知是否有什么因素导致此问题。
还请大家帮助一下。或是否有人遇到过这种情况。
附上串口的配置代码如下:
/*============================================================================== * Local macro define. *============================================================================*/ #define DEBUG_COM_GPIO_PORT GPIO_PORT_P1 #define DEBUG_COM_GPIO_RX_PIN GPIO_PIN2 #define DEBUG_COM_GPIO_TX_PIN GPIO_PIN3 #define DEBUG_COM_GPIO_UART_FUN GPIO_PRIMARY_MODULE_FUNCTION #define NBIoT_COM_GPIO_PORT GPIO_PORT_P3 #define NBIoT_COM_GPIO_RX_PIN GPIO_PIN2 #define NBIoT_COM_GPIO_TX_PIN GPIO_PIN3 #define NBIoT_COM_GPIO_UART_FUN GPIO_PRIMARY_MODULE_FUNCTION #define DEBUG_COM_PORT_BASE EUSCI_A0_BASE #define NBIoT_COM_PORT_BASE EUSCI_A2_BASE #define DEBUG_COM_PORT_INT INT_EUSCIA0 #define NBIoT_PORT_INT INT_EUSCIA2 #define DEBUG_PORT_IRQ_HANDLER EUSCIA0_IRQHandler #define NBIoT_PORT_IRQ_HANDLER EUSCIA2_IRQHandler global void gvIF_UARTInit( void ) { /*!< software-dl.ti.com/.../ *!< MSP430BaudRateConverter/index.html */ const eUSCI_UART_Config aceCfg = { .selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK, .clockPrescalar = 1, .firstModReg = 10, .secondModReg = 0,/*!< 115200 bps */ .parity = EUSCI_A_UART_NO_PARITY, .msborLsbFirst = EUSCI_A_UART_LSB_FIRST, .numberofStopBits = EUSCI_A_UART_ONE_STOP_BIT, .uartMode = EUSCI_A_UART_MODE, .overSampling = EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION, }; MAP_GPIO_setAsPeripheralModuleFunctionOutputPin( DEBUG_COM_GPIO_PORT, (DEBUG_COM_GPIO_RX_PIN | DEBUG_COM_GPIO_TX_PIN), DEBUG_COM_GPIO_UART_FUN ); MAP_UART_initModule( DEBUG_COM_PORT_BASE, &aceCfg ); MAP_Interrupt_setPriority(DEBUG_COM_PORT_INT, 0x20); MAP_UART_enableModule(DEBUG_COM_PORT_BASE); /* Enabling interrupts */ MAP_UART_enableInterrupt(DEBUG_COM_PORT_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT /* + EUSCI_A_UART_TRANSMIT_INTERRUPT*/); MAP_UART_registerInterrupt(DEBUG_COM_PORT_BASE, DEBUG_PORT_IRQ_HANDLER); MAP_Interrupt_enableInterrupt(DEBUG_COM_PORT_INT); /*!< To configure USCI_A2_BASE as UART to communicate with NB-IoT. */ MAP_GPIO_setAsPeripheralModuleFunctionOutputPin( NBIoT_COM_GPIO_PORT, (NBIoT_COM_GPIO_RX_PIN | NBIoT_COM_GPIO_TX_PIN), NBIoT_COM_GPIO_UART_FUN ); MAP_UART_initModule( NBIoT_COM_PORT_BASE, &aceCfg ); MAP_Interrupt_setPriority(NBIoT_PORT_INT, 0x1F); MAP_UART_enableModule(NBIoT_COM_PORT_BASE); /* Enabling interrupts */ MAP_UART_enableInterrupt(NBIoT_COM_PORT_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT + EUSCI_A_UART_TRANSMIT_INTERRUPT); MAP_UART_registerInterrupt(NBIoT_COM_PORT_BASE, NBIoT_PORT_IRQ_HANDLER); MAP_Interrupt_enableInterrupt(NBIoT_PORT_INT); lvIF_NBIoTGpioConfigure(); gwRxdIndex = 0; lbTxBusy = eUSCI_Idle; } /*!< interruption routine service. */ /* EUSCI A2 UART ISR - interaction with NB module. */ global void EUSCIA2_IRQHandler(void) { uint8_t abRcv; uint32_t adwStatus = MAP_UART_getEnabledInterruptStatus(NBIoT_COM_PORT_BASE); MAP_UART_clearInterruptFlag(NBIoT_COM_PORT_BASE, adwStatus); if(adwStatus & EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG) { abRcv = MAP_UART_receiveData(NBIoT_COM_PORT_BASE); if( gwRxdIndex < EUSCI_UART_RXD_BUFF_MAX ) { lbRxdBuff[gwRxdIndex++] = abRcv; } else { gwRxdIndex = 0; lbRxdBuff[gwRxdIndex++] = abRcv; } } if(adwStatus & EUSCI_A_UART_TRANSMIT_INTERRUPT_FLAG) { if( lwTxdIndex < lwBufferedBytesTxd ) { MAP_UART_transmitData(NBIoT_COM_PORT_BASE, lbTxdBuff[lwTxdIndex]); lwTxdIndex++; } if( lwTxdIndex >= lwBufferedBytesTxd ) { if( lwRemainBytesTxd > EUSCI_UART_TXD_BUFF_MAX ) { memcpy( lbTxdBuff, (void*)lpbRemain, EUSCI_UART_TXD_BUFF_MAX ); lwRemainBytesTxd -= EUSCI_UART_TXD_BUFF_MAX; lpbRemain += EUSCI_UART_TXD_BUFF_MAX; lwTxdIndex = 0; lwBufferedBytesTxd = EUSCI_UART_TXD_BUFF_MAX; } else if( lwRemainBytesTxd > 0 ) { memcpy( lbTxdBuff, (void*)lpbRemain, lwRemainBytesTxd ); lwTxdIndex = 0; lwBufferedBytesTxd = lwRemainBytesTxd; lwRemainBytesTxd = 0U; } else { lpbRemain = NULL; lwRemainBytesTxd = 0; lbTxBusy = eUSCI_Idle; } } } }