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;
}
/**************************************************************************************************************************
* 文件名: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;
}
相关文章推荐
- UART通信程序-中断方式
- 精读OSAL --中断方式串行通信(_hal_uart_isr.c)
- UART0串口编程(三):中断方式的串口编程;用中断编写发送函数
- TQ2440开发板学习纪实(7)--- 基于中断的UART串口接收
- 61A与PC的RS232通信,接收以中断方式
- AIDL 跨进程通信方式,的基本使用和源码理解
- UART0串口编程系列 串口编程(UART0)之中断方式(一)
- php和javascript的get和post方式 有人串口转wifi模块httpdclient网页交互通信成功源码2 wifi继电器小黄人软件ypnr
- K7i ARM开发板源码之数码管显示
- 61A与PC的RS232通信,接收以中断方式
- STM32cube HAL库 UART串口中断方式收发任意长度 调试笔记
- Zstack之uart中断方式数据发送
- 使用Handler子线程向主线程通信方式及源码解析
- K7i ARM开发板源码之流水灯
- 串口通信校验方式(even,odd,space,mark)UART数据波形分析
- 串口中断方式通信(非类库)
- 串口通信的三种方式(查询、中断、DMA) 之dma
- Android中子线程和UI线程之间通信的方式(Handler与Thread-附源码)
- TQ2440-UART(查询及中断方式)
- K7i ARM开发板源码之定时器篇