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

📄 uart_module.c.bak

📁 我写的基于lpc2148的SD卡驱动程序
💻 BAK
字号:
/********************************************************/
/*UART_MODULE.c*/                                        
/********************************************************/
/*	模块:UART_MODULE				  													*/
/*	描述:串口初始化模块																*/
/*	注意:使用前需要先定义串口波特率,如:	            */
/*		//定义串口波特率为115200													*/
/*		#define UART_BPS	115200													*/
/*																											*/
/*  处理器:																						*/
/*  调用函数:																					*/
/*  版本历史:																						*/
/*	V1.0																								*/
/*  作者:																								*/
/*	日期:																								*/
/*	修改原因:																						*/
/********************************************************/

                                                        
#include "config.h"  

const ary[511]=
{
FA BE 00 7C BF 00 7A B9 00 01 FC 0E 1F 0E 07 F3 A5 EA 16
7A 00 00 BB BE 7B 33 C9 80 3F 80 75 06 FE C5 8B F3 EB 07
80 3F 00 75 02 FE C1 83 C3 10 81 FB FE 7B 72 E5 83 F9 04
74 0B 81 F9 03 01 74 0A BB A5 7A EB 2C BB 87 7A EB 27 8B
4C 02 8B 14 B8 01 02 BB 00 7C CD 13 73 05 BB BC 7A EB 13
2E A1 FE 7D 3D 55 AA 74 05 BB BC 7A EB 05 EA 00 7C 00 00
2E 8A 07 3C 00 74 0C 53 BB 07 00 B4 0E CD 10 5B 43 EB ED
EB FE 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 80 02 06 00 06 1F FF C6 83 00
00 00 9D BE 1D 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55
}

/*F_UART0_Init****************************************/
/*  函数名:UART0_Init()															*/
/*  参数:	无																					*/
/*  返回值:无																*/
/*  作用域:																						*/
/*  功能:	初始化串口0				*/
/********************************************************/
void UART0_Init(void)
{
	U0LCR=(ULCR_num|0x80);//设置串口模式并使能访问除数锁存
	U0DLM=UDLM_num;//设置除数锁存器,该值在config.h中预定义
	U0DLL=UDLL_num;
	U0FDR=UFDR_num;	
	U0LCR=ULCR_num;//设置串口模式并禁止访问除数锁存	

	U0FCR=0x01;//使能FIFO,触发点为1个字符
	U0IER=0x01;//允许RBR中断
}                                                         
/* End of F_UART0__Init********************************/
                                                                                                                
/*F_UART0_GetByte****************************************/
/*  函数名:UART0_GetByte()															*/
/*  参数:	无																					*/
/*  返回值:接收到的数据																*/
/*  作用域:																						*/
/*  功能:	从串口接收1字节数据				*/
/********************************************************/

uint8 UART0_GetByte (void)
{
	uint8 rcv_dat=0;
	
	while((U0LSR & 0x01) == 0);//等待有效数据
	rcv_dat = U0RBR;
	
	return (rcv_dat);	
}  	
                                                        
/* End of F_UART0_GetByte********************************/

/*F_UART0_GetStr*****************************************/
/*  函数名:																						*/
/*  参数:	s	指向接收数据数组的指针																						*/
/*					n	接收的个数																			*/
/*  返回值:	无																					*/
/*  作用域:																						*/
/*  功能:	从串口接收																						*/
/********************************************************/
void UART0_GetStr (uint8 *s, uint32 n)
{
	for ( ; n>0; n--)
	{
		*(s++) = UART0_GetByte();
	}
	*(s++) = '\0';
}                                                          
/* End of F_UART0_GetStr*********************************************/

/*F_UART0_SendByte*****************************************************/
/*  函数名:UART0_SendByte()																						*/
/*  参数:	dat	要发送的数据																						*/
/*  返回值:无																						*/
/*  作用域:																						*/
/*  功能:	向串口发送字节数据,并等待发送完毕,查询方式																						*/
/********************************************************/
void UART0_SendByte (uint8 dat)
{
	U0THR = dat;
	while ((U0LSR & 0x40) == 0);		// 等待数据发送完毕
}                                                         
/* End of F_UART0_SendByte*********************************************/

/*F_UART0_SendStr*****************************************************/
/*  函数名:UART0_SendStr()																						*/
/*  参数:	str	要发送的字符串的指针																						*/
/*  返回值:无																						*/
/*  作用域:																						*/
/*  功能:	向串口发送一字符串																						*/
/********************************************************/
 void UART0_SendStr (uint8 const *str)
{
	while (1)
	{
		if (*str == '\0')	break;		// 遇到结束符,退出
		UART0_SendByte(*str++);			// 发送数据
	}
}                                                         
/* End of F_UART0_SendStr*********************************************/

/*
以字节方式接收一个字符串,并保存到静态数组中(收到一个字节,判断命令接收数组是否已满,
未满即判断是否为0x0D或0x0A,是回车符则不回显并将0x0D改为0x00,既不是回车也不是换行则存储后立刻回显)。
然后判断数组中的字符串是否是预定义的命令,是则执行,不是则回显:
输入命令错误,请重新输入。
*/
__irq void UART0_SERV(void)  
{
	char *ptr;
	static uint8 rcv_ary[512];
	uint16 ctr;
	uint8 rcv_byte;
	static char cmd_str[10]={0x00};//声明一个静态命令接收数组,可以存放8位字节的命令。cmd_str[0]中存放空字节
	static uint8 str_ptr=1;//命令接受数组cmd_str[]的数组指针,静态变量。
	
	while(U0LSR&1==0x01)
	{
		rcv_byte=UART0_GetByte();//字节接收存储器
		if(str_ptr<10) //判断命令接收数组是否已满
		{
			if(rcv_byte!=0x0D)//判断数据是否为回车符
			{
				cmd_str[str_ptr]=rcv_byte;
				UART0_SendByte(rcv_byte);
				str_ptr++;
			}
			else if(rcv_byte==0x0D)//若接收到的字节为回车符,存储不回显
			{
				cmd_str[str_ptr]=0x00;
				ptr=&cmd_str[1];

				if(strcmp(ptr,"$SDINIT")==0)
				{
					UART0_SendStr("\r\n");
					UART0_SendStr(">");
					UART0_SendStr("你发送给我的命令是:$SDINIT.\r\n");
					rcv_byte=SD_Initialize();
					UART0_SendByte(rcv_byte);
					UART0_SendStr("\r\n");
					UART0_SendStr("请发送给我新的命令\r\n");
					UART0_SendStr(">");
					str_ptr=1;
				}	
				else if(strcmp(ptr,"$SDRB")==0)
				{
					UART0_SendStr("\r\n");
					UART0_SendStr(">");
					UART0_SendStr("你发送给我的命令是:$SDRB.\r\n");
					if(SD_ReadBlock(0,rcv_ary))
						UART0_SendStr("块读失败");
					else
					{
						UART0_SendStr("块读成功!\r\n");
						for(ctr=0;ctr<511;ctr++)
						{
							UART0_SendByte(rcv_ary[ctr]);
						}
					}

					if(SD_WriteBlock(0,ary))
						UART0_SendStr("块写失败");
					else
					{
						UART0_SendStr("块写成功!\r\n");
					}

					if(SD_ReadBlock(0,rcv_ary))
						UART0_SendStr("块读失败");
					else
					{
						UART0_SendStr("块读成功!\r\n");
						for(ctr=0;ctr<511;ctr++)
						{
							UART0_SendByte(rcv_ary[ctr]);
						}
					}
					
				/*	for(ctr=0;ctr<511;ctr++)
					{
						UART0_hex2char(rcv_ary[ctr]);
					}
					*/
					UART0_SendStr("\r\n");
					UART0_SendStr("请发送给我新的命令\r\n");
					UART0_SendStr(">");
					str_ptr=1;
				}	
				else if(strcmp(ptr,"$ULSR")==0)
				{
					UART0_SendStr("\r\n");
					UART0_SendStr(">");
					UART0_SendStr("你发送给我的命令是:$ULSR.\r\n");
					UART0_SendStr("U0LSR=0x");
					UART0_hex2char(U0LSR);
					UART0_SendStr("\r\n");
					UART0_SendStr("请发送给我新的命令\r\n");
					UART0_SendStr(">");
					str_ptr=1;
				}
				else
				{
					UART0_SendStr("命令错误1,请重新输入!");
					UART0_SendStr("\r\n");
					UART0_SendStr(">");
					str_ptr=1;
					}
			}
			
		}
		else//接收数组已满,但还未接收到回车换行符,说明命令错误
		{
			UART0_SendStr("命令错误3,请重新输入!");
			UART0_SendStr("\r\n");
			UART0_SendStr(">");
			str_ptr=1;	
		}
	}
	VICVectAddr=0;
}

//将一个十六进制表示的数从串口终端显示出来
void UART0_hex2char(uint8 num_hex)	
{
	UART0_SendByte(num_hex/16+48);	
	UART0_SendByte(num_hex%16+48);
}

⌨️ 快捷键说明

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