?? uart.c
字號:
/******************** (C) COPYRIGHT 2010 Embest Info&Tech Co.,LTD. ************
* 文件名: UART.c
* 作者 : Wuhan R&D Center, Embest
* 日期 : 01/22/2010
* 描述 : NXP LPC11xx 系列處理器 UART API 文件
*******************************************************************************
*******************************************************************************
* 歷史:
* 01/18/2010 : V1.0 初始版本
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "LPC11xx.h"
#include "UART.h"
volatile uint32_t UARTStatus;
volatile uint8_t UARTTxEmpty = 1;
volatile uint8_t UARTBuffer[UART_BUFSIZE];
volatile uint32_t UARTCount = 0;
/**
* @函數名: UART_IRQHandler
* @描述: UART 中斷處理程序 handler
* @參數: 無
* @返回值: 無
*/
void UART_IRQHandler(void)
{
uint8_t IIRValue, LSRValue;
uint8_t Dummy = Dummy;
IIRValue = LPC_UART->IIR;
/* 跳過 IIR 掛起位 */
IIRValue >>= 1;
IIRValue &= 0x07;
/* 檢查 1~3 位, 確定中斷 */
/* 接收行狀態 */
if (IIRValue == IIR_RLS)
{
LSRValue = LPC_UART->LSR;
/* 接收行狀態s */
if (LSRValue & (LSR_OE | LSR_PE | LSR_FE | LSR_RXFE | LSR_BI))
{
/* 存在錯誤或產生了中斷 */
/* 讀 LSR 將清除中斷 */
UARTStatus = LSRValue;
Dummy = LPC_UART->RBR;
return;
}
if (LSRValue & LSR_RDR) /* 接收數據準備好 */
{
/* 如果 RLS 沒有產生錯誤, 準備正常, 保存到數據緩沖區。 */
/* 注意: 讀 RBR 將清除中斷 */
UARTBuffer[UARTCount++] = LPC_UART->RBR;
if (UARTCount == UART_BUFSIZE)
{
UARTCount = 0; /* buffer overflow */
}
}
}
/* 接收數據可用 */
else if (IIRValue == IIR_RDA)
{
/* 接收數據可用 */
UARTBuffer[UARTCount++] = LPC_UART->RBR;
if (UARTCount == UART_BUFSIZE)
{
/* 緩沖區溢出 */
UARTCount = 0;
}
}
/* 字符超時指示 */
else if (IIRValue == IIR_CTI)
{
/* 字符超時指示 */
/* 第 9 位 CTI 錯誤 */
UARTStatus |= 0x100;
}
/* THRE, 發送保持寄存器空 */
else if (IIRValue == IIR_THRE)
{
/* THRE interrupt */
LSRValue = LPC_UART->LSR; /* 檢查 LSR 狀態查看
U0THR 是否已經包含有效數據 */
if (LSRValue & LSR_THRE)
{
UARTTxEmpty = 1;
}
else
{
UARTTxEmpty = 0;
}
}
return;
}
/**
* @函數名: ModemInit
* @描述: 初始化 UART0 端口為 modem, 設置選定的引腳。
* @參數: 無
* @返回值: 無
*/
void ModemInit( void )
{
LPC_IOCON->PIO2_0 &= ~0x07; /* UART I/O 配置 */
LPC_IOCON->PIO2_0 |= 0x01; /* UART DTR */
LPC_IOCON->PIO0_7 &= ~0x07; /* UART I/O 配置 */
LPC_IOCON->PIO0_7 |= 0x01; /* UART CTS */
LPC_IOCON->PIO1_5 &= ~0x07; /* UART I/O 配置 */
LPC_IOCON->PIO1_5 |= 0x01; /* UART RTS */
#if 1
LPC_IOCON->DSRLOC = 0;
LPC_IOCON->PIO2_1 &= ~0x07; /* UART I/O 配置 */
LPC_IOCON->PIO2_1 |= 0x01; /* UART DSR */
LPC_IOCON->DCDLOC = 0;
LPC_IOCON->PIO2_2 &= ~0x07; /* UART I/O 配置 */
LPC_IOCON->PIO2_2 |= 0x01; /* UART DCD */
LPC_IOCON->RILOC = 0;
LPC_IOCON->PIO2_3 &= ~0x07; /* UART I/O 配置 */
LPC_IOCON->PIO2_3 |= 0x01; /* UART RI */
#else
LPC_IOCON->DSRLOC = 1;
LPC_IOCON->PIO3_1 &= ~0x07; /* UART I/O 配置 */
LPC_IOCON->PIO3_1 |= 0x01; /* UART DSR */
LPC_IOCON->DCDLOC = 1;
LPC_IOCON->PIO3_2 &= ~0x07; /* UART I/O 配置 */
LPC_IOCON->PIO3_2 |= 0x01; /* UART DCD */
LPC_IOCON->RILOC = 1;
LPC_IOCON->PIO3_3 &= ~0x07; /* UART I/O 配置 */
LPC_IOCON->PIO3_3 |= 0x01; /* UART RI */
#endif
LPC_UART->MCR = 0xC0; /* 使能 Auto RTS 和 Auto CTS. */
return;
}
/**
* @函數名: UARTInit
* @描述: 初始化 UART0 端口,設置選中引腳、
* 時鐘,校驗、停止位、FIFO、等等。
* @參數: UART 波特率
* @返回值: 無
*/
void UARTInit(uint32_t baudrate)
{
uint32_t Fdiv;
uint32_t regVal;
UARTTxEmpty = 1;
UARTCount = 0;
NVIC_DisableIRQ(UART_IRQn);
LPC_IOCON->PIO1_6 &= ~0x07; /* UART I/O config */
LPC_IOCON->PIO1_6 |= 0x01; /* UART RXD */
LPC_IOCON->PIO1_7 &= ~0x07;
LPC_IOCON->PIO1_7 |= 0x01; /* UART TXD */
/* Enable UART clock */
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12);
LPC_SYSCON->UARTCLKDIV = 0x1; /* 分頻值 1 */
LPC_UART->LCR = 0x83; /* 8 位數據, 無校驗, 1 停止位 */
regVal = LPC_SYSCON->UARTCLKDIV;
Fdiv = ((SystemAHBFrequency/regVal)/16)/baudrate ; /*波特率 */
LPC_UART->DLM = Fdiv / 256;
LPC_UART->DLL = Fdiv % 256;
LPC_UART->LCR = 0x03; /* DLAB = 0 */
LPC_UART->FCR = 0x07; /* 使能并復位 TX 和 RX FIFO. */
/* 讀取并清除 line 狀態. */
regVal = LPC_UART->LSR;
/* 確保正常開始, TX 和 RX FIFO 中沒有數據. */
while ( LPC_UART->LSR & (LSR_THRE|LSR_TEMT) != (LSR_THRE|LSR_TEMT) );
while ( LPC_UART->LSR & LSR_RDR )
{
regVal = LPC_UART->RBR; /* 從 RX FIFO 中轉儲數據 */
}
/* 使能 UART 中斷 */
NVIC_EnableIRQ(UART_IRQn);
#if TX_INTERRUPT
LPC_UART->IER = IER_RBR | IER_THRE | IER_RLS; /* 使能 UART 中斷 */
#else
LPC_UART->IER = IER_RBR | IER_RLS; /* 使能 UART 中斷 */
#endif
return;
}
/**
* @函數名: UARTSend
* @描述: 根據數據長度發送一串數據到 UART 0 端口
* @參數: buffer pointer, and data length
* @返回值: 無
*/
void UARTSend(uint8_t *BufferPtr, uint32_t Length)
{
while ( Length != 0 )
{
/* THRE 狀態, 包含有效數據 */
#if !TX_INTERRUPT
while ( !(LPC_UART->LSR & LSR_THRE) );
LPC_UART->THR = *BufferPtr;
#else
/* 以下數據在中斷處理程序中設置當 THRE 產生時。 */
while ( !(UARTTxEmpty & 0x01) );
LPC_UART->THR = *BufferPtr;
UARTTxEmpty = 0; /* not empty in the THR until it shifts out */
#endif
BufferPtr++;
Length--;
}
return;
}
/**
* @}
*/
/**
* @}
*/
/************* (C) COPYRIGHT 2010 Wuhan R&D Center, Embest *****文件結束*******/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -