开发中遇到的问题,暂时没能查出原因,求助TI专家。
芯片型号:TM4C123FH6PMI
问题描述:UART1接收上位机发来的数据帧(长度大于16字节),只有前16字节能正确接收,超过16字节的部分不能被接收。波特率:460800
下面是UART1初始化部分代码:
/**********串口1初始化函数**********/
//参数:baud-波特率
//返回:无
//备注:串口1用于与上位机的通信
void USART1_Init(uint32_t baud)
{
/*开启GPIOC与UART1时钟*/
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);
/*配置PC4、PC5管脚映射为UART1的RX和TX*/
ROM_GPIOPinConfigure(GPIO_PC4_U1RX);
ROM_GPIOPinConfigure(GPIO_PC5_U1TX);
/*配置PC4、PC5管脚为串口所需的模式*/
ROM_GPIOPinTypeUART(GPIO_PORTC_BASE,GPIO_PIN_4|GPIO_PIN_5);
/*配置UART1的时钟源为内部精确振荡器*/
ROM_UARTClockSourceSet(UART1_BASE,UART_CLOCK_PIOSC);
/*使能FIFO*/
ROM_UARTFIFOEnable(UART1_BASE);
/*关闭硬件流控*/
UARTFlowControlSet(UART1_BASE,UART_FLOWCONTROL_NONE);
/*为串口1提供控制台输入输出函数的支持,串口1时钟频率为16MHz*/
UARTStdioConfig(1,baud,16000000);
/*使能UART1*/
ROM_UARTEnable(UART1_BASE);
/*如果对串口1使用DMA方式*/
#ifdef SEND_USE_DMA
/*设置串口1产生DMA请求的条件,当发送(接收)FIFO中的数据少于(多于)其容量的1/8时产生DMA请求*/
ROM_UARTFIFOLevelSet(UART1_BASE,UART_FIFO_TX1_8,UART_FIFO_RX1_8);
/*使能串口1的DMA操作*/
ROM_UARTDMAEnable(UART1_BASE,UART_DMA_TX);
#endif
UARTprintf("UART1 initilization completed!\n");
}
下面是非中断接收数据帧部分的代码
/*接收帧缓冲区*/
volatile uint8_t received_frame[50];
/**********接收一帧数据并解析函数**********/
//参数:无
//返回:无
//备注:
void Receive_Data(void)
{
uint8_t volatile i,sum = 0,num;
/*如果接收到数据,即串口接收FIFO非空*/
if(ROM_UARTCharsAvail(UART1_BASE) == true)
{
/*帧头*/
received_frame[0] = (uint8_t)UARTCharGet(UART1_BASE);
received_frame[1] = (uint8_t)UARTCharGet(UART1_BASE);
/*功能字*/
received_frame[2] = (uint8_t)UARTCharGet(UART1_BASE);
/*帧长(只包括有效数据部分)*/
received_frame[3] = (uint8_t)UARTCharGet(UART1_BASE);
/*总帧长,即该帧的总字节数*/
num = received_frame[3]+5;
/*根据帧长接收余下的字节*/
for(i = 4;i<num;i++)
received_frame[i] = (uint8_t)UARTCharGet(UART1_BASE);
/*如果帧头不符,则不对这一帧进行解析*/
if((received_frame[0] != 0xAA)||(received_frame[1] != 0xAF))
return;
/*计算校验和*/
for(i = 0;i<(num-1);i++)
sum += received_frame[i];
/*如果校验和不符,则不对这一帧进行解析*/
if(sum != received_frame[num-1])
return;
在线DEBUG观察received_frame数组的内容,发现0-15字节正常,而后面的几个字节却是下一帧的内容,从而导致校验和不正确。请不吝赐教。