⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 ARM的计数器中断实验。是基于Keil For Arm的。
💻 C
字号:
/****************************************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通信-中断方式实验
**
*********************************************************************************************************/
#include "lpc21xx.h"

# define    UART_BPS    115200                                          /*  串口通信波特率              */

volatile    char uiGRcvNew;                                            /*  串口接收新数据的标志        */
char       uiGRcvBuf[30] = {0};                                        /*  串口接收数据缓冲区          */
int      uiGNum;                                                     /*  串口接收数据的个数          */

/*********************************************************************************************************
** Function name:		DelayNS
** Descriptions:		延时函数
** input parameters:    uiDly   值越大,延时时间越长
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void DelayNS (int uiDly)
{
    int i;
    
    for (; uiDly > 0; uiDly--){
        for(i = 0; i < 50000; i++);
    }
}

/*********************************************************************************************************
** Function name:		UART0_IRQ
** Descriptions:		串口中断服务函数
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void __irq UART0_IRQ (void)
{
    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;
   
}

/*********************************************************************************************************
** 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 (char uiDat)
{
    U0THR = uiDat;                                                      /*  写入数据                    */
    while ((U0LSR & 0x20) == 0);                                        /*  等待数据发送完毕            */
}

/*********************************************************************************************************
** Function name:		UART0SendStr
** Descriptions:		向串口发送字符串
** input parameters:    uiStr   要发送的字符串指针
**                      uiNum   要发送的数据个数
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void UART0SendStr(char const *uiStr, int uiNum)
{
    int 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 = (int)UART0_IRQ;                                   /*  设置向量地址                */
    VICIntEnable = 1 << 0x06;                                           /*  使能串口中断                */
    
    while (1){
        if (uiGRcvNew == 1){                                            /*  判断是否有新数据            */
            uiGRcvNew = 0;                                              /*  清除标志                    */
            UART0SendStr (uiGRcvBuf, uiGNum);                           /*  向串口发送数据              */
        }
    }

    return 0;
}
/*********************************************************************************************************
**                            End Of File
**********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -