【问题标题】:MSP430 UART TX Interrupt Enabling/DisablingMSP430 UART TX 中断启用/禁用
【发布时间】:2016-11-21 22:16:53
【问题描述】:

我的 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);
        }

【问题讨论】:

  • 是TX中断边沿还是电平触发?在第一种情况下,您必须从主线代码中推送一个字符。

标签: c interrupt uart msp430


【解决方案1】:

我发现了问题所在。在这个特定的 MSP430 中,当读取中断向量并显示 TX 中断时,TXIFG 位会自动被微处理器清除。 (多好)

为了在重新启用 TX 中断后再次触发此 ISR,必须手动将 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;

        }

【讨论】:

    猜你喜欢
    • 2021-08-01
    • 2014-07-09
    • 1970-01-01
    • 2012-09-09
    • 2017-03-07
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多