📄 uart.c
字号:
/****************************************Copyright (c)****************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name: uart.c
** Last modified Date: 2007-09-16
** Last Version: 1.0.0
** Descriptions: S3C2410 UART 基础驱动
**
**--------------------------------------------------------------------------------------------------------
** Created by: Hanhui
** Created date: 2007-09-16
** Version: 1.0.0
** Descriptions: S3C2410 UART 基础驱动
**
**--------------------------------------------------------------------------------------------------------
** Modified by: Hanhui
** Modified date: 2007-12-19
** Version: 1.0.0
** Descriptions: S3C2440 UART 基础驱动
**
*********************************************************************************************************/
#include "config.h"
#include "uart.h"
/*********************************************************************************************************
宏定义
*********************************************************************************************************/
#define __COM0_CLKBIT (1 << 10) /* COM0 在 CLKCON 中的位置 */
#define __COM1_CLKBIT (1 << 11) /* COM1 在 CLKCON 中的位置 */
#define __COM2_CLKBIT (1 << 12) /* COM2 在 CLKCON 中的位置 */
#define __COM0_GPIO ((1 << 2) | (1 << 3)) /* COM0 在 IO 口线中的位置 */
#define __COM1_GPIO ((1 << 4) | (1 << 5)) /* COM1 在 IO 口线中的位置 */
#define __COM2_GPIO ((1 << 6) | (1 << 7)) /* COM2 在 IO 口线中的位置 */
#define __COM0_GPHCON ((0x2 << 4) | (0x2 << 6)) /* COM0 在 GPHCON 中的设置 */
#define __COM1_GPHCON ((0x2 << 8) | (0x2 << 10)) /* COM1 在 GPHCON 中的设置 */
#define __COM2_GPHCON ((0x2 << 12) | (0x2 << 14)) /* COM1 在 GPHCON 中的设置 */
#define __COM0_MASK ((0x3 << 4) | (0x3 << 6)) /* COM0 在 GPHCON 中的区域 */
#define __COM1_MASK ((0x3 << 8) | (0x3 << 10)) /* COM1 在 GPHCON 中的区域 */
#define __COM2_MASK ((0x3 << 12) | (0x3 << 14)) /* COM2 在 GPHCON 中的区域 */
/*********************************************************************************************************
** Function name: uartInit
** Descriptions: 初始化 UART
** input parameters: iCom 串口号
** iInFrared 是否使用红外模式
** iData 数据位数
** iStopBit 结束位
** iCheck 校验方法
** iBaud 波特率
** pvIsrRoutine 中断服务函数, 为NULL表示不允许中断
** output parameters: NONE
** Returned value: 正确返回 0, 错误返回 -1
** Created by: Hanhui
** Created Date: 2007/09/18
**--------------------------------------------------------------------------------------------------------
** Modified by: LIXINTIAN
** Modified date: 2008.04.03
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
int uartInit (int iCom,
int iInFrared,
int iData,
int iStopBit,
int iCheck,
int iBaud,
void *pvIsrRoutine)
{
unsigned int uiUBRDIVn; /* 波特率发生器值 */
unsigned int uiULCONn; /* 线控制器值 */
unsigned int uiUCONn; /* 串口控制寄存器值 */
unsigned int uiUFCONn; /* FIFO 控制寄存器值 */
unsigned int uiInterEn; /* 是否允许中断 */
if (iData < 5) { /* 数据位数错误 */
return (-1);
}
iData -= 5; /* 确定寄存器中的值 */
uiInterEn = (pvIsrRoutine == (void *)0) ? 0 : 1; /* 确定是否需要中断 */
iBaud = (iBaud << 4); /* baud = baud * 16 */
iBaud = PCLK / iBaud;
iBaud = (int)(iBaud - 0.5);
uiUBRDIVn = iBaud; /* 波特率 */
uiULCONn = ((iInFrared << 6)
| (iCheck << 3)
| (iStopBit << 2)
| (iData)); /* 基本控制信息 */
uiUCONn = ((0x00 << 10) /* PCLK */
| (1 << 9) /* Tx Interrupt Type LEVEL */
| (1 << 8) /* Rx Interrupt Type LEVEL */
| (1 << 7) /* Rx Time Out Enable */
| (0 << 6) /* Rx Error Status */
/* Interrupt Disable */
| (0 << 5) /* Loopback Mode Disable */
| (0 << 4)
| (1 << 2) /* Tx Interrupt or poll */
| (1)); /* Rx Interrupt or poll */
uiUFCONn = ((0x3 << 6) /* Tx FIFO Trigger Level 12 */
| (0x2 << 4) /* Rx FIFO Trigger Level 12 */
| (1 << 2) /* Tx FIFO Reset */
| (1 << 1) /* Rx FIFO Reset */
| (1)); /* FIFO Enable */
if (iCom == COM0) { /* 设置 UART0 的 管脚 */
rGPHCON &= ~(__COM0_MASK);
rGPHCON |= __COM0_GPHCON;
rGPHUP |= __COM0_GPIO; /* 不使用上拉电阻 */
rCLKCON |= __COM0_CLKBIT; /* 时钟挂接 */
rUCON0 = 0;
rUFCON0 = uiUFCONn;
rUMCON0 = 0; /* 关闭流控 */
rULCON0 = uiULCONn;
rUCON0 = uiUCONn;
rUBRDIV0 = uiUBRDIVn;
if (uiInterEn) { /* 链接中断服务函数 */
HandleUART0 = (int)pvIsrRoutine;
/* changed by lixintian 2008.4.2 */
// vicIrqSet(VIC_CHANNEL_UART0, VIC_CHANNEL_UART0,
// (unsigned long)pvIsrRoutine); /* 允许中断 */
INTER_CLR_SUBMSK(BIT_SUB_RXD0); /* 打开接收中断 */
}
} else if (iCom == COM1) { /* 设置 UART1 的 管脚 */
rGPHCON &= ~(__COM1_MASK);
rGPHCON |= __COM1_GPHCON;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -