串口驱动设计(基于S3C6410)
来源:互联网 发布:区块链网络结构 编辑:程序博客网 时间:2024/06/05 22:29
串口通讯
串口充当的角色有两个,一个是数据传输,还有一个就是充当控制台。串口通讯分为同步和异步,我们通常使用的是异步串口。通讯时,双方先约定好数据帧的格式,即波特率,数据位,停止位,奇偶校验位等。我们通常使用的是RS232的9帧串口,其中,最重要的是2,3,5脚。
2:RXD接收数据
3:TXD发送数据
5:GND接地
接下来,我们开始进行串口的初始化。在此使用的开发板是飞凌S3C6410。初始化内容主要分为以下四个方面,引脚设置,帧格式设置,工作模式设置,波特率设置。
引脚设置
由核心板原理图上可找到RXD和TXD是通过GPA这个寄存器控制的,所以,在芯片手册中找到GPACON这个寄存器。
由芯片手册可得,只要设置GPACON的0到3位和4到7位来分别设置RXD和TXD即可。这里很简单,只要如下设置
GPACON &= ~0xff; /*先将低八位清零*/ GPACON |= 0x22;
设置数据格式
引入一个寄存器ULCON0,线控制寄存器,主要是设置数据格式。
ULCON0寄存器低两位主要设置数据位个数,第二位设置停止位个数,校验位暂时不需要使用,其他位使用默认的值。
ULCON0 = 0b11;
设置工作模式
引用UCON0寄存器,只要设置这个寄存器中的0:3位,其中0:1位设置收模式,2:3位设置发模式,在这里都设置为polling mode,即轮询模式,也就是查询等待模式。
UCON0 = 0b0101;
设置波特率
这里引入两个寄存器UBRDIV0和UDIVDLOT0,可以从芯片手册中得到两个寄存器的值,串口的时钟是由PCLK来提供的,在时钟体系那节中明确写出PCLK被设置成66MHZ,波特率一般设置为115200,故UBRDIV0=PCLK/(BAUD*16)-1取整,而UDIVDLOT0则是对小数部分乘上16,取整后查表得出UDIVDLOT0的值,由于PCLK等于66MHZ,BAUD为115200,(66000000/(115200*16))-1=34.8,故UBRDIV0=34,0.8*16=12.8,12查表得UDIVDLOT0为0xDDDD。
至此,串口初始化程序已经完成,但是如何测试串口正常工作呢,这里需要加两个函数,接收字符和发送字符。
发送数据
引入UTRSTAT寄存器
主要检查这个寄存器第1位是否为0,如果为0,表明前一次数据还没有发送完,如果等于1,则可以进行发送数据,在程序中用while循环,将字符送给UTXH0寄存器即可。
void putc(unsigned char ch){ while (!(UTRSTAT0 & (1<<2))); UTXH0 = ch; }
接收数据
这里还是使用UTRSTAT寄存器,使用第0位,第0位若为0,表明还没有接收到数据,为1表明接收到数据,当接收到数据的时候送到URXH0寄存器中进行返回。
unsigned char getc(void){ unsigned char ret; while (!(UTRSTAT0 & (1<<0))); // 取数据 ret = URXH0; if ( (ret == 0x0d) || (ret == 0x0a) ) /*增加回显的功能,0x0d表示回车,0x0a表示换行*/ { putc(0x0d); putc(0x0a); } else putc(ret); return ret;}
附上整体程序
#define GPACON (*((volatile unsigned short *)0x7F008000))#define ULCON0 (*((volatile unsigned long *)0x7F005000))#define UCON0 (*((volatile unsigned long *)0x7F005004))#define UTRSTAT0 (*((volatile unsigned long *)0x7F005010))#define UBRDIV0 (*((volatile unsigned short *)0x7F005028))#define UTXH0 (*((volatile unsigned char *)0x7F005020))#define URXH0 (*((volatile unsigned char *)0x7F005024))#define UDIVSLOT0 (*((volatile unsigned short *)0x7F00502C))#define PCLK 66500000#define BAUD 115200void uart_init(){ //1.配置引脚功能 GPACON &= ~0xff; GPACON |= 0x22; //2.1 设置数据格式 ULCON0 = 0b11; //2.2 设置工作模式 UCON0 = 0b0101; //3. 设置波特率 UBRDIV0 =(int)(PCLK/(BAUD*16)-1); //UBRDIV0保存该公式计算后的整数部分 UDIVSLOT0 = 0x0; //UDISLOT0=保存该公式计算后的小数部分*16}void putc(unsigned char ch){ while (!(UTRSTAT0 & (1<<2))); UTXH0 = ch; }unsigned char getc(void){ unsigned char ret; while (!(UTRSTAT0 & (1<<0))); // 取数据 ret = URXH0; if ( (ret == 0x0d) || (ret == 0x0a) ) { putc(0x0d); putc(0x0a); } else putc(ret); return ret;}
- 串口驱动设计(基于S3C6410)
- 基于S3c6410触摸屏驱动分析(一)
- 基于S3c6410触摸屏驱动分析(二)
- 基于S3c6410触摸屏驱动分析(一)
- WINCE6.0+S3C6410串口驱动
- linux串口驱动——s3c6410平台(一)
- linux串口终端驱动——s3c6410平台(二)
- linux串口终端驱动——s3c6410平台(三)
- linux串口终端驱动——s3c6410平台(四)
- 基于S3C6410的kT0801A驱动
- 基于S3C6410的Touch驱动详解(之一)
- 基于S3C6410的Touch驱动详解(之二)
- 基于S3C6410的KT0801A的驱动
- 基于WINCE6.0+S3C6410的背光驱动
- 基于WINCE6.0+S3C6410的背光驱动
- 基于s3c6410的74hc595驱动
- C#基于事件驱动的多串口多线程串口通讯软件架构设计
- C#基于事件驱动的多串口多线程串口通讯软件架构设计
- Spring MVC数据绑定(一) 数据转换
- Smaba安装及配置文件配置注意事项
- nfs挂载错误wrong fs type, bad option, bad superblock
- Httpservlet cannot be resolved to a type的原因与解决方法
- DOM概念
- 串口驱动设计(基于S3C6410)
- js 实现图片自动轮换效果
- 初识树状数组(模板)
- Python3.6.1+selenium+pycharm安装
- Glide 4.0 相比 Glide 3.0 及使用详解
- 搭建zookeeper集群
- Tabular系列之问题1:如何利用其他人的账号进行权限测试?
- Android:应用启动优化
- 解决javascript向后台传输汉字乱码