S3C2440串口学习

串口是嵌入式中常用的通信方式,他使用逐位发送,逐位接收。串行通信。串口有许多功能,诸如打印调试,连接各种模块。他安全可靠,连接简易所以被广泛使用。

串口通讯的基本定义:
1.波特率
2.格式:数据位,停止位,校验位,流量控制。
3.发送机与接收机用TX与RX相连接

USART的逻辑电平:
原来TX(即发送控制端)为高电平,ARM给予拉低并且保持1Bit的时间。PC机在低电平时开始计时,因为发送机于接收机之间有约定好的波特率,即按照约定好的波特率每隔一段时间读取一次发送引脚的电平。(一般是读取一个Bit中间时间的值),这样循环八次就完成了一个字节的接收。在接受完一个字节之后,以一个约定好的停止位结束本次字节的接收(停止位一般为1-2位数据)。在有些情况下,在八位数据与停止位的中间还会带有一个校验位。(一般为奇数偶数校验位,即一个字节中高电平的个数)。

串口存储:
因为是逐位发送的,在每接收到一位数据后会存入芯片中的FIFIO等待内存把他取出,取出之后再存入。

串口发送速度:
例如115200的波特率,一秒发送的Bit数目为115200/10=11520Bit

接下来我们开始分析编写USART的代码:
1.首先我们先从数据手册分析查看寄存器的配置:
GPH2与GPH3分别可以可以配置为串口0的TX与RX(即发送接收模式)
所需的条件是GPFCON[5:4]=10与GPFCON[7:6]=10
在这里插入图片描述
上面说过,串口不工作的时候引脚的电平默认为高电平
在这里插入图片描述我们这里将GPH引脚初始化为高电平,即GPHUP[2]为1;
这样我们的引脚初始化就完成了。

2.接着我们来设定波特率
首先我们在手册中找到波特率的计算公式:在这里插入图片描述
UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
由此可以计算得到UBRDOVn= 50000000/(115200*16)-1=26
所以向UBRDIV0写入26
在这里插入图片描述由模式设置寄存器中查的应向UCON0寄存器中写入0x00000005

3.设置完这些后,接下来我们设置串口的数据模式
由数据手册的列表中在这里插入图片描述中得到:ULCON0 = 0x00000003; /* 8n1: 8个数据位, 无较验位, 1个停止位 */

接下来写串口输出与输入函数,这里就不多介绍了很简单的逻辑,这里罗列出来

int putchar(int c)
{
	/* UTRSTAT0 */
	/* UTXH0 */

	while (!(UTRSTAT0 & (1<<2)));
	UTXH0 = (unsigned char)c;
	
}

int getchar(void)
{
	while (!(UTRSTAT0 & (1<<0)));
	return URXH0;
}

接着来写一个打印函数,这里也罗列出来:


int puts(const char *s)
{
	while (*s)
	{
		putchar(*s);
		s++;
	}
}在这里插入代码片

到这里就基本完成整个实验了,可以下载到开发板里面去试试开机的时候串口是否有打印出Hello World

备注:
实验代码:

在这里#include "s3c2440_soc.h"


/* 115200,8n1 */
void uart0_init()
{
	/* 设置引脚用于串口 */
	/* GPH2,3用于TxD0, RxD0 */
	GPHCON &= ~((3<<4) | (3<<6));
	GPHCON |= ((2<<4) | (2<<6));

	GPHUP &= ~((1<<2) | (1<<3));  /* 使能内部上拉 */
	

	/* 设置波特率 */
	/* UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
	 *  UART clock = 50M
	 *  UBRDIVn = (int)( 50000000 / ( 115200 x 16) ) –1 = 26
	 */
	UCON0 = 0x00000005; /* PCLK,中断/查询模式 */
	UBRDIV0 = 26;

	/* 设置数据格式 */
	ULCON0 = 0x00000003; /* 8n1: 8个数据位, 无较验位, 1个停止位 */

	/*  */

}

int putchar(int c)
{
	/* UTRSTAT0 */
	/* UTXH0 */

	while (!(UTRSTAT0 & (1<<2)));
	UTXH0 = (unsigned char)c;
	
}

int getchar(void)
{
	while (!(UTRSTAT0 & (1<<0)));
	return URXH0;
}

int puts(const char *s)
{
	while (*s)
	{
		putchar(*s);
		s++;
	}
}
插入代码片
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值