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 LaunchPad的串口接收问题

Other Parts Discussed in Thread: TM4C123GH6PM

我现在就是想通过tm4c123gh6pm的串口的接收中断,可是我发现在接收数据的过程中,刚开始的7个字节接收不到,进不去中断,从第八个字节开始正常接收,我的代码:

/* UART0初始化 */
void uart0_init(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
SysCtlDelay(5);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_UART0))
{
}
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlDelay(5);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOA))
{
}
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
UARTIntEnable(UART0_BASE,UART_INT_RX); //串口中断接收使能
UARTIntRegister(UART0_BASE,UART0_Int); //注册串口中断函数
UARTStdioConfig(0, 115200, 16000000);
}

char flag = 0,data = 0;
void UART0_Int(void)
{
if(UARTIntStatus(UART0_BASE,UART_INT_RX))
{
flag = 1;
data = UARTCharGet(UART0_BASE);
UARTIntClear(UART0_BASE,UART_INT_RX);
}
}

请问大家有碰到这个问题吗,麻烦大家帮我看一下

  • 接收寄存器的FIFO配置一下,默认就是8个字节的,所以你在第八个字节的时候,才会进去中断。要想收到一个字节就进中断,重新配置FIFO。

  • 还有,你是每隔8个数据才能进去中断呢,还是超过8个后,都可以进去中断呢。

  • 给你个串口中断的例程试试。

    /*******************************************
    开发坏境:CCSv5.4
    开发板:TIVA C Launchpad(TM4C123GH6PM)
    程序功能:UART,将接收到的数据发送到上位机显示,在中断里执行
    程序说明:U0RX-PA0   U0TX-PA1
           UARTCharPutNonBlocking与UARTCharPut的区别:
           UARTCharPutNonBlocking发送直到FIFO满时就不发,所以会漏数据
                    而UARTCharPut当FIFO满时会等待,所以不会漏数据。
    编程者:Linchpin
    ********************************************/
    #include <stdint.h>
    #include <stdbool.h>
    #include "inc/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "driverlib/debug.h"
    #include "driverlib/fpu.h"
    #include "driverlib/gpio.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/uart.h"
    #include "driverlib/rom.h"
    #include "driverlib/pin_map.h"
    void UARTSend(const uint8_t *pucBuffer, uint32_t ulCount);
    
    int main(void)
    {
        //使能FPU
        FPUEnable();
        FPULazyStackingEnable();
        //设置时钟直接使用外部晶振
        SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
        //配置PA0和PA1为串口0引脚
        GPIOPinConfigure(GPIO_PA0_U0RX);
        GPIOPinConfigure(GPIO_PA1_U0TX);
        GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
        //配置UART0为115200,8-N-1
        UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200,(UART_CONFIG_WLEN_8 |
              UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
        //使能中断
        IntMasterEnable();
        //使能串口中断
        IntEnable(INT_UART0);
        UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT);
        //发送提示信息
        UARTSend((uint8_t *)"AAAAAAAAAABBBBBBBBBBMMMM\r", 25);
        while(1)
        {
        }
    }
    
    //串口发送函数
    void UARTSend(const uint8_t *pucBuffer, uint32_t ulCount)
    {
        while(ulCount--)
        {
            //将要发送的字符写进UART
            UARTCharPutNonBlocking(UART0_BASE, *pucBuffer++);
        	//UARTCharPut(UART0_BASE, *pucBuffer++);
        }
    }
    //串口接收中断服务程序
    void UARTIntHandler(void)
    {
        uint32_t ulStatus;
        //获取中断状态
        ulStatus = UARTIntStatus(UART0_BASE, true);
        //清除中断标志
        UARTIntClear(UART0_BASE, ulStatus);
        //直到串口FIFO中没有数据时才退出循环
        while(UARTCharsAvail(UART0_BASE))
        {
          //读串口接收的字符并回发
            UARTCharPutNonBlocking(UART0_BASE,UARTCharGetNonBlocking(UART0_BASE));
        }
     }
  • 建议参照TI tivaware UART例程来改。

  • UARTIntStatus(uint32_t ui32Base,
    bool bMasked)

    这个函数的第二个参数应该是个布尔值;

    还有,中断标志的清楚不应该放在循环内的。

    你这个函数是从哪移植过来的呢?