S3C2440的裸奔--UART串口篇(查询方式为轮询)

S3C2440的裸奔 --UART串口篇(查询方式为轮询) 作者: 泠瑛 网名: ling 邮件: lingying<at>live.com qq: 1641445037 网络团队: ARELY小组 更新日期:2012年08月01日 星期三 10时46分17秒 声明: 这是我个人学习ARM2440的笔记,主要参考了下面这些书,当然还远远不止这些。互联网上的开源技术资料和老师学长的指导都是我学习的源泉,当然ARELY小组的哥哥姐姐更是给予我全方位的支持,尤其是何君哥哥,他给予我的不仅是技术上的,还有精神上的鼓励和引导,谢谢大家,感谢开源文化!参考书目: 人民邮电出版社 《嵌入式Linux应用开发完全手册》 –韦东山著 机械工业出版社 《嵌入式Linux应用开发全程解析与实战》 –吴士力、刘奇、朱兰著 电子工业出版社 《嵌入式Linux系统实用开发》 –何永琪等著 人民邮电出版社 《Linux设备驱动开发详解》 –宋宝华著 电子工业出版社 《ARM嵌入式常用模块与综合系统设计实例精讲》–张绮文、解书钢著 电子工业出版社 《嵌入式系统Linux内核开发实战指南》 –王洪辉著 北京航空航天大学出版社 《ARM LINUX入门与实践》 –方强、程昌南著 北京航空航天大学出版社 《嵌入式底层软件开发》 –杨铸、唐攀著 前面都是通过LED跑马灯来查看软件的运行状态,这种方法显然不够好,反正我是不喜欢!几乎所有的嵌入式芯片都会有一个默认的通讯接口,它的名字就是通用异步接收器和发送器,人们常常简称其UART。 s3c2440上当然会带有UART,这颗CPU提供了3个独立的通道,每个通道都可以工作于中断模式或DMA模式。UART串口挂接在APB总线上,APB总线最高可以达到50MHz的工作频率,在使用APB时钟时可以达到115.2kb/s波特率的通讯速度。如果UART使用外部设备提供的UEXTCLK(外部时钟),其可以在更高的频率下工作。每个UART通道都有64字节的发送FIFO和64字节的接收FIFO,用于缓存发送数据和接收数据。 UART的数据帧结构如下: 1、开始位:1bit,必须包含在在数据帧中,免备案空间,表示一个数据帧的开始 2、数据位:可选5、6、7、8位,通过设置ULCONn指定 3、校验位:当开启数据校验时,该位必须指定 4、停止位:可选1位或2位,通过设置ULCONn指定 s3c2440的UART0和UART1支持nRTS和nCTS的自动流控制,UART2不支持。当两台支持自动流控制的UART连接时,A端的nRTS连接B端的nCTS,A端的nCTS连接着B端的nRTS,发送端发送数据前要检测nCTS引脚状态,当接收到nCTS激活信号时才可以发送数据帧;接收端在接收数据前,要检查自己的FIFO是否有大于32字节的空闲空间,如果自己的FIFO剩余空闲空间小于32字节,那么接收端的nRST必需置于非激活状态,如果自己的FIFO剩余空闲空间大于32字节,那么接收端就会把它的nRST置于激活状态,并开始接收数据。 UART是以异步方式实现通讯的,其采样速度由波特率决定,波特率可由PCLK、FCLK/n、UEXTCLK提供,可以通过设置UCONn来指定使用哪一个时钟源,绝大多数情况都会选PCLK来用的!s3c2440下的UART波特率是通过设置除数因子寄存器UBRDIVn来设置波特率的。其计算公式如下: 除数因子 = (整数)时钟源频率/(UART波特率 * 16) - 1 除数因之:其取值范围是1~2的16次方 - 1 时钟源频率:例如PCLK的时钟频率最高为50MHz UART波特率:例如UART波特率为115200 b/s 计算举例: UBRDIVn = (int)(50 x 10^6 / (115200 x 16)) -1 = 26 设置UART波特率时必须考虑波特率的错误容忍率,香港服务器租用,当其大于1.8%时,就需要选择较低的UART波特率或增加时钟源的输入时钟频率。其计算公式如下: UART_ERROR = (tUPCLK – tUEXACT)/tUEXACT * 100%s S3C2440A的UART单元对每个串口使用了好多个寄存器,3个串口就更多了,差不多30多个吧。不过倒是不难记,因为三个串口分别用0,1,2后缀标识,下面统一用小写的”n”表示串口编号。 ULCONn:传输格式寄存器,虚拟主机,包括数据位宽度、停止位宽度、奇偶校验模式、是否使用红外模式。 UCONn: 控制寄存器,用于设定操作模式(中断或轮询/DMA)、环回模式、中断方式、时钟选择。 UFCONn:FIFO控制寄存器,用于控制FIFO操作方式,如是否使用FIFO以及触发级别。 UMCONn:Modem控制寄存器,用于设置是否使用AFC(自动流控制)和RTS。TTL2是不支持流控制的,所以没有UMCON2寄存器。 UTRSTATn:收发状态寄存器,可从中读取收发保持寄存器的状态,即是否有数据,仅在非FIFO模式下使用。 UFSTATn:FIFO状态寄存器,可从中读取FIFO状态信息,用于FIFO模式。 UMSTATn:Modem状态寄存器,可从中读取Modem状态,即CTS信号状态。TTL2不支持流控制,所以没有UMSTAT2寄存器。 UERSTATn:错误状态寄存器,可从中读取接收错误状态。 UTXHn和URXHn:收发保持(对非FIFO模式)和缓冲(对FIFO模式)寄存器,用于收发数据。 UBRDIV:波特率除数寄存器,用于设定串口通信波特率。 因为启动代码和上一篇相同,所以这里同样略过。uart.c中的main函数在初始化UART0之后就进入死循环,它会不断的读取串口数据,并且会判断读到的数据是数字还是字母,如果是数字会返回“READ a Digit!”的提示,如果是字母会返回“READ a Char!”的提示。

如果没法忘记他,就不要忘记好了。真正的忘记,是不需要努力的。

S3C2440的裸奔--UART串口篇(查询方式为轮询)

相关文章:

你感兴趣的文章:

标签云: