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.

[参考译文] EK-TM4C1294XL:UART 问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/606199/ek-tm4c1294xl-uart-problem

器件型号:EK-TM4C1294XL

我正在测试 UART 通信

UART4在接收和发送方面均表现良好。 但是...

奇怪的是、UART0的设置与 UART4相同、但无法执行接收中断。  

我不理解这种行为。

请附上以下源代码。

谢谢

-卡尔斯

//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
// UART 初始化
//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
void UART_init (void)

SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
SysCtlPeripheralEnable (SYSCTL_Periph_UART4);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);

GPIOPinConfigure (GPIO_PA2_U4RX);
GPIOPinConfigure (GPIO_PA3_U4TX);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_2 | GPIO_PIN_3);

UARTConfigSetExpClk (UART0_BASE、ui32SysClock、115200、
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));

UARTConfigSetExpClk (UART4_base、ui32SysClock、115200、
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));

UARTFIFOLevelSet (UART0_BASE、UART_FIFO_TX1_8、UART_FIFO_RX1_8);
//UARTTxIntModeSet (UART0_BASE、UART_TXINT_MODE_FIFO);
UARTFIFOEnable (UART0_BASE);
UARTFIFODisable (UART0_BASE);

//UARTFIFOLevelSet (UART4_base、UART_FIFO_TX1_8、UART_FIFO_RX1_8);
//UARTFIFOEnable (UART4_BASE);
UARTFIFODisable (UART4_base);

IntEnable (INT_UART0);
//UARTIntDisable (UART0_BASE、UART_INT_RX | UART_INT_TX);
UARTIntEnable (UART0_BASE、UART_INT_RX);

IntEnable (INT_UART4);
//UARTIntDisable (UART4_base、UART_INT_RX | UART_INT_TX);
UARTIntEnable (UART4_base、UART_INT_RX);

//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
// UART 4中断
//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
空 UART4_IntHandler (空)

uint32_t ui32Status;

ui32Status = UARTIntStatus (UART4_base、true);
UARTIntClear (UART4_base、ui32Status);

IF (ui32Status 和 UART_INT_RX)

while (UARTCharsAvail (UART4_base))

COMM[COMM_232].RxD_TIMEOUT_CNT = 0;

COMM[COMM_232].RxD_BUF[COMM[COMM_232].RxD_BUF_PTR]= UARTCharGetNonBlocking (UART4_base);
if (++COMM[COMM_232].RxD_BUF_PTR >= 100) COMM[COMM_232].RxD_BUF_PTR = 0;


否则、IF (ui32Status 和 UART_INT_TX)

if (COMM[COMM_232].TXD_BUF_PTR > COMM[COMM_232].TXD_END_PTR)

COMM[COMM_232].TXD_BUF_PTR = 0;
UARTIntDisable (UART4_base、UART_INT_TX);
UARTIntEnable (UART4_base、UART_INT_RX);

其他

while (UARTSpaceAvail (UART4_base))

UARTCharPutNonBlocking (UART4_base、COMM[COMM_232].TXD_BUF[COMM[COMM_232].TXD_BUF_PTR+]);


//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
// UART 0中断
//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
空 UART0_IntHandler (空)

uint32_t ui32Status;

//获取中断状态
ui32Status = UARTIntStatus (UART0_BASE、TRUE);

//清除已发出的中断
UARTIntClear (UART0_BASE、ui32Status);

IF (ui32Status 和 UART_INT_RX)

while (UARTCharsAvail (UART0_BASE))

COMM[COMM_485].RxD_TIMEOUT_CNT = 0;
COMM[COMM_485].RxD_BUF[COMM[COMM_485].RxD_BUF_PTR]= UARTCharGetNonBlocking (UART0_BASE);
if (++COMM[COMM_485].RxD_BUF_PTR >= 100) COMM[COMM_485].RxD_BUF_PTR = 0;



否则、IF (ui32Status 和 UART_INT_TX)

if (COMM[COMM_485].TXD_BUF_PTR > COMM[COMM_485].TXD_END_PTR)

COMM[COMM_485].TXD_BUF_PTR = 0;
UARTIntDisable (UART0_BASE、UART_INT_TX);
UARTIntEnable (UART0_BASE、UART_INT_RX);

其他

while (UARTSpaceAvail (UART0_BASE))

UARTCharPutNonBlocking (UART0_BASE、COMM[COMM_485].TXD_BUF[COMM[COMM_485].TXD_BUF_PTR+]);

//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
// 50us 计时器中断
//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
空 Timer1_A_IntHandler (空)

TimerIntClear (Timer1_base、timer_TINA_TIMEOUT);

//--------
// MODBUS 통신(UART0)
//--------
if (COMM[COMM_485].RxD_FLAG =清除)

if (++COMM[COMM_485].RxD_TIMEOUT_CNT > 200);

COMM[COMM_485].RxD_TIMEOUT_CNT =清除;
if (COMM[COMM_485].RxD_BUF_PTR < 8) COMM[COMM_485].RxD_BUF_PTR = 0;

其他

UARTIntDisable (UART0_BASE、UART_INT_RX);
COMM[COMM_485].RxD_FLAG =置位;



if (COMM[COMM_485].TXD_FLAG =设置)

if (++COMM[COMM_485].RESTIME > 100)

COMM[COMM_485].RESTIME =清除;
COMM[COMM_485].TXD_FLAG =清除;
HWREG (UART0_BASE + UART_O_CTL)|= UART_CTL_EOT;
UARTIntEnable (UART0_BASE、UART_INT_TX);



//--------
// MODBUS 통신(UART4)
//--------
if (COMM[COMM_232].RxD_FLAG ==清除)

if (+COMM[COMM_232].RxD_TIMEOUT_CNT > 200)

COMM[COMM_232].RxD_TIMEOUT_CNT =清除;
if (COMM[COMM_232].RxD_BUF_PTR < 8) COMM[COMM_232].RxD_BUF_PTR = 0;
其他

UARTIntDisable (UART4_base、UART_INT_RX);
COMM[COMM_232].RxD_FLAG =置位;


if (COMM[COMM_232].TXD_FLAG =设置)

if (++COMM[COMM_232].RESTIME > 100)

COMM[COMM_232].RESTIME =清除;
COMM[COMM_232].TXD_FLAG =清除;
HWREG (UART4_BASE + UART_O_CTL)|= UART_CTL_EOT;
UARTIntEnable (UART4_base、UART_INT_TX);

//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//主函
//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
int main (空)

ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、20000000);

UART_INIT();

while (1)


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Fire/I 不使用您的 MCU -但您是否应该使用"LPAD 或评估板"- UART_0与该板的 ICDI MCU 没有关联-这可能会导致您注意到的问题? (如果 UART_0未连接到 ICDI -我的理论将失去支持。)

    通过快速代码审核-您对 UART_0的处理与 UART_4非常一致-并且"并行"应该会成功。
    很少有报告说 UART_0存在"问题"-大多数情况下、所有(其他) UART 都证明更具挑战性...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CB1.

    我很清楚这些注释。(UART_0是否与该板的 ICDI MCU 绑定-这可能会导致您注意到的问题?)

    我将 UART4与 USB 2串行转换器搭配使用、
    有问题的 UART0使用电路板的 ICDI。

    为了解释更详细的情况、
    如果 UART4正常运行、它通常从 PC 接收8个字节。
    但是、在 UART0 (中断输入)中、只能接收1个字节。

    我不理解这一点、很困惑。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Karls、
    首先、请编辑您的帖子、并使用粘贴代码 在" RTF 格式"选项上。 如果没有正确的格式、那么读取其他人的代码是非常困难的。
    第二:我看到您发送字节的唯一位置已经在 UART 中断内部。 您需要在其他地方启动传输。
    下一步:如果您将使用系统接收字节、同时启用 RT 中断、否则在外部设备下次向您发送内容之前、您很可能不会接收最后几个传入字节。
    此致
    布鲁诺
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    朋友 Bruno -很明显、您对"通过供应商批准的方法粘贴代码"的指示非常有用。

    但是-海报上的"成功 w/UART_4"和我(合理)对他的代码的评论显示、该代码(成功的 UART_4)与他的(失败的 UART_0)代码之间具有很好的"并行性"。   那么、除非您"错过了该证据"-如何解释 UART 之间的性能变化?   这是(更多)核心问题-是不是吗?

    (现在到您的"新徽标"- 2名员工(几乎)从"双眼和窦性引流"中恢复-我们准备了特殊便笺-以防止"眼睛痛苦的进一步观察和复发"。   (葡萄牙是否尚未为三年级学生制定"标准艺术做法"?)

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

    CB1_mobile 说:
    所以-除非您"错过了该证据"-如何解释 UART 之间的性能变化?

    我实际上不相信这种证据。 UART0也应该出现故障、因此我认为它不仅是因为 PC 发送了触发 RX 的内容... 但我现在不会对它进行更深入的分析。

    我也不喜欢这个徽标! 我在度假前整理了我的东西,在看到这么多的 LaunchPad 后,决定把它们放在一起拍照。 图像触发了我一句话:"有人建议我增加堆栈、我就这样做了"。 因为我对图片没有什么比这更好的了,所以我暂时将它保留为“头像”!

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

    (西方)每一位眼科医生都要感谢您-我"撤回"(现在)我对"葡萄牙最基本的艺术教义..."的批评。

    我们在诊断方法上的"差异"可能会证明是有趣的-你"不信任海报的证据"-而我"欢迎并赞扬它"-并且非常相信"重复模式"的力量。

    您似乎在"打败"(通常)欧洲人口外流一个月-价格很好(并为员工的"视觉治疗"祈祷。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    
    
    感谢您的建议(使用粘贴代码 在"丰富格式"选项上) 

    [引用 USER="Bruno Saraiva">第二:我看到您发送字节的唯一位置已经在 UART 中断内部。 您需要在其他地方启动传输。
    上面没有附加源代码、但我确实从其他地方开始传输、并开始发送中断。
    (已确认生成了传输中断。)

    我不知道原因是什么、但我成功地通过 Modbus 从 uart0发送和接收数据。
    但我再次感到困惑。(这不是 UART0和 UART4的问题、 而是仅关注 UART0。)
    问题是发送时应发送7个字节、但在我的情况下应发送18个字节。
    这似乎是错误的。 

    我将在下面再次附加源代码。 



    //====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    //UART 初始化================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    
    voidUART_init (void)
    {
    SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    
    //---
    // UART 引脚 기능 설정
    //---------------
    GPIOPinConfigure (GPIO_PA0_U0RX);
    GPIOPinConfigure (GPIO_PA1_U0TX);
    GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
    
    UARTConfigSetExpClk (UART0_BASE、 ui32SysClock,115200,
    (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
    UART_CONFIG_PAR_NONE));
    
    
    //---
    //UART 中断使能
    //------
    IntEnable (INT_UART0);
    UARTIntEnable (UART0_BASE、UART_INT_RX);
    }
    
    
    //================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    //UART0中断//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    
    voidUART0_IntHandler (void)
    {
    uint32_t ui32Status;
    
    //获取中断状态
    ui32Status = UARTIntStatus (UART0_BASE、TRUE);
    
    //清除断言的中断
    UARTIntClear (UART0_BASE、ui32Status);
    
    if (ui32Status & UART_INT_RX)
    {
    while (UARTCharsAvail (UART0_BASE))
    {
    COMM[UART0].RxD_BUF[COMM[UART0].RxD_BUF_PTR]= UARTCharGetNonBlocking (UART0_BASE);
    COMM[UART0].RxD_TIMEOUT_CNT = 0;
    
    if (++COMM[UART0].RxD_BUF_PTR >= 200) COMM[UART0].RxD_BUF_PTR = 0;
    }
    
    
    否则、IF (ui32Status 和 UART_INT_TX)
    {
    if (COMM[UART0].TXD_BUF_PTR > COMM[UART0].TXD_END_PTR)
    {
    COMM[UART0].TXD_BUF_PTR = 0; //步骤2:当我在这里休息时,COMM[UART0].TXD_BUF_PTR = 18...(7应该是正常的,
    我不理解该部分)
    UARTIntDisable (UART0_BASE、UART_INT_TX);
    UARTIntEnable (UART0_BASE、UART_INT_RX);
    GPIOPinWrite (GPIO_Porth_BASE、 GPIO_PIN_0、复位);
    }
    否则
    {
    while (UARTSpaceAvail (UART0_BASE))
    {
    UARTCharPutNonBlocking (UART0_BASE、COMM[UART0].TXD_BUF[COMM[UART0].TXD_BUF_PTR+]);
    }
    
    }
    }//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    
    
    
    //发送消息
    //========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    voidsend_MSG (u08 TX_PTR) //在源代码中看不到该函数,但在接收完成时调用该函数。
    {
    U16 CRC_WORD;
    
    CRC_WORD = CRC_16 (COMM[UART0].TXD_BUF、TX_PTR);
    COMM[UART0].TXD_BUF[TX_PTR+]= CRC_WORD 和0xFF;
    COMM[UART0].TXD_BUF[TX_PTR]= CRC_WORD >TRUART0_TRUART0]= TX_TRUART0_TRUART_UART0_TRUART0_TRUT.PTR]= TRUART_UART0_TR_TR_TRUART_UART0_TRU
    
    
    
    //步骤1:此处的断点为 COMM[UART0].TXD_BUF[o]~[6]= 0x01、0x03、0x02、0x00、0x14、 0xb8、0x75和
    Com[UART0].TXD_END_PTR = 6
    UARTCharPut (UART0_BASE、COMM[UART0].TXD_BUF[COMM[UART0].TXD_BUF_PTR+]);//正如我所说的,TX 传输从此处开始
    }
    
    ;===========================================================================================================================================================================
    //Main //========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    
    int
    main (void)
    {
    //从 PLL 以20MHz 运行。
    ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480)、20000000);
    IntMasterEnable();
    
    while (1)
    {
    WaitUtilInt();
    }
    

    中断处理程序是否错误? 请帮帮我