1.简介
简单介绍芯片内部的uart串口模块,分享uart的配置。本人是边学习边记录,内容仅作参考,有错误的地方请见谅。
2.UART介绍
本部分内容参考自TI官方手册。
芯片内部一共有8路独立的串口,像奇偶校验、停止位、波特率等常规配置都是具备的,120M主频时波特率最大支持到15Mbps。其中uart0-uart4支持硬件流控,其他的串口不支持硬件流控。每个串口都有两个独立的16BytteFIFO,分别用于Tx和Rx。支持硬件的SIR(红外线)编解码功能,还支持ISO 7816 smartcard通信。每个串口的Tx和Rx都支持DMA操作。
3.UART配置
uart0配置实现接收中断,在接收中断中读取数据然后发送,实现一个简单的串口回射功能。
void bsp_InitUart0(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
IntMasterEnable();
// Set GPIO A0 and A1 as UART pins.
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
// Configure the UART for 115,200, 8-N-1 operation.
UARTConfigSetExpClk(UART0_BASE, SystemCoreClock, 115200,
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));
// Enable the UART interrupt.
IntEnable(INT_UART0);
UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT);
}
//串口0中断函数
void UART0_Handler(void)
{
uint32_t ui32Status;
// Get the interrrupt status.
ui32Status = UARTIntStatus(UART0_BASE, true);
// Clear the asserted interrupts.
UARTIntClear(UART0_BASE, ui32Status);
// Loop while there are characters in the receive FIFO.
while(UARTCharsAvail(UART0_BASE))
{
// Read the next character from the UART and write it back to the UART.
UARTCharPutNonBlocking(UART0_BASE,
UARTCharGetNonBlocking(UART0_BASE));
}
}
4.UART的FIFO测试
下载程序后可以对串口的接收FIFO进行测试,在接收中断里面打断点,通过串口助手发送数据,发送超过16个字节的数据,然后取消断点查看串口助手接收的数据个数是否为16个。测试结果如下图所示,我一次性发送20个字节数据,接收第一个字节时进入中断,然后程序停在中断中,剩下的数据硬件自动接收到FIFO中,直到FIFO被填满,然后取消断点FIFO中的数据被全部回射,可以看见一共只回射了16个字节数据。关闭FIFO再次进行相同的测试,最终只能回射1个字节数据。FIFO的可以在串口中断无法立刻执行的情况下对数据进行缓存,避免数据丢失。