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:CAN#39;t UART 发送中断

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/605800/ek-tm4c1294xl-can-t-uart-transmit-interrupt

器件型号:EK-TM4C1294XL

我正在尝试发送 uart4中断

我已初始化 uart4,但没有获得传输中断

我的上述代码如下所示:

//--------------------------------------------------------------

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

SysCtlPeripheralEnable (SYSCTL_Periph_UART4);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

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

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

IntEnable (INT_UART4);

UARTIntEnable (UART4_base、UART_INT_TX);

//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
// 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)

   while (UARTSpaceAvail (UART4_base))
   {
      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);
      }
     其他 UARTCharPutNonBlocking (UART4_base、COMM[COMM_232].TXD_BUF[COMM[COMM_232].TXD_BUF_PTR+]);

   }

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

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

UART_INIT();

COMM[COMM_232].TXD_BUF[0]= 0x1;
COMM[COMM_232].TXD_BUF[1]= 0x3;
COMM[COMM_232].TXD_BUF[2]= 0x0;
COMM[COMM_232].TXD_BUF[3]= 0x0;
COMM[COMM_232].TXD_BUF[4]= 0x0;
COMM[COMM_232].TXD_BUF[5]= 0xA;
COMM[COMM_232].TXD_BUF[6]= 0x9d;
COMM[COMM_232].TXD_BUF[7]= 0xD1;

COMM[COMM_232].TXD_END_PTR = 7;
COMM[COMM_232].TXD_BUF_PTR = 0;

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

while (1)

//--------------------------------------------------------------

我不确定我会出现什么问题。 需要认真的帮助。

   -卡尔斯

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

    在 while ()循环之前,您只放置一个字符。 在默认条件下不会出现 Tx 中断:

    假设 FIFO 水平配置为缓冲区的一半(8字节)、这是默认值(但可以更改)。
    例如、您放置的空间大于这8个字节、12个字节。 硬件以您的 UART 速度传输字节。 当字节#9被传输、并且 FIFO 级别达到8时、即当你获得中断时(告知你的程序有足够的可用空间、并且你可以在那里放置另一组字节)。
    阅读此主题以获得更完整的讨论:
    e2e.ti.com/.../2221906

    在您的情况下、如果您只想发送8个字节、并且您有具有16个字节的 FIFO 缓冲区、则只需在一段时间内将它们全部同时放置即可。 传输中断有助于您管理更多字节。

    布鲁诺

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢!
    我非常乐于助人、能够解决我的问题!

    卡尔斯