?? uart.c
字號:
/********************************************************************************************************
* 文 件 名 : Comm.C
* 程 序 員 : (CaiJie) hnclcj@gmail.com
* (c) Copyright 2007-2007, CaiJie
* All Rights Reserved
* 說 明 : 這里的串口函數(shù)都是建立在LPC ARM7的基礎(chǔ)上的 應(yīng)用時根據(jù)硬件環(huán)境更改硬件相關(guān)函數(shù) (硬件函數(shù)如下)
********************************************************************************************************/
#define COMM_GLOBALS
#include "includes.h"
#if COMM_MODULE_EN > 0
/********************************************************************************************************
* 局部常數(shù)
********************************************************************************************************/
#ifndef MCU_Fosc /* MCU的晶振頻率設(shè)置 這是計算波特率必須的參數(shù) */
//#error "no defien MCU_Fosc e.g. #define MCU_Fosc 11059200L "
#endif
#define IER_RBR 0x01 // 中斷使能 接收數(shù)據(jù)
#define IER_THRE 0x02 // 中斷使能 發(fā)送數(shù)據(jù)
#define IER_RLS 0x04 // 中斷使能 線狀態(tài) (可能涉及字符超時)
#define IIR_PEND 0x01 // 中斷標志 是否中斷發(fā)生
#define IIR_RLS 0x03 // 中斷標志 接收線狀態(tài)
#define IIR_RDA 0x02 // 中斷標志 接收數(shù)據(jù)
#define IIR_CTI 0x06 // 中斷標志 超時
#define IIR_THRE 0x01 // 中斷標志 發(fā)送數(shù)據(jù)
#define LSR_RDR 0x01 //
#define LSR_OE 0x02 //
#define LSR_PE 0x04 //
#define LSR_FE 0x08 //
#define LSR_BI 0x10 //
#define LSR_THRE 0x20 //
#define LSR_TEMT 0x40 //
#define LSR_RXFE 0x80 //
/********************************************************************************************************
* 局部變量
********************************************************************************************************/
// 串口0的變量信息
#if COMM0_UNIT_EN > 0 && COMM0_RXD_EN > 0 // 串口0接收變量
static INT8U volatile Comm0RxBuf[COMM0_RXD_SIZE]; // 串口0接收分配緩存
static COMM0_RXD_TYPE volatile Comm0RxBufCtr; // 串口0接收數(shù)據(jù)個數(shù)計數(shù)器
static COMM0_RXD_TYPE volatile Comm0RxInIx; // 串口0接收數(shù)據(jù)入緩存位置索引
static COMM0_RXD_TYPE volatile Comm0RxOutIx; // 串口0接收數(shù)據(jù)出緩存位置索引
#endif
#if COMM0_UNIT_EN > 0 && COMM0_TXD_EN > 0 // 串口0發(fā)送變量
static BOOL volatile Comm0bCanSend; // 串口0發(fā)送忙標志 0=不忙 1=忙
static INT8U volatile Comm0TxBuf[COMM0_TXD_SIZE]; // 串口0發(fā)送分配緩存
static COMM0_TXD_TYPE volatile Comm0TxBufCtr; // 串口0發(fā)送數(shù)據(jù)個數(shù)計數(shù)器
static COMM0_TXD_TYPE volatile Comm0TxInIx; // 串口0發(fā)送數(shù)據(jù)入緩存位置索引
static COMM0_TXD_TYPE volatile Comm0TxOutIx; // 串口0發(fā)送數(shù)據(jù)出緩存位置索引
#endif
// 串口1的變量信息
#if COMM1_UNIT_EN > 0 && COMM1_RXD_EN > 0 // 串口1接收變量
static INT8U volatile Comm1RxBuf[COMM1_RXD_SIZE]; // 串口1接收分配緩存
static COMM1_RXD_TYPE volatile Comm1RxBufCtr; // 串口1接收數(shù)據(jù)個數(shù)計數(shù)器
static COMM1_RXD_TYPE volatile Comm1RxInIx; // 串口1接收數(shù)據(jù)入緩存位置索引
static COMM1_RXD_TYPE volatile Comm1RxOutIx; // 串口1接收數(shù)據(jù)出緩存位置索引
#endif
#if COMM1_UNIT_EN > 0 && COMM1_TXD_EN > 0 // 串口1發(fā)送變量
static BOOL volatile Comm1bCanSend; // 串口1發(fā)送忙標志 0=不忙 1=忙
static INT8U volatile Comm1TxBuf[COMM1_TXD_SIZE]; // 串口1發(fā)送分配緩存
static COMM1_TXD_TYPE volatile Comm1TxBufCtr; // 串口1發(fā)送數(shù)據(jù)個數(shù)計數(shù)器
static COMM1_TXD_TYPE volatile Comm1TxInIx; // 串口1發(fā)送數(shù)據(jù)入緩存位置索引
static COMM1_TXD_TYPE volatile Comm1TxOutIx; // 串口1發(fā)送數(shù)據(jù)出緩存位置索引
#endif
/********************************************************************************************************
* 局部函數(shù)
********************************************************************************************************/
#if COMM0_UNIT_EN > 0 && COMM0_TXD_EN > 0 /* 串口0的本地函數(shù) */
static void Comm0TxInBuf (INT8U Data);
//__irq void Comm0IntISR (void);
extern void UART0_Handler(void);
#endif
#if COMM1_UNIT_EN > 0 && COMM1_TXD_EN > 0 /* 串口0的本地函數(shù) */
static void Comm1TxInBuf (INT8U Data);
//__irq void Comm1IntISR (void);
extern void UART1_Handler(void);
#endif
/********************************************************************************************************
* 功 能 : COMM0 工作狀態(tài)初始化
* 入 口 : 'baud' 波特率 最大波特率為實際硬件能支持的波特率和數(shù)據(jù)處理能力設(shè)置
* 'parity' 奇偶效驗 這里根據(jù)bits自動為固定模式
* 'bits' 數(shù)據(jù)位 為8或9 其他數(shù)據(jù)則在C51為8BIT移位模式
* 'stops' 停止位 這里根據(jù)bits自行更改為固定模式 為了兼容以后的版本預(yù)留
* 返 回 : 1> COMM_ON_ERR 串口設(shè)置沒有錯誤
* 2> COMM_BAD_BUAD 錯誤的波特率
* 3> COMM_BAD_MODE 錯誤的工作模式
* 說 明 : 1> baud 為600以下時 需要屏蔽掉SETBIT(PCON,SMOD)波特率倍增模式
* 2> TH1的波特率發(fā)生率的計算公式需要更改
********************************************************************************************************/
#if (COMM0_UNIT_EN > 0 && COMM0_RXD_EN > 0) || ( COMM0_UNIT_EN > 0 && COMM0_TXD_EN > 0)
INT8U Comm0CfgPort (INT32U baud, INT8U parity, INT8U bits, INT8U stops)
{
INT32U Fdiv;
INT8U mode;
if ((baud == 0) || (baud > 115200)) { // 波特率過濾
return (COMM_BAD_BAUD); // 錯誤波特率
}
if ((bits <5) || (bits > 8)) { // 數(shù)據(jù)位數(shù)
return (COMM_BAD_MODE); // 錯誤模式
}
if (parity > 4) { // 校驗
return (COMM_BAD_MODE); // 錯誤模式
}
if ((stops == 0) || (stops > 2)) { // 停止位
return (COMM_BAD_MODE); // 錯誤模式
}
mode = 0; // 準備設(shè)置UART工作模式 BITS
switch (parity) { // 校驗?zāi)J? case 0 : // 奇校驗
mode &= ~(3 << 4); //
mode |= (0 << 4); // 1
break;
case 1 : // 偶校驗
mode &= ~(3 << 4); //
mode |= (1 << 4); // 1
break;
case 2 : // 強制為1
mode &= ~(3 << 4); //
mode |= (2 << 4); // 1
break;
case 3 : // 強制為0
mode &= ~(3 << 4); //
mode |= (3 << 4); // 1
break;
default : //
return(COMM_BAD_MODE); // 錯誤模式
}
switch (bits) { // 設(shè)置bits
case 5 : // 5
mode &= ~(3 << 0); //
mode |= (0 << 0); // 0
break;
case 6 : // 6
mode &= ~(3 << 0); //
mode |= (1 << 0); // 1
break;
case 7 : // 7
mode &= ~(3 << 0); //
mode |= (2 << 0); // 2
break;
case 8 : // 8
mode &= ~(3 << 0); //
mode |= (3 << 0); // 3
break;
default: //
return(COMM_BAD_MODE); // 錯誤模式
}
switch (stops) { // 停止位
case 1 : //
mode &= ~(1 << 2); //
mode |= (0 << 2); // 0
break;
case 2 : //
mode &= ~(1 << 2); //
mode |= (1 << 2); // 1
break;
default : //
return(COMM_BAD_MODE); // 錯誤模式
}
U0LCR = 0x80; // 允許訪問除數(shù)寄存器
Fdiv = (Fpclk / 16 ) / baud ; //
U0DLM = (INT8U)(Fdiv >> 8); // 波濤率
U0DLL = (INT8U)(Fdiv >> 0); // 波特率
U0LCR = 0x00; // DLAB = 0(禁止訪問除數(shù)寄存器)
U0FCR = 0x07; // 使能并初始化FIFO 1字節(jié)觸發(fā)中斷
U0LCR = mode; // 設(shè)置好通訊模式數(shù)據(jù)
U0IER = IER_RBR | IER_THRE; // 允許接收和發(fā)送中斷 線狀態(tài)中斷未使能
// U0IER = IER_RBR | IER_THRE | IER_RLS; // Enable UART0 interrupt
return (COMM_NO_ERR);
}
#endif
/********************************************************************************************************
* 功 能 : 初始化串口0的各種變量
* 入 口 : 無
* 返 回 : 無
* 說 明 : 無
********************************************************************************************************/
#if (COMM0_UNIT_EN > 0 && COMM0_RXD_EN > 0) || ( COMM0_UNIT_EN > 0 && COMM0_TXD_EN > 0)
void Comm0Init (void)
{
PINSEL0 &= ~(0x05<<0); // 清除設(shè)置 0,1=TXD 2,3=RXD
PINSEL0 |= (0x05<<0); // 連接GPIO到TXD RXD
IRQInstall(UART0_INT, (void *)UART0_Handler); // 裝載IRQ
// IRQInstall(UART0_INT, (void *)(Comm0IntISR));// 配置UART為向量中斷
#if COMM0_RXD_EN > 0 // 初始化接收的各種變量
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -