/****************************************Copyright (c)********************************************************************** ** Guangzou ZLG-MCU Development Co.,LTD. ** graduate school ** http://www.zlgmcu.com ** **--------------File Info----------------------------------------------------------------------------------- ** File name : main.c ** Last modified Date : 2004-09-16 ** Last Version : 1.0 ** Descriptions : The main() function example template ** **--------------------------------------------------------------------------------------------------------- ** Created by : Chen Mingji ** Created date : 2004-09-16 ** Version : 1.0 ** Descriptions : The original version ** **--------------------------------------------------------------------------------------------------------- ** Modified by : Li Baihua ** Modified date : 2008-04-03 ** Version : 1.1 ** Descriptions : 串口0通信-中断方式实验 ** **--------------------------------------------------------------------------------------------------------- ** Modified by : yuanguiyou ** Modified date : 2008-05-11 ** Version : 1.2 ** Descriptions : change the ADS1.2 project to GNU ARM project ** ***************************************************************************************************************************/ #include "config.h" # define UART_BPS 115200 /* 串口通信波特率 */ volatile uint8 uiGRcvNew; /* 串口接收新数据的标志 */ uint8 uiGRcvBuf[30] = {0}; /* 串口接收数据缓冲区 */ uint32 uiGNum; /* 串口接收数据的个数 */ void UART0_IRQ (void) __attribute__((naked)); /**************************************************************************************************************************** ** Function name : DelayNS ** Descriptions : 延时函数 ** input parameters : uiDly 值越大,延时时间越长 ** output parameters : 无 ** Returned value : 无 ***************************************************************************************************************************/ void DelayNS (uint32 uiDly) { uint32 i; for (; uiDly > 0; uiDly--){ for(i = 0; i < 50000; i++); } } /**************************************************************************************************************************** ** Function name : UART0_IRQ ** Descriptions : 串口中断服务函数 ** input parameters : 无 ** output parameters : 无 ** Returned value : 无 ***************************************************************************************************************************/ void UART0_IRQ (void) { ISR_ENTRY(); uiGNum = 0; while ((U0IIR & 0x01) == 0){ /* 判断是否有中断挂起 */ switch (U0IIR & 0x0E){ /* 判断中断标志 */ case 0x04: /* 接收数据中断 */ uiGRcvNew = 1; /* 置接收新数据标志 */ for (uiGNum = 0; uiGNum < 8; uiGNum++){ /* 连续接收8个字节 */ uiGRcvBuf[uiGNum] = U0RBR; } break; case 0x0C: /* 字符超时中断 */ uiGRcvNew = 1; while ((U0LSR & 0x01) == 0x01){ /* 判断数据是否接收完毕 */ uiGRcvBuf[uiGNum] = U0RBR; uiGNum++; } break; default: break; } } VICVectAddr = 0x00; ISR_EXIT(); } /**************************************************************************************************************************** ** Function name : UARTInit ** Descriptions : 串口初始化,设置为8位数据位,1位停止位,无奇偶校验,波特率为115200 ** input parameters : uiDly 值越大,延时时间越长 ** output parameters : 无 ** Returned value : 无 ***************************************************************************************************************************/ void UARTInit (void) { uint16 uiFdiv; U0LCR = 0x83; /* 允许设置波特率 */ uiFdiv = (Fpclk / 16) / UART_BPS; /* 设置波特率 */ U0DLM = uiFdiv / 256; U0DLL = uiFdiv % 256; U0LCR = 0x03; /* 锁定波特率 */ } /**************************************************************************************************************************** ** Function name : UART0SendByte ** Descriptions : 向串口发送子节数据,并等待数据发送完成,使用查询方式 ** input parameters : uiDat 要发送的数据 ** output parameters : 无 ** Returned value : 无 ***************************************************************************************************************************/ void UART0SendByte (uint8 uiDat) { U0THR = uiDat; /* 写入数据 */ while ((U0LSR & 0x20) == 0); /* 等待数据发送完毕 */ } /**************************************************************************************************************************** ** Function name : UART0SendStr ** Descriptions : 向串口发送字符串 ** input parameters : uiStr 要发送的字符串指针 ** uiNum 要发送的数据个数 ** output parameters : 无 ** Returned value : 无 ***************************************************************************************************************************/ void UART0SendStr(uint8 const *uiStr, uint32 uiNum) { uint32 i; for (i = 0; i < uiNum; i++){ /* 发送指定个字节数据 */ UART0SendByte (*uiStr++); } } /**************************************************************************************************************************** ** Function name : main ** Descriptions : 跳线JP6短接,打开串口调试软件,串口0中断方式通信 ** input parameters : 无 ** output parameters : 无 ** Returned value : 无 ***************************************************************************************************************************/ int main (void) { PINSEL0 = PINSEL0 & (~0x0F); PINSEL0 = PINSEL0 | 0x05; /* 设置I/O连接到UART */ uiGRcvNew = 0; UARTInit (); /* 串口初始化 */ U0FCR = 0x81; /* 使能FIFO,8个字节触发 */ U0IER = 0x01; /* 使能接收中断 */ IRQEnable (); VICIntSelect = 0x00000000; /* 设置所有中断为向量中断 */ VICVectCntl0 = 0x20 | 0x06; /* 设置串口中断为最高优先级 */ VICVectAddr0 = (uint32)UART0_IRQ; /* 设置向量地址 */ VICIntEnable = 1 << 0x06; /* 使能串口中断 */ while (1){ if (uiGRcvNew == 1){ /* 判断是否有新数据 */ uiGRcvNew = 0; /* 清除标志 */ UART0SendStr (uiGRcvBuf, uiGNum); /* 向串口发送数据 */ } } return 0; } /**************************************************************************************************************************** ** End Of File ***************************************************************************************************************************/