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

📄 uart.c

📁 基于ARM和uC/OS-II实现的串口控制台
💻 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 + -