TM4C123GLaunchPad教程五_UART
TM4C123GLaunchPad教程五_UART
TM4C123GH6PM具有8个串口。可以配置它的波特率,数据长度,奇偶校验位,停止位等参数。同时UART也有多个中断。
代码及详解
#include
#include
#include "inc/hw_memmap.h"
#include "inc/hw_ints.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/uart.h"
#include "driverlib/sysctl.h"
#include "driverlib/pin_map.h"/* 中断服务函数 */
void vUART0_IntHandler(void)
{uint32_t ui_Status;int32_t i_UartReceiveData;/* 读取当前的中断状态 */ui_Status = UARTIntStatus(UART0_BASE, true);/* 清除中断状态 */UARTIntClear(UART0_BASE, ui_Status);/* 如果接受FIFO有数据就不断接收 */while(UARTCharsAvail(UART0_BASE)){/* 接收数据 */i_UartReceiveData = UARTCharGetNonBlocking(UART0_BASE);/* 将数据发送出去 */UARTCharPutNonBlocking(UART0_BASE, i_UartReceiveData);}
}void vUART_Config(void)
{/* 使能外设 */SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);/* 配置PA0,PA1为GPIO串口模式 */GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);/* 配置PA0和PA1的功能 */GPIOPinConfigure(GPIO_PA0_U0RX);GPIOPinConfigure(GPIO_PA1_U0TX);/* 设置UART0的模式,波特率 */UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));/* 注册UART0中断服务函数 */UARTIntRegister(UART0_BASE, vUART0_IntHandler);/* 设置中断优先级,TM4C123G的中断优先级有8个 */IntPrioritySet(INT_UART0, 0);/* 使能接收完成中断和接收超时中断 */UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT);/* 使能UART0中断 */IntEnable(INT_UART0);
}
程序还是分成了两部分一部分是UART配置,一个是UART中断服务函数。除了上面给出的代码,工程中还用到了上一节讲到的配置时钟的函数,将时钟配置为了80MHz。
先看void vUART_Config(void)这个函数,这个是UART配置函数。首先就是外设使能以及IO口模式的配置,这里不多讲了,然后就是将IO口配置为对应的外设模式。
/* 配置PA0和PA1的功能 */
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
然后就是UART模式的配置,用到了下面这个函数
void UARTConfigSetExpClk(uint32_t ui32Base, uint32_t ui32UARTClk,
uint32_t ui32Baud, uint32_t ui32Config);
它有四个参数,第一个选择用的是哪一个串口,第二个用来选择UART时钟源的频率,第三个参数是UART的波特率,第四个是UART的模式。
第二个参数,因为UART默认的时钟源是System Clock,因此用到了SysCtlClockGet()这个函数来获取系统时钟的频率作为输入参数。
第四个参数来配置,数据长度,停止位,以及校验模式,将他们与在一起作为参数上面程序中配置为了一个比较常用的模式,8位数据长度,一个停止位,无校验位模式。UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE。
然后就是中断的配置,注册中断服务函数,设置中断优先级,使能中断,注意一点,这里没有写使能总中断的函数,需要自己在主程序中写。
/* 使能接收完成中断和接收超时中断 */
UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT);
这里讲一下这个函数,这个函数用来使能UART不同的中断,这里使能了接收完成中断以及接受超时中断,用于接收到数据时产生中断,UART还有别的中断,可以参考手册,按需要使用。
然后说一说中断服务函数,首先是读取中断的状态标志,然后清除标志位
/* 读取当前的中断状态 */
ui_Status = UARTIntStatus(UART0_BASE, true);
/* 清除中断状态 */
UARTIntClear(UART0_BASE, ui_Status);
然后就是数据的接收以及处理
/* 如果接受FIFO有数据就不断接收 */
while(UARTCharsAvail(UART0_BASE))
{/* 接收数据 */i_UartReceiveData = UARTCharGetNonBlocking(UART0_BASE);/* 将数据发送出去 */UARTCharPutNonBlocking(UART0_BASE, i_UartReceiveData);
}
TM4C的UART采用了FIFO的形式,因此接收中断里要不断检查FIFO里有没有数据可用,使用了UARTCharsAvail(UART0_BASE)这个函数,不断循环直到FIFO里没有数据为止。
然后调用UARTCharGetNonBlocking(UART0_BASE);这个函数读取FIFO里的一个数据,它跟UARTCharPutNonBlocking函数是一对,一个接收,一个发送。固件库中用于UART接收发送的函数还有一对就是
int32_t UARTCharGet(uint32_t ui32Base);
void UARTCharPut(uint32_t ui32Base, unsigned char ucData);
这个上面的两个函数差了一个NonBlocking,区别就是如果没有NonBlocking函数会等待FIFO中有数据再接收,等待FIFO中有空位再发送。而带上了NonBlocking的如果遇到接收时FIFO为空,发送时FIFO已满时直接返回false而不在那循环等待。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
