mini2440 UART查询和中断方式

本文介绍了一种基于S3C2440处理器的串口通信配置方法,包括初始化设置、发送与接收数据的过程,并提供了查询与中断两种工作模式的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、初始化:

a、把使用到的引脚GPH2、GPH3定义为TXD0、RXD0:

GPHCON |= 0xa0

GPHUP |= 0xf0(禁止上拉)

b.ULCON0 ( UART channel 0 line control register ):设为0x03

此值含义为:8个数据位,1个停止位,无校验,正常操作模式(与之相对的是Infra-Red Mode,此模式表示0、1的方式比较特殊)。

c.UCON0 (UART channel 0 control register ):设为0x5

除了位[3:0],其他位都使用默认值。位[3:0]=0b0101表示:发送、接收都使用“中断或查询方式”——本实验使用查询查询方式。

d.UFCON0 (UART channel 0 FIFO control register ):设为0x00

每个UART内部都有一个16字节的发送FIFO和接收FIFO,但是本实验不使用FIFO,设为默认值0

e.UMCON0 (UART channel 0 Modem control register ):设为0x00

本实验不使用流控,设为默认值0

f.UBRDIV0 ( R/W Baud rate divisior register 0 ):设为26

本实验未使用PLL, PCLK=50MHz,设置波特率为115200,则由公式

UBRDIVn = (int)(PCLK / (bps x 16) ) –1

可以计算得UBRDIV0 =26,请使用S3C2440数据手册第314页的误差公式验算一下此波特率是否在可容忍的误差范围之内,如果不在,则需要更换另一个波特率。

2、发送数据:

a.UTRSTAT0 ( UART channel 0 Tx/Rx status register ):

位[2]:无数据发送时,自动设为1。当我们要使用串口发送数据时,先读此位以判断是否有数据正在占用发送口。

位[1]:发送FIFO是否为空,本实验未用此位

位[0]:接收缓冲区是否有数据,若有,此位设为1。本实验中,需要不断查询此位一判断是否有数据已经被接收,中断模式下等待中断触发。

b.UTXH0 (UART channel 0 transmit buffer register ):把要发送的数据写入此寄存器。

3、接收数据:

a.UTRSTAT0:如同上述“2、发送数据”所列,我们用到位[0]

b.URXH0 (UART channel 0 receive buffer register ):

当查询到UTRSTAT0 位[0]=1时,读此寄存器获得串口接收到的数据。

 

#define    GLOBAL_CLK              1

#include <stdlib.h>

#include <string.h>

#include "def.h"

#include "option.h"

#include "2440addr.h"

#include "2440lib.h"

#include "2440slib.h"

#include "mmu.h"

#include "profile.h"

#include "memtest.h"

 

 

#define LED1_ON   ~(1<<5)

 

#define LED1_OFF   (1<<5)

 

void delay(int times)//延时函数

{

    int i;

    for(;times>0;times--)

      for(i=0;i<400;i++);

}

 

void Led_port_init(void)

{

  

   rGPBCON &= ~(3<<10);

  

   rGPBCON |= (1<<10);

  

}

 

 

void beep_init(void)//蜂鸣器初始化

{

   rGPBCON =1<<0;// 设置GPB0为输出端口

   rGPBUP=1<<0;//禁止GPB0上拉功能

}

 

void beep(void)

   

    rGPBDAT =0x1;//蜂鸣器响

    delay(3000);

    rGPBDAT=0x0;//蜂鸣器不响

    delay(3000);

   

 

void Uart0_init(void)

{

      

       rGPHCON = 0xa0; //设置GPH2、GPH3为TXD0(发送),RXD0(接收)

 

       rGPHUP  = 0xf0;//禁止GPH2、GPH3上拉功能

 

      rULCON0 = 0x3; //设置UART0无奇偶校验,一位停止位,8位数据

 

       rUCON0 = 0x5; //PCLK为时钟源,接收和发送数据为查询或中断方式

 

       rUFCON0 = 0; //不使用FIFO

 

       rUMCON0 = 0; //不使用流控制

 

       rUBRDIV0 = 26; //((UART_CLK/(波特率*16))-1)设置波特率,PCLK为50MHz,波特率为115.2kHz

}

 

void Main(void)

    char ch;

   

       beep_init();//初始化蜂鸣器

   

       Led_port_init();//初始化中断

      

       Uart0_init();//UART0初始化

 

 

while(1)

 

{

 

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

 

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

 

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

 

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

 

 

 

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

 

              {

 

                       case 0x1:  rGPBDAT = rGPBDAT|(LED1_OFF);   break; //灭LED

 

                   case 0x2:  rGPBDAT = rGPBDAT&(LED1_ON);     break; //亮LED            

 

                    case 0x3:  beep();                         break; //蜂鸣器响一声

                  

              }

}

}

 

以下为中断方式:

#define GLOBAL_CLK  1
#include <stdlib.h>
#include <string.h>
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"


#define LED1_ON   ~(1<<5)

#define LED1_OFF   (1<<5)

void delay(int times)//延时函数
{
    int i;
    for(;times>0;times--)
      for(i=0;i<400;i++);
}

void Led_port_init(void)//设置GPB5为输出端口
{
  
   rGPBCON &= ~(3<<10);
  
   rGPBCON |= (1<<10);
  
}


void beep_init(void)//蜂鸣器初始化
{
   rGPBCON =1<<0;// 设置GPB0为输出端口
   rGPBUP=1<<0;//禁止GPB0上拉功能
}

void beep(void)

    rGPBDAT =0x1;//蜂鸣器响
    delay(3000);
    rGPBDAT=0x0;//蜂鸣器不响
    delay(3000);

void Uart0_init(void)
{
 
 rGPHCON = 0xa0; //设置GPH2、GPH3为TXD0(发送),RXD0(接收)

 rGPHUP  = 0xf0;//禁止GPH2、GPH3上拉功能

  rULCON0 = 0x3; //设置UART0无奇偶校验,一位停止位,8位数据

 rUCON0 = 0x5; //PCLK为时钟源,接收和发送数据为中断方式

 rUFCON0 = 0; //不使用FIFO

 rUMCON0 = 0; //不使用流控制

 rUBRDIV0 = 26; //((UART_CLK/(波特率*16))-1)设置波特率,PCLK为50MHz,波特率为115.2kHz
}

void inte_init()
{

       rSRCPND |= (0x1<<28);//清除UART中断状态寄存器

       rSUBSRCPND |= 0x3;//清除UART0中断状态寄存器
     
       rINTPND |= (0x1<<28);//清除总中断状态寄存器 
      
       rINTSUBMSK &=~(0x3);             //打开UART0发送和接收中断屏蔽

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

}

void __irq uartISP(void)//中断处理函数

{

       char ch;

       rSUBSRCPND |= 0x3;//清除UART0中断状态寄存器

       rSRCPND |= (0x1<<28);//清除UART中断状态寄存器

       rINTPND |= (0x1<<28);//清除总中断状态寄存器


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

       {

              ch = rURXH0;                     //接收字节数据
             
              beep();

              if(ch==0x55)

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

       }

       else               //发送数据处理部分

       {

             

       }    
}
      


void Main(void)//主函数

 MMU_Init();//内存初始化
   
 beep_init();//初始化蜂鸣器
   
 Led_port_init();//初始化中断
 
 Uart0_init();//UART0初始化

 inte_init();

 pISR_UART0 = (U32)uartISP;//中断处理函数传递给中断向量表

 while(1);//死循环等待中断发生

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值