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.

[参考译文] 如何启用 Tiva-c launchpad UART1 Tx/Rx 中断?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/786586/how-to-enable-tiva-c-launchpad-uart1-tx-rx-interrupt

主题中讨论的其他器件:TM4C123GH6PM

您好,

我尝试通过 UART1串行方式从 Tiva-c launchpad 发送一些数据、似乎数据已发送、但中断未被调用。

这是我的代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "driverlib/pin_map.h"

void UARTIntHandler (void);

int main()
{
int data=1;

SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);

//启用 UART0的外设时钟
SysCtlPeripheralEnable (SYSCTL_Periph_UART1);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);

GPIOPinConfigure( GPIO_PB0_U1RX );
GPIOPinConfigure( GPIO_PB1_U1TX );
GPIOPinTypeUART (GPIO_PORTB_BASE、GPIO_PIN_0 | GPIO_PIN_1);

//禁用 UART0
UARTDisable (UART1_base);

//配置除数和格式
UARTConfigSetExpClk (UART1_base、SysCtlClockGet ()、2400、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));

//启用 FIFO
UARTFIFOEnable (UART1_BASE);//在调用 UARTEnable()时自动启用

//启用单个 UART 中断源
UARTIntEnable (UART1_BASE、UART_INT_RX | UART_INT_RT);

//启用 UART0中断
UARTIntRegister (UART1_BASE、UARTIntHandler);
//IntEnable (INT_UART0);

//启用处理器中断
IntMasterEnable();

//启用 UART0
UARTEnable (UART1_BASE);

UARTCharPut (UART1_base、data);

while (1);
}


void UARTIntHandler (void)
{
uint32_t uIstatus = UARTIntStatus (UART0_BASE、TRUE);
UARTIntClear (UART0_BASE、UIstatus);
}

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

    将呼叫添加到:

    IntEnable (INT_UART0); 

    您实际上必须在三个级别启用中断:外设(UARTIntEnable();)、VIM (IntEnable();)和 CPU (IntMasterEnable();)。

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

    Bob 您好,

    我已修改了代码、但 IntEnable 未解决此问题。 事情是我从逻辑分析仪连接到了 PB1 (Tx)和 PB0 (Rx)引脚两根导线,如果 引脚连接到导线,似乎不调用中断。 尽管如此、我还激活了所有类型的 UART 中断、我将在这里输入我的新代码。 问题是为什么现在调用中断、但没有使用 Tx 原因、以及如果我将线缆连接到 PB1和 PB0引脚、那么中断不再被调用。 另外需要知道的是、我将 Tiva-c 与 tm4c123gh下午6微控制器配合使用。

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include "driverlib/pin_map.h"
    
    void UARTIntHandler (void);
    
    volatile int flag = 1;
    
    int main()
    {
    int data=1;
    
    SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);
    
    //启用 UART0的外设时钟
    SysCtlPeripheralEnable (SYSCTL_Periph_UART1);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
    
    GPIOPinConfigure( GPIO_PB0_U1RX );
    GPIOPinConfigure( GPIO_PB1_U1TX );
    GPIOPinTypeUART (GPIO_PORTB_BASE、GPIO_PIN_0 | GPIO_PIN_1);
    
    //禁用 UART0
    UARTDisable (UART1_base);
    
    //配置除数和格式
    UARTConfigSetExpClk (UART1_base、SysCtlClockGet ()、2400、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
    
    //启用 FIFO
    UARTFIFOEnable (UART1_BASE);//在调用 UARTEnable()时自动启用
    
    //启用单个 UART 中断源
    UARTIntEnable (UART1_BASE、UART_INT_DMATX |
    UART_INT_DMARX |
    UART_INT_9BIT |
    UART_INT_OE |
    UART_INT_be |
    UART_INT_PE |
    UART_INT_FE |
    UART_INT_RT |
    UART_INT_TX |
    UART_INT_RX |
    UART_INT_DSR |
    UART_INT_DCD |
    UART_INT_CTS |
    UART_INT_RI );
    
    UARTIntRegister (UART1_BASE、UARTIntHandler);
    
    //启用处理器中断
    IntMasterEnable();
    
    IntEnable (INT_UART1);
    
    UARTEnable (UART1_BASE);
    
    UARTCharPut (UART1_base、data);
    
    while (1);
    }
    
    
    void UARTIntHandler (void)
    {
    uint32_t uIstatus = UARTIntStatus (UART1_base、true);
    UARTIntClear (UART1_BASE、UIstatus);
    
    Flag = 0;
    } 

    在这里、您可以看到为何调用中断

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

    您正在接收的中断状态标志为中断错误、帧错误和接收超时。 这使我怀疑您没有连接到 PB0的有效信号。 它是否保持浮动? 当您将逻辑分析仪连接到该引脚时、逻辑分析仪输入的泄漏电流可能会保持足够高的电平、使其不会触发 UART RX。

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

    您没有收到 TX 中断、因为您正在使用 FIFO 模式、且 FIFO 级别设置为1/2。 这意味着当 TX FIFO 的深度从剩余的9个字符传输到剩余的8个字符传输(TX FIFO 中有8个空位)时、您将获得一个 TX 中断。 在您的示例中、您永远不会尝试传输多个字符。 因此、FIFO 永远不会超过半满、因此它永远不会为从半满转换到半满产生中断。 如果要在最后一个字符传输完成后生成 TX 中断、请调用:

    UARTTxIntModeSet (UART1_BASE、UART_TXINT_MODE_EOT);