三 ARM9(S3C2440)的串口UART——程序实例讲解

发布者:柳絮轻风最新更新时间:2015-09-23 来源: eefocus关键字:ARM9  S3C2440  串口UART 手机看文章 扫描二维码
随时随地手机看文章
串口通信程序编写步骤

UART通信程序可以采用查询、中断和DMA模式。我们通过使用较多的中断方式来介UART通信程序的编写。简单做法是,UART通信程序的编写参照例子程序。

选通道,通过函数Uart_Select();选UART0~UART2;

  选波特率和波特率发生器时钟,选波特率通过函数Uart_Pclk_En(int ch, int baud)或Uart_Pclk_En(int ch, int baud)来进行。时钟选UCLK ,rUCON0|=0x400;时钟选PCLK ,rUCON0&=0x3ff。

 通信协议(rULCON0)设定,如果正常通信,一位停止位,8位数据位,无奇偶效验: rULCON0=(0<<6)|(0<<3)|(0<<2)|(3);      

通信控制字(rUCON0)设定,如时钟选ULK做波特率发生器;Tx中断脉冲触发,Rx中断脉冲触发;接收超时中断允许;产生接收错误中断;正常模式发送:

        rUCON0|=(TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1);

        I/O口初始化,因为UART通信使用H口的第二功能,所以H口要上拉禁止:rGPHUP|=0x1ff。H口控制寄存器nRTS1,nCTS1功能使能,rGPHCON&=0x3c0000,rGPHCON|=0x2faaa;

设中断服务函数入口地址,把中断服务函数入口地址赋函数指针PISR_UARTn, 注意,接收中断服务函数入口地址和发送中断服务函数入口地址是一个,在中断服务函数中根据

UTRSTATn [1]和UTRSTATn [0]状态决定是发送中断还是接收中断。

打开总中断屏蔽和子中断屏蔽等待中断:

rINTMSK=~(BIT_UART0);

rINTSUBMSK=~(BIT_SUB_TXD0);

        进入中断后,先屏蔽发送和接收中断,防止新来中断干扰我们的正常发送和接收,正常发送和接收结束后,清中断挂起和中断源挂起寄存器:ClearPending(BIT_UART0),rSUBSRCPND=(BIT_SUB_TXD0(发送),rSUBSRCPND=(BIT_SUB_RXD0|BIT_SUB_ERR0)(接收);

        取消中断屏蔽,等下一次中断。

下面是利用查询方式的串口通信程序(FL2440开发板)

#include"2440addr.h"//该程序是PC机通过串口工具向开发板发送1234这四个数字来控制四个LED的亮灭

int TSmain()
{
 char buf,i;
 
 rULCON0 &=0XFFFFFF00;
 rULCON0 |=0X03;           //1位起始位,8位数据位
 rUCON0  =0x05;//0X0805;          //串口时钟PCLK,查询方式 东:PCLK为50M
 rUBRDIV0 =325;//0X1A;           //波特率115200****325时设置为9600
 rGPBCON = 0x1dd7fc;//GPB5,6,8,10设置为输出
 rGPBDAT|=0x560;//4个LED全灭
 while(1)
 
  if(rUTRSTAT0 & 0X01)  //接收是否完毕 =1结束
  {
   
   buf=rURXH0;       //读取数据
   while(!(rUTRSTAT0 & 0X04));//是否允许发送 =1允许

   rUTXH0=buf;
   if(buf=='1')//判断接收到的是哪一个数字
    i=1;
   else if(buf=='2')
    i=2;
   else if(buf=='3')
    i=3;
   else if(buf=='4')
    i=4;
   switch(i){      //使相应的LED亮灭
      
      case 1:
        rGPBDAT^=(1<<5);
        i=0;//将i清零防止下次收到其他数据时干扰
        break;
      case 2:
        rGPBDAT^=(1<<6);
        i=0;
        break;
      case 3:
        rGPBDAT^=(1<<8);
        i=0;
        break;
      case 4:
        rGPBDAT^=(1<<10);
        i=0;
        break;
      default:break;
      }
   
  }
 }
 
 return 0;
}[page]

 下面是利用中断的串口通信程序


#include"2440addr.h"
void __irq UART0RX_isr()
 {
  char buf,i;
  rINTMSK=0xffffffff;
  ClearPending(BIT_UART0);
  
  if(rUTRSTAT0 & 0X01)  //接收是否完毕 =1结束
  {
   ClearSubPending(BIT_SUB_RXD0);
   buf=rURXH0;       //读取数据
   while(!(rUTRSTAT0 & 0X04));//是否允许发送 =1允许

   rUTXH0=buf;
   if(buf=='1')
    i=1;
   else if(buf=='2')
    i=2;
   else if(buf=='3')
    i=3;
   else if(buf=='4')
    i=4;
   switch(i){
      
      case 1:
        rGPBDAT^=(1<<5);
        i=0;//将i清零防止下次收到其他数据时干扰
        break;
      case 2:
        rGPBDAT^=(1<<6);
        i=0;
        break;
      case 3:
        rGPBDAT^=(1<<8);
        i=0;
        break;
      case 4:
        rGPBDAT^=(1<<10);
        i=0;
        break;
      default:break;
      }
   
  }
  EnableIrq(BIT_UART0);
  EnableSubIrq(BIT_SUB_RXD0);
  EnableIrq(BIT_EINT0|BIT_EINT2|BIT_EINT3|BIT_EINT4_7);
 }
static void __irq Key_ISR()
{
 char key;//用来标识是哪一个按键按下

 //EnterCritical(&r);
 rINTMSK=0xffffffff;
 if(rINTPND==BIT_EINT0) {
  ClearPending(BIT_EINT0);
  key=1;
 }
  else if(rINTPND==BIT_EINT2) {
   ClearPending(BIT_EINT2);
   key=2;
  }
   else if(rINTPND==BIT_EINT3) {
    ClearPending(BIT_EINT3);
    key=3;
   }
    else if(rINTPND==BIT_EINT4_7){
     rEINTPEND=(1<<4);
     ClearPending(BIT_EINT4_7);
     key=4;
    }
 switch(key){
  case 1:
    rGPBDAT^=(1<<5);
    break;
  case 2:
    rGPBDAT^=(1<<6);
    break;
  case 3:
    rGPBDAT^=(1<<8);
    break;
  case 4:
    rGPBDAT^=(1<<10);
    break;
 }
 
 //ExitCritical(&r);
 EnableIrq(BIT_EINT0|BIT_EINT2|BIT_EINT3|BIT_EINT4_7);
 EnableIrq(BIT_UART0);
 EnableSubIrq(BIT_SUB_RXD0);
    
  
  
}
int TSmain()
{
 
 
 rULCON0 &=0XFFFFFF00;
 rULCON0 |=0X03;           //1位起始位,8位数据位
 rUCON0  =0x05;//0X0805;          //串口时钟PCLK,查询方式 东:PCLK为50M
 rUBRDIV0 =325;//0X1A;           //波特率115200****325时设置为9600
 rGPHUP=0x1ff;//H口上拉禁止
 rGPHCON&=0x3c0000;
 rGPHCON|=0x2faaa;
 rGPBCON = 0x1dd7fc;//GPB5,6,8,10设置为输出
 rGPBDAT|=0x560;//4个LED全灭
 rGPFCON &=~((3<<0)|(3<<4)|(3<<6)|(3<<8)) ;
 rGPFCON |= ((2<<0)|(2<<4)|(2<<6)|(2<<8)) ;//GPF0,GPF2,GPF3,GPF4工作在第二功能状态,即中断
 rEINTPEND=(1<<4);
 ClearPending(BIT_EINT0|BIT_EINT2|BIT_EINT3|BIT_EINT4_7);
 ClearSubPending(BIT_SUB_RXD0);
 ClearPending(BIT_UART0);
 pISR_EINT0= pISR_EINT2 =pISR_EINT3 = pISR_EINT4_7=(int)Key_ISR;
 EnableIrq(BIT_EINT0|BIT_EINT2|BIT_EINT3|BIT_EINT4_7);
 EnableIrq(BIT_UART0);
 EnableSubIrq(BIT_SUB_RXD0);
 rEINTMASK=~(1<<4);
 pISR_UART0=(unsigned) UART0RX_isr;
 
 while(1)
 
  
 }
 
 return 0;
}

关键字:ARM9  S3C2440  串口UART 引用地址:三 ARM9(S3C2440)的串口UART——程序实例讲解

上一篇:四 ARM9(S3C2440)的ADC和触摸屏控制——理论知识
下一篇:一 ARM9(S3C2440)的中断系统——程序实例讲解

推荐阅读最新更新时间:2024-03-16 14:33

三星cpu s3c2440 的中断向量表问题
以前一直搞不明明白,2440 的中断向量表为什么会是在 _ISR_STARTADDRESS=0x33FF_FF00?cpu是这么跳转到这个位置的? 在零地址的终端向量表有做什么用。 今天有空,仔细研究了下,终于看清楚了。 注意一下代码: ENTRY ;1)The code, which converts to Big-endian, should be in little endian code. ;2)The following little endian code will be compiled in Big-Endian mode. ; The code byte order should be
[单片机]
ARM9学习---虚拟机中LINUX与主XP系统数据通信
我在XP系统中安装了虚拟机,VMwave,安装了redhat 的Linux系统,但是有些需要在Linux系统中安装软件等,所以需要从XP系统中把文件传输到Linux系统中。我接触 Linux系统时间不长,所以也不是特别的熟悉,所以先学了一种方法,就是利用FTP传输的方法,就是在主XP系统中安装一个FTP软件(我用的是G6 FTP Server V2.0软件)安装很简单,只要设置好IP地址和路径就可以了。我主要是用XP传输给Linux系统,所以很简单。在Linux系统终端中进入你所需要下载文件的文件夹,然后键入:ftp 192.168.50.103(我主机的IP地址) ,如果有用户名和密码,那就键入相应的用户名和密码,如果显示conn
[单片机]
LCD实验学习笔记(九):UART
s3c2440包含三个通用异步收发器,可工作于中断模式或DMA模式。每个UART包含两个64字节的FIFOs用于接收和发送数据。可编程设置波特率、1或2个停止位,5/6/7/8个数据位和奇偶校验状态。 串口线一般是3条,TxD,RxD,Gnd,即发送线,接收线和地线。 数据传送之前,UART之间约定好传输速率(每位所占据的时间,其倒数沩波特率)、数据传输的格式(多少个数据位、是否使用校验位、奇校验还是偶校验、多少个停止位)。 发送数据时,CPU先将数据写入发送FIFO,UART会自动将FIFO中的数据复制发送移位器(Transmit Shifter)中,发送移位器将数据一位一位的发送到TxDn数据线上。接收则过程相反。 使
[单片机]
ZigBee基础实验(六)--UART(串口收发)
1、初始化 在串口初始化部分,和上一节不同的地方是: 51 U0CSR |= 0x40; //允许接收 52 IEN0 |= 0x84; //开总中断允许接收中断 第51行使能接收数据,上一节介绍的仅仅是发送,所以没有这一句配置: 第51行开总中断和UART0中断: 1 /**************************************************************************** 2 * 文 件 名: main.c 3 * 描 述: 设置串口调试助手波特率:115200bps 8N1 4 * 串口调试助手给CC2530
[单片机]
ZigBee基础实验(六)--<font color='red'>UART</font>(<font color='red'>串口</font>收发)
S3C2440的camera接口特性及WinCE 下的驱动
S3C2440是应用十分广泛且适用于嵌入式系统的一款嵌入式处理器。winCE 5.0/6.O是微软公司开发的一款专用于嵌入式系统的实时操作系统。其模块化设计使开发人员可以根据需求定制设备。目前,国内大部分OEM商都提供了对S3C2440的camera接口在WinCE5.O/6.0下的驱动支持。遗憾的是,目前国内OEM商提供的驱动仅限于对几款微型摄像头(如ov9650等)的驱动支持。当用户采用CCD摄像头作为图像采集的前端设备时,原来的驱动已经不能使用了,而CCD摄像头因其优越的性能,在监控领域扮演着主力军角色。本文从分析S3C2440的camera接口特性出发,详细介绍当摄像设备为CCD摄像头时,在WinCE 5.O/6.0操
[单片机]
<font color='red'>S3C2440</font>的camera接口特性及WinCE 下的驱动
S3C2440时钟体系结构与编程
如果cpu是计算机的大脑,电流是计算机的血液,那么时钟则是计算机的心脏,时钟频率决定了处理器运算的快慢,它的每一次“跳动”都驱动着处理器不停的执行命令。不同的是,人的各个部位心率是一样的,但计算机却有多个频率,而且每个部位可能有不同的频率,比如“大脑”有一个频率,“手“有一个频率,“脚”使用的是另外一个频率,这样就产生了两个问题:怎么产生这些不同的频率?处理器怎么与自己不同频率的外设实现交互? 怎么产生这些不同的频率? 为了获取稳定的时钟,我们一般使用外部晶振来提供,晶振是由石英和震荡电路组成的,石英能够提供稳定的频率。一般一个计算机系统最少需要一个晶振,有些特殊的外设也会有自己特有的晶振,比如网卡,显卡等,但是对于大多数连接
[单片机]
<font color='red'>S3C2440</font>时钟体系结构与编程
ARM9(S3C2440)的实时时钟(RTC)-理论知识及程序实例讲解
在一个嵌入式系统中,实时时钟单元可以提供可靠的时钟,包括时、分、秒和年、月、日。即使系统处于关机状态下,它也能够正常工作(通常采用后备电池供电,能够可靠工作十年),其外围也不需要太多的辅助电路,只需要一个高精度的晶振。 它具有以下特点: 时钟数据采用BCD编码或二进制表示; 能够对闰年的年、月、日进行自动处理; 具有告警功能,当系统处于关机状态时,能产生告警中断; 具有独立的电源输入; 提供毫秒级的时钟中断,该中断可用于嵌入式操作系统的内核时钟。 实时时钟特殊功能寄存器 实时时钟控制(RTCCON)寄存器 RTCCON 寄存器由4 位组成,如控制BCD 寄存器读/写使能的RTCEN、CLKS
[单片机]
简论Wi-Fi在EPON中的应用
  引言     将Wi—Fi无线接入与EPON系统有线接入融合起来,这极大丰富了EPON的应用范围,而且可以弥补各自技术上的不足,充分发挥光纤接入技术的高带宽与无线技术的灵活性,使得家庭和办公用户在享受高效、优质、低成本的宽带接入服务外,还能随时随地轻松实现移动办公和娱乐。但是Wi—Fi的缺点和成本等原因决定了它无法取代有线接入网而独立存在,因此将Wi—Fi无线与EPON有线融合,将是未来接入网的合理趋势。   1 系统总体结构   系统的总体结构如图1所示。它与传统的EPON系统的主要区别在于本系统在普通ONU中融合了Wi—Fi无线组网方式,同时为终端用户提供有线和无线两种方式的服务。这里将本系统命名为融合型ONU。
[单片机]
简论Wi-Fi在EPON中的应用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved