FL2440 UART的用法

发布者:JoyfulLife最新更新时间:2016-08-14 来源: eefocus关键字:FL2440  UART 手机看文章 扫描二维码
随时随地手机看文章
UART原理说明:

    通用异步收发器简称UART,即“Universal Asynchronous Receiver Transmitter”,它用来传输串行数据:发送数据时,CPU将并行数据写入UART,UART按照一定格式在一根电线上串行发出;接收数据时,UART检测另一根电线上的信号,将串行数据放在缓冲区中,CPU即可读取UART获得的数据。UART之间以全双工方式传输数据,最精简的连线方式只有三根电线:TxD用于发送数据,RxD用于接收数据,Gnd用于给双方提供参考电平。连线如下图所示:

FL2440 UART的用法 - 成 - 学海泛舟
    为了增强数据的抗干扰能力、提高数据传输长度,通常将TTL/CMOS逻辑电平转换为RS-232逻辑电平,3~12V表示0,-3~ -12V表示1。S3C2440有3个独立的UART通道,每个通道都可以工作于中断、查询或者DMA模式。
 
S3C2440UART的使用:
    UART使用之前需要设置波特率、数据传输格式,配置相关管脚为UART功能,选择工作模式是中断、查询还是DMA.。另外,S3C2440中每个UART都有一个深度为64字节的接收FIFO和发送FIFO。我们采用的配置方式不使用FIFO模式。
 
1. 将涉及的UART通道管脚设为UART功能
    比如,UART通道0中,GPH2、GPH3分别用作TXD0、RXD0,即要使用UART通道0时,必须先将GPHCON寄存器中GPH2/3配置为TXD0/RXD0。
2. UBRDIVn寄存器:设置波特率
     S3C2440的时钟源有PCLK 、UEXTCLK、FCLK/n,其中n值是通过UCON0~UCON2联合设置。
根据给定的波特率、所选择的时钟源频率,可以通过以下公式计算UBRDIVn寄存器。
UBRDIVn=(int)(UART CLOCK /(BUAD RATE * 16)) - 1
时钟源选择PCLK为50MHz,波特率设置为115200赫兹,所以计算出的值为26.13,取整之后为26,即把26存到寄存器UBRDIV0即可。
3. ULCONn:设置传输格式
   设置数据宽度、停止位宽度、检验模式、红外模式。
FL2440 UART的用法 - 成 - 学海泛舟
4. UCONn寄存器
通过该寄存器来设置S3C2440中UART的接收模式、发送模式、接收中断方式、发送中断方式、时钟选择、FCLK分频系数(FCLK/n中n的值)等等。
5. UTRSTATn寄存器
    UTRSTATn寄存器用来表明数据是否发送完毕,是否已经接受到数据。第0位可以用来判断接受缓存器内是否有可接收的数据,接收到数据自动设置为1;第1位和第2位可以用来判断发送缓存器中是否为空,为空时可以发送数据。寄存器格式如下:
FL2440 UART的用法 - 成 - 学海泛舟
 
      接收到的数据是放到接收缓存器URXHn中,要发送数据时,是把数据放入发送缓存器UTXHn中。由于UART是通过字节方式传输数据的,因此要区分是大端模式还是小端模式,也就是说这两个寄存器在这两种模式下,所在的地址是不同。
 
现在来看一段代码,这段代码采用的查询的方式来使用UART的。每次完成一个字节的传输。

#include "2440addr.h"

 

void Main(void)

{

  char ch;

  rGPBCON = 0x155551;

  rGPBUP  = 0x7ff;

  rGPBDAT = 0x560;

   

  rGPHCON = 0x00faaa;                /*使用UART0功能      0000 0000 1111 1010 1010 1010 管脚使能*/

  rGPHUP  = 0x7ff;

 

  rULCON0 = 0x3;                        /*设置UART0无奇偶校验,一位停止位,8位数据     设定数据传输格式*/

  rUCON0 = 0x245;                /*PCLK为时钟源,接收和发送数据为查询或中断方式[4]没有break信号[7]禁止fifo*/

  rUFCON0 = 0;                    

  rUMCON0 = 0;                   

  rUBRDIV0 = 26;                 /*设置波特率,PCLK为50MHz,波特率为115.2kHz*/

   

  while(!(rUTRSTAT0 & 0x2));       /*等待并判断发送缓存是否为空*/

  rUTXH0 = 0xaa;                         /*是空,则发送0xAA字节*/

 

while(1)

{

        while(!(rUTRSTAT0 & 0x1)); /*等待并判断接收缓存是否准备好*/

     ch = rURXH0;                     /*接收一个字节数据*/

        while(!(rUTRSTAT0 & 0x2));      /*等待并判断发送缓存是否为空*/

        rUTXH0 = ch;                     /*发送一个字节数据*/

 

 switch(ch)             /*根据所接收数据的不同,执行不同的程序*/

    {

       case 0x11:              /*灭LED*/

                rGPBDAT |= 0x560;
     break;

       case 0x22:             /*亮LED*/

     rGPBDAT &= 0x1f;
     break;

       case 0x33:             /*蜂鸣器不响*/

                rGPBDAT &= 0x560;
     break;

       case 0x44:             /*蜂鸣器响*/

                rGPBDAT |= 0x1;
     break;
   default:                 /*LED灭,蜂鸣器不响*/

                rGPBDAT = 0x560;
     break;

 }

}

}

中断处理方式,UART有子中断,要注意子中断屏蔽的打开,由于UART中断涉及到SUBSRCPND寄存器,因此在中断处理程序中不仅要清SRCPND寄存器,还要清SUBSRCPND寄存器,它们的顺序一定是先清SUBSRCPND寄存器,再清SRCPND寄存器,否则就会引起一个中断两次响应的问题。因为是否中断由SRCPND寄存器决定,而SRCPND寄存器的相关状态位由SUBSRCPND寄存器决定,如果先清SRCPND寄存器,而还没有清SUBSRCPND寄存器的话,SRCPND寄存器的相关位还是会被置1,而一旦被置1,则一定还会引起中断。
 

#include "2440addr.h"

#define U32 unsigned int

void __irq uartISP(void)

{

       char ch;

      

       rSUBSRCPND |= 0x3;

       rSRCPND = 0x1<<28;

       rINTPND = 0x1<<28;

      

       if(rUTRSTAT0 & 1)             /*接收数据处理部分*/

       {

              ch = rURXH0;                     /*接收字节数据*/

              if(ch==0x55)

                     rGPBDAT = ~0x60;       /*亮两个LED,蜂鸣器响*/

              else

                     rUTXH0 = ch;                     /*发送字节数据*/

       }

       else               /*发送数据处理部分*/

       {

              rGPBDAT = ~0x561;            /*亮4个LED*/

       }    

}

 

void Main(void)

{

      

  rGPBCON = 0x155555;

  rGPBUP  = 0x7ff;

  rGPBDAT = 0x560;

   

  rGPHCON = 0x00faaa;

  rGPHUP  = 0x7ff;

   

  rULCON0 = 0x3;

  rUCON0 = 0x5;

  rUFCON0 = 0;

  rUMCON0 = 0;

  rUBRDIV0 = 26;

   

  rSRCPND = 0x1<<28;

  rSUBSRCPND = 0x3;

  rINTPND = 0x1<<28;

  rINTSUBMSK = ~(0x3);             /*打开UART0发送和接收中断屏蔽*/

  rINTMSK = ~(0x1<<28);            /*打开UART0中断屏蔽*/

           

  pISR_UART0 = (U32)uartISP;

       

 while(1)

  {

  }

}

在"2440addr.h"里面的关于rUTXH0/rURXH0的定义。arm指令默认小端模式初始化,所以地址是这个。

FL2440 UART的用法 - 成 - 学海泛舟
 
 

关键字:FL2440  UART 引用地址:FL2440 UART的用法

上一篇:S3C2440的LCD简单应用与实现
下一篇:系统时钟和定时器——看门狗定时器

推荐阅读最新更新时间:2024-03-16 15:04

新型多总线UART芯片在嵌入式系统设计中的应用
UART产生于上个世纪70年代,是第一块大规模集成电路。1981年的推出的IBM PC采用了8250 UART与外设进行数据通信,直到上个世纪末,UART一直是PC中最主要的串行通信接口。随着高速串行总线USB的出现,USB以其诸多的优点取代了UART成为个人电脑中应用最广泛的串行接口。 而在嵌入式领域,由于UART具有操作简单、工作可靠、抗干扰强、传输距离远(组成485网络可以传输1,200米以上),设计人员普遍认为UART是从CPU或微控制器向系统的其他部分传输数据的最佳方式,因此它们被大量地应用在工业、通信和家电控制等嵌入式领域。通常MCU/CPU都会自带一个UART串口,但实际应用中一个串口往往不够用,需要进行UART串
[应用]
51单片机串口通信(UART)
项目描述: 1.串口工作方式为1(8位UART,波特率可变),无校验位; 2.通信数据格式为:1位起始位 + 8位数据位 + 1位停止位; 3.上电后MCU给上位机发送问候语,之后等待上位机的信息;MCU和上位机的通信为收发交替进行。MCU接收到的信息会实时的显示在LCD上。上位机接收到的信息会在串口助手上显示。 C语言程序如下: /*----------------------- FileName: UART.h Function: 头文件 Author: Zhang Kaizhou Date: 2019-6-10 11:33:35 ------------------------*/ #include reg52.h
[单片机]
51单片机串口通信(<font color='red'>UART</font>)
PIC读书笔记5:串行通信接口SPI、I2C、UART
1:同步串行接口I2C与SPI接线方式: 1.1: SPI的一些注意事项 2:同步串行接口I2C与SPI连接多个设备及其区别: 3:异步串行接口UART 当与windows终端通信时,硬件握手尤其必要,因为windows是一个多任务操作系统,应用程序有事会遇到导致数据丢失的长延时。 4:异步通信与同步串行通信外设比较
[单片机]
PIC读书笔记5:串行通信接口SPI、I2C、<font color='red'>UART</font>
UART0串口编程系列(二)
三. 中断方式的串口编程 1.用中断方式编写串口程序由那几部分组成 2.硬件上的支持 1 UART0 发送FIFO缓冲区 A. UART0含有1个16字节的发送FIFO缓冲区 B. U0THR是UART0发送FIFO的最高字节 C. UART的发送FIFO是一直使能的 2 UART0接收FIFO缓冲区 A. UART0含有一个16字节的接收FIFO缓冲区。 B. 软件设置接收FIFO缓冲区的触发字节。 3 中断接口:UART0的中断接口包含中断使能寄存器(U0IER)和中断标识寄存器(U0IIR)。 l U0IIR:提供状态码用于指示一个挂起中断的中断源和优先级。 l U0IER可
[单片机]
<font color='red'>UART</font>0串口编程系列(二)
#51单片机# UART串口通信的基本应用、模块介绍和串口程序
UART串口通信的基本应用 通信的三种基本类型: 单工通信:值允许一方向另一方传送星系,另一方不能回传信息。例:电视遥控器、收音机广播 半双工通信:数据可在双方之间相互传播,但同一时刻只能一方传给另一方。例:对讲机 全双工通信:发送数据的同时也可接收数据,两者同步进行。例:电话 UART模块介绍 通常情况下,我们关心的是通信的结果而非过程。51单片机内部存在UART模块,可自动接收数据,接收完毕,会发出通知信号。要使用这个模块,需要配置对应的具有特殊功能的寄存器。 51单片机的UART串口结构由串行口控制寄存器SCON、发送和接收电路三部分构成。 先来了解串口控制寄存器SCON SCON——串行控制寄存
[单片机]
#51单片机# <font color='red'>UART</font>串口通信的基本应用、模块介绍和串口程序
stm8s开发(三) UART的使用:串口通信!
串口通信是单片机学习的一个最基本、最重要的功能之一。串口通信可以间接的当做调试接口使用,实现单片机与电脑之间的通信。当然可以与一些模块(比如蓝牙、wifi)通信,也可以作为和其他单片机通信的工具。 STM8S的通用异步收发器(UART)主要特性: ● 全双工的,异步通信 ● 可编程数据字长度(8位或9位) ● 可配置的停止位-支持1或2个停止位 一般的,我们使用串口通信主要是关心几点参数:波特率、停止位、奇偶校验位。 其次就是如何发送、如何接收数据,这里介绍的使用阻塞式发送数据、中断方式接收数据。 以下代码是初始化串口,参数为:115200 1停止位 无校验位 void Init_UART1(void)
[单片机]
stm8s开发(三) <font color='red'>UART</font>的使用:串口通信!
STM32自打包的UART串口通讯编程方法
在对通讯时间要求比较高的时候,就需要自己对UART的通讯底层直接进行操作。我以STM32单片机为例,讲一下比较快速的UART编程方法。——其实不止是STM32这么处理,我以前使用过51的单片机,TI的MSP单片机,三菱的16位单片机,都可以采用这种方法。 基本的处理思路如下: 1. UART接收的处理方法 打开UART的接收中断,每收到一个字节就放到接收缓冲区,同时更新接收指针。当连续100ms没有收到接收字符,则认为本次帧接收完毕,置位帧接收完成标志,由主程序进行处理。 2. UART发送的处理方法 将需要发送的数据放到发送缓冲区,设置发送长度。然后发送第一个字节,并打开发送中
[单片机]
集成UART核心的FPGA异步串行实现
    串行外设都会用到RS232-C异步串行接口,传统上采用专用的集成电路即UART实现,如TI、EXAR、EPIC的550、452等系列,但是我们一般不需要使用完整的UART的功能,而且对于多串口的设备或需要加密通讯的场合使用UART也不是最合适的。如果设计上用到了FPGA/CPLD器件,那么就可以将所需要的UART功能集成到FPGA内部,本人最近在用XILINX的XCS30做一个设计的时候,就使用VHDL将UADT的核心功能集成了,从而使整个设计更加紧凑,更小巧、稳定、可靠,下面就谈谈设计方法。   分析UART的结构,可以看出UART主要由数据总线接口、控制逻辑和状态接口、波特率发生器、发送和接受等部分组成,各部分间关
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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