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

📄 uart_module.c

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

                                                        
#include "config.h"  

uint8 ary[512]=
{
0xFA,0xBE,0x00,0x7C,0xBF,0x00,0x7A,0xB9,0x00,0x01,0xFC,0x0E,0x1F,0x0E,0x07,0xF3,0xA5,0xEA,0x16,
0x7A,0x00,0x00,0xBB,0xBE,0x7B,0x33,0xC9,0x80,0x3F,0x80,0x75,0x06,0xFE,0xC5,0x8B,0xF3,0xEB,0x07,
0x80,0x3F,0x00,0x75,0x02,0xFE,0xC1,0x83,0xC3,0x10,0x81,0xFB,0xFE,0x7B,0x72,0xE5,0x83,0xF9,0x04,
0x74,0x0B,0x81,0xF9,0x03,0x01,0x74,0x0A,0xBB,0xA5,0x7A,0xEB,0x2C,0xBB,0x87,0x7A,0xEB,0x27,0x8B,
0x4C,0x02,0x8B,0x14,0xB8,0x01,0x02,0xBB,0x00,0x7C,0xCD,0x13,0x73,0x05,0xBB,0xBC,0x7A,0xEB,0x13,
0x2E,0xA1,0xFE,0x7D,0x3D,0x55,0xAA,0x74,0x05,0xBB,0xBC,0x7A,0xEB,0x05,0xEA,0x00,0x7C,0x00,0x00,
0x2E,0x8A,0x07,0x3C,0x00,0x74,0x0C,0x53,0xBB,0x07,0x00,0xB4,0x0E,0xCD,0x10,0x5B,0x43,0xEB,0xED,
0xEB,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x02,0x06,0x00,0x06,0x1F,0xFF,0xC6,0x83,0x00,
0x00,0x00,0x9D,0xBE,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0xAA
};

/*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,"$REPARE")==0)
				{
					UART0_SendStr("\r\n");
					UART0_SendStr(">");
					UART0_SendStr("你发送给我的命令是:$REPARE.\r\n");
					if(SD_ReadBlock(0,rcv_ary))
						UART0_SendStr("块读失败");
					else
					{
						UART0_SendStr("块读成功!\r\n");
						for(ctr=0;ctr<512;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<512;ctr++)
						{
							UART0_SendByte(rcv_ary[ctr]);
						}
					}
					
					UART0_SendStr("\r\n");
					UART0_SendStr("请发送给我新的命令\r\n");
					UART0_SendStr(">");
					str_ptr=1;
				}	
				else if(strcmp(ptr,"$RDBLK")==0)
				{
					UART0_SendStr("\r\n");
					UART0_SendStr(">");
					UART0_SendStr("你发送给我的命令是:$RDBLK.\r\n");
					if(SD_ReadBlock(0,rcv_ary))
						UART0_SendStr("块读失败");
					else
					{
						UART0_SendStr("块读成功!\r\n");
						for(ctr=0;ctr<512;ctr++)
						{
							UART0_SendByte(rcv_ary[ctr]);
						}
					}
				}
				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 + -