TI中文支持网
TI专业的中文技术问题搜集分享网站

Tiva LaunchPad的串口接收问题

我现在就是想通过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);
}
}

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

xyz549040622:

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

xyz549040622:

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

xyz549040622:

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

/*******************************************
开发坏境:CCSv5.4
开发板:TIVA C Launchpad(TM4C123GH6PM)
程序功能:UART,将接收到的数据发送到上位机显示,在中断里执行
程序说明:U0RX-PA0U0TX-PA1UARTCharPutNonBlocking与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)
{//使能FPUFPUEnable();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-1UARTConfigSetExpClk(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--){//将要发送的字符写进UARTUARTCharPutNonBlocking(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));}}

Maka Luo:

建议参照TI tivaware UART例程来改。

xyz549040622:

UARTIntStatus(uint32_t ui32Base,bool bMasked)

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

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

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

赞(0)
未经允许不得转载:TI中文支持网 » Tiva LaunchPad的串口接收问题
分享到: 更多 (0)