EK-TM4C123GXL UART 中断

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));
		}
}

你可能感兴趣的:(TM4C123GXL,LaunchPad)