首页 文章

MSP430 UART TX中断启用/禁用

提问于
浏览
0

我有RX中断工作正常,但我想添加TX中断 . 我通过UART响应长命令,并且不希望在发送下一个字节之前浪费等待TX完成的周期 . 我试图启用中断,传输需要传输的数据,然后禁用中断,直到下一个TX数据包出现 .

这适用于我发出的FIRST有效负载 . 我看到它出来就好了 . 但是,一旦我禁用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);
        }

1 回答

  • 2

    我解决了这个问题 . 在这个特定的MSP430中,当读取中断向量并且它显示TX中断时,TXIFG位会自动被micro清零 . (多好啊)

    为了在重新启用TX中断后再次触发此ISR,必须再次手动将TXIFG位设置为1,这表示中断挂起 . 这样,当数据被推入队列后启用中断时,TXIFG位置1,因此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;
    
            }
    

相关问题