MSP430 UART TX 中断 Enabling/Disabling

MSP430 UART TX Interrupt Enabling/Disabling

我的 RX 中断工作得很好,但我想添加 TX 中断。我通过 UART 响应长命令,不想在发送下一个字节之前浪费时间等待 TX 完成。我正在尝试启用中断,传输需要传输的数据,然后禁用中断,直到下一个 TX 数据包出现。

这对我发送的第一个有效负载来说工作正常。我看它出来就好了。然而,一旦我禁用 TX 中断一次,我就再也无法进入 ISR。如何在 MSP430 上启用 UART 上的 TX 中断并使其再次进入 ISR?

在您看到 EUSCI_A_UART_enableInterrupt 调用的下方,每次启用中断时,这行代码不应该触发我的 ISR 吗?如果没有,我该如何重新回到 ISR?

这是传输代码:

void UartSendChar(uint8_t tx_char)
{
    ring_buffer_put(_rbdTx, &tx_char);
    EUSCI_A_UART_enableInterrupt(EUSCI_A1_BASE, EUSCI_A_UART_TRANSMIT_INTERRUPT); // Enable interrupt
}

这是我的 ISR:

void EUSCI_A1_ISR(void)
{
    int c=-1;
    switch(__even_in_range(UCA1IV,USCI_UART_UCTXCPTIFG))
    {
    case USCI_NONE: break;
    case USCI_UART_UCRXIFG:
       ...
    case USCI_UART_UCTXIFG:
        // If there's something in the Ring Buffer, transmit it
        // If not, then disable TX interrupts until new data gets written.
        if (ring_buffer_get(_rbdTx, &c) == 0)
        {
            EUSCI_A_UART_transmitData(EUSCI_A1_BASE, (uint8_t)c);
        }
        else
        {
            EUSCI_A_UART_disableInterrupt(EUSCI_A1_BASE, EUSCI_A_UART_TRANSMIT_INTERRUPT);
        }

我找到问题了。在这个特定的 MSP430 中,当读取中断向量并显示 TX 中断时,微控制器会自动清除 TXIFG 位。 (真好)

为了让这个 ISR 在重新启用 TX 中断后再次触发,TXIFG 位必须手动再次设置回 1,这表明中断挂起。这样,当数据被推入队列后启用中断时,TXIFG 位置位,因此 ISR 执行并发送数据。

现在我的 ISR 看起来像这样:

void EUSCI_A1_ISR(void)
{
    int c=-1;
    switch(__even_in_range(UCA1IV,USCI_UART_UCTXCPTIFG))
    {
    case USCI_NONE: break;
    case USCI_UART_UCRXIFG:
       ...
    case USCI_UART_UCTXIFG:
        // If there's something in the Ring Buffer, transmit it
        // If not, then disable TX interrupts until new data gets written.
        if (ring_buffer_get(_rbdTx, &c) == 0)
        {
            EUSCI_A_UART_transmitData(EUSCI_A1_BASE, (uint8_t)c);
        }
        else
        {
            EUSCI_A_UART_disableInterrupt(EUSCI_A1_BASE, EUSCI_A_UART_TRANSMIT_INTERRUPT);

            // Set TXIFG manually back to 1 for next time.
            HWREG16(EUSCI_A1_BASE + OFS_UCAxIFG) |= EUSCI_A_UART_TRANSMIT_INTERRUPT;

        }