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

📄 uart.c

📁 EX44B0开发板BootLoader
💻 C
字号:
/*****************************************************************************\
*                                                                             *
*  UART驱动模块                                                               *
*                                                                             *
\*****************************************************************************/

#include <stdarg.h>
#include <stdio.h>
#include "UART.h"

///////////////////////////////////////////////////////////////////////////////
//
//	功能:
//			初始化UART,必须在调用其他函数之前调用
//	参数:
//			mclk		主时钟频率
//			bps			需要的波特率
//	返回值:
//			无
//
void InitUART(unsigned mclk, unsigned bps)
{
	rPCONE = rPCONE & ~0x3c | 0x28;			// 设置PE1和PE2分别为TxD0和RxD0模式

	rULCON0 = 3;							// 正常模式,无奇偶位,1位停止位,8位数据位
	rUCON0 = 5;								// 中断或轮询模式
	rUFCON0 = 0;							// 禁止FIFO
	rUMCON0 = 0;
	rUBRDIV0 = CALC_UBRDIV(mclk, bps);		// 计算并设置波特率
}

///////////////////////////////////////////////////////////////////////////////
//
//	功能:
//			从UART接收一个字符,如果没有收到则阻塞
//	参数:
//			无
//	返回值:
//			读到的字符
//
unsigned char UART_Getch(void)
{
	while(!UART_Query());					// 等待有数据接收
	return RdURXH0();						// 读取数据
}

void UART_Gets(char *buf, int max_len)
{
	int c, len = 0, run = 1;
	max_len--;
	do {
		c = UART_Getch();
		switch(c)
		{
		case '\b':
			if(len)
			{
				len--;
				UART_Putch('\b');
				UART_Putch(' ');
				UART_Putch('\b');
			}
			break;
		case '\r':
			run = 0;
			UART_Putch('\r');
			UART_Putch('\n');
			break;
		default:
			if(len < max_len)
			{
				buf[len++] = c;
				UART_Putch(c);
			}
			else
				UART_Putch('\a');
		}			
	} while(run);
	buf[len] = 0;
}

///////////////////////////////////////////////////////////////////////////////
//
//	功能:
//			向UART发送一个字符
//	参数:
//			ch			待发送的字符
//	返回值:
//			无
//
void UART_Putch(unsigned char ch)
{
	while(!(rUTRSTAT0 & 2));				// 等待发送数据寄存器为空
	WrUTXH0(ch);							// 发送数据
}

///////////////////////////////////////////////////////////////////////////////
//
//	功能:
//			向UART发送一个字符串
//	参数:
//			str			待发送的字符串
//	返回值:
//			无
//
void UART_Puts(const char *str)
{
	while(*str)								// 遇到字符串结尾了吗?
	{
		UART_Putch(*str);					// 没有,发送该字符
		str++;								// 跳到下一个字符
	}
}

///////////////////////////////////////////////////////////////////////////////
//
//	功能:
//			向UART发送一个格式字符串(用法同printf)
//	参数:
//			format		待发送的格式字符串
//			...			替换内容
//	返回值:
//			无
//
void UART_Printf(const char *format, ...)
{
	char buf[256];							// 发送缓冲区
	va_list args;
	va_start(args, format);
	vsprintf(buf, format, args);			// 格式化字符串
	va_end(args);
	UART_Puts(buf);							// 发送
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -