EK-TM4C123GXL UART 中断
EK-TM4C123GXL 有多个UART,这里以UART0为例子,分享下UART的中断函数
中断的配置方式
IntEnable(INT_UART0);
//使能UART0接收中断
UARTIntEnable(UART0_BASE,UART_INT_RX);
//UART中断函数注册
UARTIntRegister(UART0_BASE,UART0IntHandler);
//全局中断使能
IntMasterEnable();
中断函数的处理
中断函数要完成中断标志的清除用到UARTIntClear(UART0_BASE,flag)函数。
另外中断标志的获取用UARTIntStatus(uint32_t ui32Base, bool bMasked);函数,特别说明下 bMasked参数,该参数可以屏蔽系统其他终端,参数为1,只获取不可屏蔽中断,参数为0,则返回原始的中断标志(即包括其他可屏蔽中断)
本程序中,只是将UART接收的数据直接输出,没有其他功能
代码
#include
#include
#include "inc/hw_memmap.h"
#include "inc/hw_ints.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "driverlib/interrupt.h"
//UART0的中断进程
void UART0IntHandler(void);
void UARTStringPut(uint32_t ui32Base, unsigned char *p,unsigned char length);
void main(void)
{
//配置时钟
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_16MHZ);
//使能UART外设
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
//使能GPIO外设
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
//GPIO模式配置 PA0--RX PA1--TX
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
//GPIO的UART模式配置
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
//UART协议配置 波特率115200 8位 1停止位 无校验位
UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200,
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));
//UART禁用FIFO 默认FIFO Level为4/8 寄存器满8字节后产生中断
//禁用后接收1位就产生中断
UARTFIFODisable(UART0_BASE);
//使能UART0中断
IntEnable(INT_UART0);
//使能UART0接收中断
UARTIntEnable(UART0_BASE,UART_INT_RX);
//UART中断地址注册
UARTIntRegister(UART0_BASE,UART0IntHandler);
//全局中断使能
IntMasterEnable();
while(1)
{
UARTStringPut(UART0_BASE,"Sleeping now\n",13);
SysCtlSleep();
}
}
/**
*UART字符串输出
*ui32Base UART地址
**p 数据指针
*length 数据长度
*/
void UARTStringPut(uint32_t ui32Base, unsigned char *p,unsigned char length)
{
while(length--)
{
while(UARTBusy(ui32Base));
UARTCharPut(ui32Base,*p++);
}
}
//UART0中断函数
void UART0IntHandler(void)
{
//获取中断标志 原始中断状态 不屏蔽中断标志
// uint32_t flag = UARTIntStatus(UART0_BASE,0);
//获取中断标志 原始中断状态 屏蔽中断标志
uint32_t flag = UARTIntStatus(UART0_BASE,1);
//清除中断标志
UARTIntClear(UART0_BASE,flag);
if(flag&UART_INT_RX)
//UARTCharsAvail()判断FIFO是否还有数据
while(UARTCharsAvail(UART0_BASE))
{
//输出得到的数据
UARTCharPut(UART0_BASE,UARTCharGet(UART0_BASE));
}
}