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

 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值