S3C2440串口及其中断系统详解
S3C2440A的通用异步收发器(UART)配有3个独立异步串行I/O(SIO)端口,每个都可以是基于中断或基于DMA模式的操作。换句话说,UART可以通过产生中断或DMA请求来进行CPU和UART之间的数据传输。
UART通过使用系统时钟可以支持最高115.2Kbps的比特率。如果是外部器件提供UEXTCLK的UART,则UART可以运行在更高的速度。每个UART通道包含两个的64字节的FIFO给发送和接收。
S3C2440A的UART包括了可编程波特率,红外(IR)发送/接收,插入1个或2个停止位,5位、6位、7位或8位的数据宽度以及奇偶校验。每个UART包含一个波特率发生器、发送器、接收器和一个控制单元,如图11-1所示。波特率发生器可以由PCLK、FCLK/n或UEXTCLK(外部输入时钟)时钟驱动。发送器和接收器包含了64字节FIFO和数据移位器。
将数据写入到FIFO接着在发送前复制到发送移位器中。随后将在发送数据引脚(TxDn)移出数据。与此同时从接收数据引脚(RxDn)移入收到的数据,接着从移位器复制到FIFO
使用2440的uart和其他芯片的uart使用类似,也是分为以下几步
设置数据长度,开始为,停止位,奇偶校验相关
选择设置uart时钟,中断类型,fifo状态等
设置FIFO,(我禁用了fifo)
设置自动流控制(我禁用了自动流控制)
设置波特率
波特率的计算公式如下
然后很重要的一点是串口配置好了还需要配置串口IO,参见之前的IO配置
如果要使能中断的话还要配置相应的中断,主要还是之前说过的寄存器,但是多了两个,子中断寄存器,
也就是说打开串口总中断之后需要再打开相应的子中断才能工作,中断处理清除总中断标志之后还要清除对应的子中断标志才行
Uart0.c
#include "uart0.h"
#include "stdio.h" //////////////////////////////////////////////////////////////////
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle; }; FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
WrUTXH0((u8)ch);;
return ch;
}
#endif /***********只打开接收中断***********/
void __irq uartRxISP(void)
{
char ch;
int i = 0; rSUBSRCPND |= 0x3; //清除rx,tx中断请求
rSRCPND |= 0x1<<28; //清除串口源挂起
rINTPND |= 0x1<<28; //清除串口子挂起 if(rUTRSTAT0 & 1) //接收缓冲区有数据
{
ch = rURXH0; //接收字节数据,接受处理
Uart0SendByte(ch);
}
} void Uart0Init(u32 baud)
{
CalcBusClk(); //计算总线频率 rULCON0 = 0x03; //8位数据,1位停止位,无校验,不使用红外
rUFCON0 = 0; //禁止fifo
rUMCON0 = 0; //禁止rts自动流控制 rUCON0 = 0x5; //使用pclk时钟,中断模式 rUBRDIV0=( (int)(PCLK/16./baud+0.5) -1 ); rGPHCON &=~((3<<4)|(3<<6));
rGPHCON |=(2<<4)|(2<<6); //把GPH3、GPH2设置为RXD[0] 、TXD[0] 功能 rSRCPND |= 0x1<<28; //清除串口中断挂起
rSUBSRCPND |= 0x3; //清除收发中断
rINTPND |= 0x1<<28; //清除串口中断请求
rINTSUBMSK &= ~(0x1); //打开UART0接收中断,使能中断
rINTSUBMSK |= (0x1<<1); //关闭UART0发送中断,禁止中断
rINTMSK &= ~(0x1<<28); //打开UART0中断屏蔽,总中断 pISR_UART0 = (unsigned)uartRxISP; //中断子程序建立连接 } void Uart0SendByte(u8 dat)
{
while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
WrUTXH0(dat);
while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
}
Uart0.h
#ifndef __UART0_H_
#define __UART0_H_
#include "2440addr.h"
#include "def.h"
#include "clock.h"
#include "stdio.h" void Uart0Init(u32 baud); void Uart0SendByte(u8 dat); #endif
S3C2440串口及其中断系统详解的更多相关文章
- S3C2440外部中断系统详解
个中断源的请求.提供这些中断源的是内部外设,如DMA控制器.UART.IIC等等.在这些中断源中,UARTn.AC97和EINTn中断对于中断控制器而言是“或”关系.任意一个中断发生都会触发总中断 当 ...
- linux-2.6.26内核中ARM中断实现详解(转)
转载:http://www.cnblogs.com/leaven/archive/2010/08/06/1794293.html 更多文档参见:http://pan.baidu.com/s/1dDvJ ...
- Bootstrap栅格系统详解,响应式布局
Bootstrap栅格系统详解 栅格系统介绍 Bootstrap 提供了一套响应式.移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列. 栅格系统用于通 ...
- java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET
java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了! 社区福利快来领取免费参加MDCC大会机会哦 Tag功能介绍—我们 ...
- Vmware12安装centos系统详解
vmware12安装centos7系统详解 用虚拟机12安装centos7系统详细安装过程,后附centos7下载地址. 工具/原料 虚拟机12 centos7系统镜像 方法/步骤 1 1.百度搜索c ...
- centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解
centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解 操作系统:centos 7.2 x86_64 安装walle系统服务端 1.以下安装,均在宿主机( ...
- syslog之一:Linux syslog日志系统详解
目录: <syslog之一:Linux syslog日志系统详解> <syslog之二:syslog协议及rsyslog服务全解析> <syslog之三:建立Window ...
- 利用python求解物理学中的双弹簧质能系统详解
利用python求解物理学中的双弹簧质能系统详解 本文主要给大家介绍了关于利用python求解物理学中双弹簧质能系统的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 物理的 ...
- 搭建zabbix监控系统详解
搭建zabbix监控系统详解 文:warren 博文大纲:一.前言 二.zabbix监控架构三.搭建Zabbix监控服务器四.搭建过程中遇到有些服务无法正常启动的解决办法 一.前言 : 要想实时的 ...
随机推荐
- struts2中的<s:select>默认选项
//... public class SelectAction extends ActionSupport{ private List<String> searchEngine; priv ...
- iOS拨打电话(三种方法)
iOS拨打电话(三种方法) 查了很多地方的关于iOS程序拨打电话,大都不全,今天我总结了三种方法,各有不同,拿来给大家分享,希望给大家有所帮助 1,这种方法,拨打完电话回不到原来的应用,会停留在通讯 ...
- python smtplib.SMTPDataError: (554
- Oracle Sql优化之日期的处理
1.时,分,秒,年,月,日等日期的常用取值方法 select hiredate, to_number(to_char(hiredate,'hh24')) 时, to_number(to_char(hi ...
- L8,the best and the worst
expressions: enter for 报名参加,只有作为参加的意思的时候才会用for enter the room进入房间 a little prize for the worst garde ...
- MaterialDrawer的使用
这是一个MaterialDesign风格的侧滑,在github上下载压缩包,按照github上的方式引入依赖,然后打开压缩包里面的例子程序,对照着APK看,即可知道怎么实现的(好像说了一堆废话..)
- Web应用的组件化(二)——管控平台 #7
Web应用的组件化(二) 管控平台 在上一篇中我们提到了组件化的大致思路,这一篇主要讲述在这么做之后,我们需要哪些外围手段去管控整个开发过程.从各种角度看,面对较大规模前端开发团队,都有必要建立这么一 ...
- 使用cisco SDM管理路由器
实验拓扑: 实验目的:掌握如何通过SDM对路由器进行管理 实验需求:设置R1使其能够通过SDM进行管理 实验步骤: 步骤一:配置基本IP地址 步骤二:在R1上进行设置,使其能够通过SDM连接 R1(c ...
- make -jN
今天又一次尝试编译安卓,想测试一下编译的速度如何? 考虑机器是4核8线程,就用上了 make -j8,感觉上上速度是很快,刷屏就下来了,不过错误了,错误的提示大概是某个文件的规则没找到,想想了多线程并 ...
- SQL C# nvarchar类型转换为int类型 多表查询的问题,查询结果到新表,TXT数据读取到控件和数据库,生成在控件中的数据如何存到TXT文件中
在数据库时候我设计了学生的分数为nvarchar(50),是为了在从TXT文件中读取数据插入到数据库表时候方便,但是在后期由于涉及到统计问题,比如求平均值等,需要int类型才可以,方法是:Conver ...