📄 uart.c
字号:
/*******************************************************************************
**
** File Name: uart.c
** Author: Zhoudan
** Last Modified: 2007-01-16
** Last Version: 0.4
** Environment: LPC2214/RVDSv2.2/uCOS-II2.52
** Descriptions: UART0 Driver
**
*******************************************************************************/
#include "config.h"
#define PROC_SERIAL_PUTC(c) U0THR = c; \
while((U0LSR & U0LSR_THRE) == 0)
const UARTMODE DefConSet = {8, 1, 0, 0};
const uint32 DefConSpeed = 9600;
UARTMODE *conset;
uint32 *conspeed;
/*******************************************************************************
* Function: Strtou32()
* Description: convert a string to unsigned long
* Input: str 要转换的字符串
* err 错误返回值
* Return: None
*******************************************************************************/
uint32 Strtou32(const char *str, int *ret)
{
uint32 num = 0;
char c;
uint8 digit;
int base = 10, nchars = 0, leadingZero = 0;
*ret = 0;
while ((c = *str) != 0)
{
if (nchars == 0 && c == '0')
{
leadingZero = 1;
str++;
nchars++;
continue;
}
else if (leadingZero == 1 && nchars == 1)
{
if (c == 'x')
{
base = 16;
str++;
nchars++;
continue;
}
else if (c == 'o')
{
base = 8;
str++;
nchars++;
continue;
}
}
if (c >= '0' && c <= '9')
{
digit = c - '0';
}
else if (c >= 'a' && c <= 'f')
{
digit = c - 'a' + 10;
}
else if (c >= 'A' && c <= 'F')
{
digit = c - 'A' + 10;
}
else
{
*ret = 3;
return 0;
}
if (digit >= base)
{
*ret = 4;
return 0;
}
num *= base;
num += digit;
str++;
nchars++;
}
return num;
}
/*******************************************************************************
* Function: SendC()
* Description: send a char to UART
* Input: c 要发送的数据
* Return: None
*******************************************************************************/
void SendC(char c)
{
PROC_SERIAL_PUTC(c);
}
/*******************************************************************************
* Function: GetC()
* Description: receive a char from UART
* Input: None
* Return: U0RBR 从串口0收到的字符
*******************************************************************************/
char GetC(void)
{
while ((U0LSR & U0LSR_RDR) == 0);
return U0RBR;
}
/*******************************************************************************
* Function: SendnStr()
* Description: send a string with length
* Input: str 要发送的数据指针
* n 发送的长度
* Return: None
*******************************************************************************/
static void SendnStr(const char *str, size_t n)
{
if (str == NULL)
return;
while (n && *str != '\0')
{
SendC(*str++);
n--;
}
}
/*******************************************************************************
* Function: SendStr()
* Description: send a string
* Input: str 要发送的数据指针
* Return: None
*******************************************************************************/
void SendStr(const char *str)
{
WDT_Feed();
SendnStr(str, strlen(str));
}
/*******************************************************************************
* Function: SendAny()
* Description: 任意数据发送
* Input: buf 要发送的字符串首地址
* len 要发送的数据长度
* Return: None
*******************************************************************************/
void SendAny(BYTE *buf, uint16 len)
{
uint16 i;
for (i = 0; i < len; i++)
{
PROC_SERIAL_PUTC(buf[i]);
}
}
/*******************************************************************************
* Function: Irq_U0()
* Description: UART0 ISR
*******************************************************************************/
void Irq_U0(void)
{
switch(U0IIR & 0x0F)
{
case U0IIR_RX:
case U0IIR_TIMEOUT:
U0RxISR();
break;
default:
break;
}
VICVectAddr = 0x00;
}
/*******************************************************************************
* Function: U0Set()
* Description: UART0参数设置
* Input: baud 串口波特率
* set 串口参数
* Return: 无
*******************************************************************************/
void U0Set(uint32 baud, UARTMODE set)
{
uint32 para;
U0LCR = (U0LCR_EN_DIV | U0LCR_DATA_8BITS | U0LCR_STOP_1BIT);
para = (Fpclk >> 4) / baud;
U0DLM = para >> 8;
U0DLL = para & 0xff;
para = set.datab - 5;
if(set.stopb == 2)
{
para |= 0x04;
}
if(set.parity != 0)
{
set.parity = set.parity - 1;
para |= 0x08;
}
para |= set.parity << 4;
para = (para & 0xF7) | set.enablep << 3;
U0LCR = para;
}
/*******************************************************************************
* Function: U0Init()
* Description: UART0 Init.
*******************************************************************************/
void U0Init(void)
{
extern void U0_Handler(void);
UARTMODE conset;
PINSEL0 |= UART0_TXD;
conset.datab = 8;
conset.stopb = 1;
conset.parity = 0;
conset.enablep = 0;
U0Set(9600, conset);
U0IER = U0IER_RBR;
U0FCR = U0FCR_FIFO | U0FCR_RX_1_TOUCH;
*(&VICVectCntl10 + NIRQ_UART) = EN_IRQ | IRQ_UART0;
*(&VICVectAddr10 + NIRQ_UART) = (uint32)U0_Handler;
VICIntEnable = EN_IRQ_UART0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -