S3C2440串口通讯实现

一、目的

由于项目需求,要实现S3C2440串口与PC机的通讯。通过实验手册上的串口通讯示例了解串口的工作原理,实现简单的串口通讯实验。为进一步利用串口编程实现更加复杂的功能做准备。

实验效果:PC机上按下任意键,通过串口将字符传送至2440,2440又通过串口返回至PC机,并在DNW终端或超级终端显示该字符。

二、实验原理

PC机       <------->        S3C2440开发板

S3C2440的UART提供了三个独立的异步串行I/O端口,每个都可以在中断和DMA两种模式下进行,他们支持的最高波特率是115.2Kbps。每个UART通道包含两个64字节的FIFO,分别提供数据接收和发送。

每个UART包含波特率发生器、接收器、发送器和控制单元。其中,波特率发生器以MCLK为时钟源。发送器和接收器包含64字节FIFO寄存器和移位寄存器。当发送数据时,数据先写到FIFO,然后拷贝到发送移位寄存器,再从数据输出端口(TxDn)依次被移位输出。被接受的数据也同样从接收端口(RxDn)移位输入到移位寄存器,然后拷贝到FIFO中。

1、数据发送操作

数据发送帧的格式是可编程的,它包含一个开始位,5到8个数据位,一个可选的奇偶位和1或2个停止位,这些可通过线性控制器(ULCONn)来设置。

2、数据接收操作

与数据发送一样,数据接收的帧也是可编程的。接收器能够检测溢出错误、奇偶校验错误、帧错误和中止状况,每种情况下都将会产生一个错误标志置位。

3、波特率发生器

每个UART的波特率发生器为传输提供了串行移位始终。波特率发生器的时钟源可以从S3C2440的内部系统时钟或UEXTCLK中来选择。波特率由时钟源(PCLK、FCLK、或UEXTCLK)16分频和UART波特率除数寄存器(UBRDIVn)指定的16位除数决定。UBRDIVn的值可按照下式确定:

UBRDIVn = (int)(UART clock/(bps*16)) – 1

(UART clock为PCLK、FCLK或UEXTCLK) 除数的范围为1到(216-1)。

例如,若波特率为115200bps,且UART为40MHz,则UBRDIVn为:

UBRDIVn =(int)(40000000/(115200*16))-1

              = (int)(21.7) – 1

              = 22 – 1

              = 21

三、代码实现

主程序部分:serial.c

#define ULCON0 (*(volatile unsigned *)0X50000000) //UART线控制寄存器
#define UCON0 (*(volatile unsigned *)0X50000004) //UART控制寄存器
#define UFCON0 (*(volatile unsigned *)0X50000008) //FIFO控制寄存器
#define UTRSTAT0 (*(volatile unsigned*)0X50000010) //UART状态寄存器
#define UBRDIV0 (*(volatile unsigned *)0X50000028) //波特率
#define UTXH0 (*(volatile unsigned *)0X50000020) //发送数据寄存器8位
#define URXH0 (*(volatile unsigned *)0X50000024) //接收数据寄存器8位

int
TSmain()
{
char buf;

ULCON0 &=0XFFFFFF00;
ULCON0 |=0X03; //1位起始位,8位数据位
UCON0 =0X0805; //串口时钟PCLK,查询方式
UBRDIV0 =0X1A; //波特率115200
while(1)
{
if(UTRSTAT0 & 0X01) //接收是否完毕 =1结束
{
buf=URXH0; //读取数据
while(!(UTRSTAT0 & 0X04));//是否允许发送 =1允许
UTXH0=buf;
}
}

return 0;
}
引导程序部分
	AREA |DATA|,CODE,READONLY
ENTRY
ldr r13,=0x1000
IMPORT TSmain
b TSmain
END
 
上述程序分析:
首先,宏定义各个寄存器,例如地址0X50000000处为UART线控制寄存器,0X50000004处为UART控制寄存器,等等。进入TSmain()函数,定义char类型的变量buf,用于接收PC机传来的字符。接着ULCON0寄存器的低8位清零,设置低八位值为03,即帧传输模式为1位起始位,8位数据位,串口始终寄存器置为0x0805,表示串口时钟源为PCLK,查询模式,对于UBRDIV0寄存器的设置,表示波特率为115200。
下面进入while(1)语句,查看UTRSTAT0寄存器最低位是否为1,若为1,表示接收完毕,把URXH0中的内容置于buf中,查看UTRSTAT0寄存器第2位是否为1,若为1,表示允许发送数据,把buf中的数据置于UTXH0寄存器中,完成简单的串口通讯。
四、实验小结
通过此程序,了解了S3C2440串口通讯的实现原理,特别是各个寄存器的设置以及各个位的含义,为下一步通过串口通信,访问NAND Flash做好铺垫!
 

转载于:https://www.cnblogs.com/qi09/archive/2010/07/13/1776768.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值