您的位置:首页 > 其它

K7i ARM开发板源码之UART通信(中断方式)

2009-05-06 16:29 246 查看
 K7i ARM开发板源码之UART通信(中断方式)
 

/**************************************************************************************************************************
* 文件名:main.c
* 功  能:UART通信(中断方式) 通过超级终端向开发板发送数据,开发板接收数据后再发给电脑.

* 作  者:李园

* 日  期:2008年5月16号

* 博 客:blog.csdn.net/liyuanempire

*************************************************************************************************************************/

#include "config.h"

typedef struct UartMode
{
 uint8 datab;
 uint8 stopb;
 uint8 parity;
}UARTMODE;

uint8 rcv_buf[8];
volatile uint8 rcv_new;

void __irq IRQ_UART0(void)
{
 uint8 i;
 if((U0IIR&0x0F)==0x04)
  rcv_new=1;
 for(i=0;i<8;i++)
 {
  rcv_buf[i]=U0RBR;
 }
 VICVectAddr=0x00;
}

void UART0_SendByte(uint8 dat)
{
 U0THR=dat;
}

void UART0_SendBuf(void)
{
 uint8 i;
 for(i=0;i<8;i++)
  UART0_SendByte(rcv_buf[i]);
 while ((U0LSR&0x20)==0);
}

int8 UART0_Init(uint32 baud,UARTMODE set)
{
 uint32 bak;
 
 if((baud==0)||(baud>115200)) return(0);
 if((set.datab<5)||(set.datab>8)) return(0);
 if((set.stopb==0)||(set.stopb>2)) return(0);
 if(set.parity>4) return(0);
 
 U0LCR=0x80;
 bak=(Fpclk>>4)/baud;
 U0DLM=bak>>8;
 U0DLL=bak&0xFF;
 
 bak=set.datab-5;
 if(set.stopb==2) bak|=0x04;
 
 if(set.parity!=0)
 {
  set.parity=set.parity-1;
  bak|=0x08;
 }
 bak|=set.parity<<4;
 U0LCR=bak;
 return(1);
}
 
 
int main (void)
{
  
    UARTMODE set;
   
    set.datab=8;
    set.stopb=1;
    set.parity=0;
   
    rcv_new=0;
   
    PINSEL0=0x00000005;
   
    UART0_Init(9600,set);
    U0FCR=0x81;
    U0IER=0x01;
   
    IRQEnable();
    VICIntSelect=0x00000000;
    VICVectCntl0=0x20|0x06;
    VICVectAddr0=(uint32)IRQ_UART0;
    VICIntEnable=1<<0x06;
   
    while(1)
    {
     if(rcv_new==1)
     {
      rcv_new=0;
      UART0_SendBuf();
     }
    }
     
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struct dll 终端