s3c2440串口编程

0、串口总线标准:RS-232C  RS-422A  RS-485

1、串口通讯,分为同步通讯和异步通讯,我们通常使用的都是异步串口。通讯时,双方先约定好数据帧的格式,即波特率,数据位,停止位,奇偶校验位等。

2、串口通信数据格式


3、串口接线


1)

两端的插头上有1-9的标号,如果用万用表测相对应号码的针都是短通的,就是直连线。 

不是一对一通的就是交叉。

交叉就是收-发,发-收,一样设备用平行就会发-发,收-收

我们用的是交叉串口线。


2)

进行TTL与EIA电平转换:CPU和终端均采用TTL电平及正逻辑,它们与EIA采用的电平及负逻辑不兼容,需在接口电路中进行转换。

        正逻辑:高电平---1   低电平----0   TTL 大于0.4规定为“1”, 小于0.4为0

        RS-232-C标准:RS-232-C采用负逻辑规定逻辑电平,信号电平与通常的TTL电平也不兼容,RS-232-C将-5V~-15V规定为“1”,+5V~+15V规定为“0”


3)

 发送: TXD0—》MAX232—》RSTXD0-à串口线---PC      

 接收: PC-à串口线---RSRXD0-- MAX232-àRXD0-à嵌入式CPU  



4、串口驱动程序设计


5、串口通信原理方框图



6、程序实现

/***********************************************
Function  name  :   uart_init
Description     :   串口0初始化
Input parameter :   none
Return          :   none	 	
Others		    :                     	                    
*************************************************/
void uart_init()
{
	//设置GPHCON:GPH2、GPH3配置为串口发送和接收功能
	rGPHCON &= ~(0xf << 4);
	rGPHCON |= (0xa << 4);

	//不使能上拉电阻
        GPHUP |= 1<<3|1<<2;

	
	//设置uart行寄存器:正常模式、无校验、1停止位、8数据位
	rULCON0 = 0x3;
	//设置uart控制寄存器:时钟选择PCLK、使能超时中断、
	//收发方式为中断和轮询、其他默认
	rUCON0 = 0x5;
	//设置uartFIFO控制寄存器:中断触发深度、使能FIFO
	rUFCON0 = 0x01;
	//uart模式控制寄存器:不使能自动流控制模式
	rUMCON0 = 0x0;
	//设置波特率为115200:UBRDIV = PCLK/(115200 * 16) - 1
	rUBRDIV0 = PCLK/(BOUD * 16) - 1;
}




/***********************************************
Function  name  :   uart_putc
Description     :   串口0发送数据
Input parameter :   ch:要发送的字符
Return          :   none	 	
Others		    :                     	                    
*************************************************/
void uart_putc(unsigned char ch)
{
	
	if(ch == '\n')
	{	
		//等待fifo不为满
		while(rUFSTAT0 & (1 << 14));
		rUTXH0 = '\r';
	}
	//等待fifo不为满
	while(rUFSTAT0 & (1 << 14));
	//向发送buffer写入数据
	rUTXH0 = ch;
}

/***********************************************
Function  name  :   uart_getc
Description     :   串口0接收数据
Input parameter :   none
Return          :   接收到的字符	 	
Others		    :                   	                    
*************************************************/
unsigned char uart_getc(void)
{
	unsigned char ret;
	while ((rUFSTAT0 & 0x7f) == 0);  /* 如果RX FIFO空,等待 */ 
	ret = rURXH0;                   /* 取数据 */

	return ret;
}


/***********************************************
Function  name  :   uart_putstr
Description     :   串口0发送字符串
Input parameter :   ptr:字符串指针	
Return          :   none 	
Others		    :                   	                    
*************************************************/
void uart_putstr(char *ptr)
{
	while(*ptr)
	{
		uart_putc(*ptr++);
	}
}

/***********************************************
Function  name  :   uart_getstr
Description     :   串口0接收字符串
Input parameter :   ptr:字符串指针	
Return          :   none 	
Others		    :                   	                    
*************************************************/
void uart_getstr(char *ptr)
{
	char ch;
	while((ch = uart_getc()) != '\r')
	{
		if(ch == '\b')
		{
			ptr--;
			uart_putstr("\b \b");
		}
		else
		{
			*ptr++ = ch;
			uart_putc(ch);	
		}
	}
	*ptr = '\0';
}

/***********************************************
Function  name  :   uart_printf
Description     :   串口0打印格式化信息
Input parameter :   可变参数	
Return          :   none 	
Others		    :                   	                    
*************************************************/
void uart_printf(char *fmt,...)
{
	
	va_list ap;
	char string[256];
	va_start(ap,fmt);
	vsprintf(string,fmt,ap);
	uart_putstr(string);
	va_end(ap);
}
注:

uart_printf函数内所用到的函数ads编译器自带,只需包含头文件stdio.h    stdarg.h 即可。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该程序说明: 该程序为W35(320*240)LCD显示屏显示+触摸屏驱动程序+UART0通信 显示文字取模软件使用说明: 该显示程序用到的取模方式为:阴码、列行式、逆向、十六进制。在软件菜单选项中设定。 该程序可以在LCD显示数字、字母、汉字,显示的汉字要先用取模软件进行取模后,才能用。 触摸屏可以识别了,做了个小实例,按左边黄色的矩形框,显示“你好”,按右边的框,显示“LOVE” UART0串口通信 接收上位机发送命令,采用中断方式完成。(1、2、3) 接收为正确指令,发送相应回答。 接收为不正确指令,发送“please input 1/2/3” int main(void) { int i; U8 key; U32 mpll_val = 0 ; Port_Init(); Isr_Init(); i = 2 ; //hzh, don't use 100M! //boot_params.cpu_clk.val = 3; switch ( i ) { case 0: //200 key = 12; mpll_val = (92<<12)|(4<<4)|(1); break; case 1: //300 key = 13; mpll_val = (67<<12)|(1<<4)|(1); break; case 2: //400 key = 14; mpll_val = (92<<12)|(1<<4)|(1); break; case 3: //440!!! key = 14; mpll_val = (102<<12)|(1<<4)|(1); break; default: key = 14; mpll_val = (92<<12)|(1<>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3); ChangeClockDivider(key, 12); cal_cpu_bus_clk(); consoleNum = 0; // Uart 0 select for debug. Uart_Init( 0,115200 ); //串口初始化 Uart_Select( consoleNum ); uart0_int(); //串口中断初始化 #if 0 UsbdMain(); MMU_Init(); //MMU should be reconfigured or turned off for the debugger, #else MMU_Init(); //hzh #ifdef DEBUG_VERSION #endif #endif Uart_Printf("please input 1/2/3 \n"); uarttem=0; while(1) { switch(uarttem) { case '1': Uart_Printf("我是小丑!\n"); uarttem=0; break; case '2': Uart_Printf("但我很自信!\n"); uarttem=0; break; case '3': Uart_Printf("我也有梦想!\n"); uarttem=0; break; default: break; } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值