⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcuart.c

📁 基于NXP2200平台的OS移植模板
💻 C
字号:
/** @file	tcuart.c
* @brief	LPC2200 UARTn驅動程序
* @Notice	采用中斷方式, 如有问题请联系作者
* @Author	Mars.zhu@hotmail.com 2007-7-6 17:03
*/
#include "option.h"
#include "tcuart.h"
#include "Sermem.h"

/** @func UART0_Handle
* @brief 串口0中断服务程序
*/
static void __irq
UART0_Handle(void)
{
	uint8	i, dat;
	uint8	bak;

	bak = U0IIR;
	switch (bak) {
	case 0xC1:
	case 0x01: {								// 无中断
		for (i=0; i<1; i++) {
			if (UartGetc(0, &dat) == 0)	U0THR = dat;
			else break;
		}
		break;
	}
	case 0x00: {								// MSR, UART0无
		break;
	}
	case 0x06: {								// LSR
		i = U0LSR;
		break;
	}
	case 0xC4:
	case 0x04:									// 接收准备好
	case 0xCC:
	case 0x0C: {								// 接收超时
		while (U0LSR & UnLSR_RDR) {
			dat = U0RBR;
			UartPutc(0, dat);
		}
		break;
	}
	case 0x02:
	case 0xC2: {								// 发送寄存器空
		if ((U0LSR & UnLSR_THE) == 0)
			break;
		for (i=0; i<16; i++) {
			if (UartGetc(0, &dat) == 0)	U0THR = dat;
			else break;
		}
		break;
	}
	default:
		break;
	}
	VICVectAddr   = 0;
	VICSoftIntClr = 1 << UART0_NO;
}

/** @func UART1_Handle
* @brief 串口1中断服务程序
*/
static void __irq
UART1_Handle(void)
{
	uint8	i, dat;
	uint8	bak;

	bak = U1IIR;
	switch (bak) {
	case 0xC1:
	case 0x01: {								// 无中断
		for (i=0; i<1; i++) {
			if (UartGetc(1, &dat) == 0)	U1THR = dat;
			else break;
		}
		break;
	}
	case 0x00: {								// MSR, UART0无
		i = U1MSR;
		break;
	}
	case 0x06: {								// LSR
		i = U1LSR;
		break;
	}
	case 0xC4:
	case 0x04:									// 接收准备好
	case 0xCC:
	case 0x0C: {								// 接收超时
		while (U1LSR & UnLSR_RDR) {
			dat = U1RBR;
			UartPutc(1, dat);
		}
		break;
	}
	case 0x02:
	case 0xC2: {								// 发送寄存器空
		if ((U1LSR & UnLSR_THE) == 0)
			break;
		for (i=0; i<16; i++) {
			if (UartGetc(1, &dat) == 0)	U1THR = dat;
			else break;
		}
		break;
	}
	default:
		break;
	}
	VICVectAddr   = 0;
	VICSoftIntClr = 1 << UART1_NO;
}

/** @func UARTn_Init()
* @brief 實現串口初始化
* @param	fd		 串口号
*			termios	 串口數據結構
* @Retval	D_OK	 成功
*			D_ERR	 錯誤
*/
D_Result
UARTn_Init(uint8 fd, S_Termios* tios_p)
{
	uint8	bak;
	uint16	baud;

	switch (tios_p->c_cflag & CS_MASK) {		// 设置字长
		case CS5:	bak = 0;	break;
		case CS6:	bak = 1;	break;
		case CS7:	bak = 2;	break;
		case CS8:	bak = 3;	break;
		default:	return D_ERR;
	}
	if (tios_p->c_cflag & CSTOPB)				// 判断是否为2位停止位
		bak |= 0x04;
	if (tios_p->c_cflag & PARENB) {				// 使能校验位
		bak |= 0x08;
		if (tios_p->c_cflag & PARODD)
			bak	|= 0 << 4;						// 奇校验
		else
			bak	|= 1 << 4;						// 偶校验
	}
	baud = ((Fpclk>>4)/tios_p->c_baud);

	switch (fd) {
	case  0: {
		/** Set UART0 Pin*/
		PINSEL0 = (PINSEL0 & P000_CLR_BITS & P001_CLR_BITS) | P000_FOR_TXD0 | P001_FOR_RXD0;

		/** Set baud*/
		U0LCR = 0x80;
		U0DLM = baud >> 8;
		U0DLL = baud & 0xFF;
		/** Set mode*/
		U0LCR = bak;
		U0IER = UnIER_RINT_EN | UnIER_TINT_EN;

		switch (tios_p->c_FIFO_data) {
		case 1:	{
			U0FCR |= 7 | (0x00 << 6);
			break;
		}
		case 4: {
			U0FCR |= 7 | (0x01 << 6);
			break;
		}
		case 8: {
			U0FCR |= 7 | (0x02 << 6);
			break;
		}
		case 14: {
			U0FCR |= 7 | (0x03 << 6);
			break;
		}
		default:
			break;
		}
		SetISR(UART0_NO, UART0_Slot, (unsigned)UART0_Handle);

		return D_OK;
	}
	case  1: {
		/** Set UART1 Pin*/
		PINSEL0 = (PINSEL0 & P008_CLR_BITS & P009_CLR_BITS) | P008_FOR_TXD1 | P009_FOR_RXD1;

		/** Set baud*/
		U1LCR = 0x80;
		U1DLM = baud >> 8;
		U1DLL = baud & 0xFF;
		/** Set mode*/
		U1LCR = bak;
		U1IER = UnIER_RINT_EN | UnIER_TINT_EN;

		switch (tios_p->c_FIFO_data) {
		case 1:	{
			U1FCR |= 7 | (0x00 << 6);
			break;
		}
		case 4: {
			U1FCR |= 7 | (0x01 << 6);
			break;
		}
		case 8: {
			U1FCR |= 7 | (0x02 << 6);
			break;
		}
		case 14: {
			U1FCR |= 7 | (0x03 << 6);
			break;
		}
		default:
			break;
		}
		SetISR(UART1_NO, UART1_Slot, (unsigned)UART1_Handle);

		return D_OK;
	}
	default:
		return D_ERR;
	}
}

/** @func __UART_Flush
* @brief 手动激活发送中断, 内部函数
*/
void
__UART_Flush(uint8 fd)
{
	switch (fd) {
	case 0:
		VICSoftInt = 1 << UART0_NO;
		return;
	case 1:
		VICSoftInt = 1 << UART1_NO;
		return;
	default:
		return;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -