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

📄 interrupt_usart.c

📁 IAR EWARM嵌入式系统编程与实践光盘源码
💻 C
字号:
//* File Name           : interrupt_Usart.c

#include "Board.h"
#include "cdc_enumerate.h"

#define USART_INTERRUPT_LEVEL		1

AT91PS_USART COM0;
#define USART_BAUD_RATE 		115200

extern struct _AT91S_CDC 	pCDC;
static char buff_rx[100];
static char buff_rx1[100];
unsigned int first =0;

/*******************************************************************************
 * 说明:Trace_Toggel_LED函数,点亮或熄灭LED
 * 参数:unsigned int Led
 * 返回值:无
*******************************************************************************/
void Trace_Toggel_LED (unsigned int Led) {
    if ( (AT91F_PIO_GetInput(AT91C_BASE_PIOA) & Led ) == Led ) {
        AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, Led );
    }
    else {
        AT91F_PIO_SetOutput( AT91C_BASE_PIOA, Led );
    }
}
/*******************************************************************************
 * 说明:Usart_c_irq_handler函数,中断句柄
 * 参数:无
 * 返回值:无
*******************************************************************************/
void Usart_c_irq_handler(void) {
	AT91PS_USART USART_pt = COM0;
	unsigned int status;
	status = USART_pt->US_CSR ;                  // 读取UART状态寄存器,激活中断
        status &= USART_pt->US_IMR;

	if ( status & AT91C_US_RXBUFF) {
 	Trace_Toggel_LED( LED3) ;                    // 点亮或熄灭LED
	 if ( first == 0){                           // 将字符串送到UART
 	     COM0->US_RPR = (unsigned int) buff_rx1;
	     COM0->US_RCR = 100;
 	     pCDC.Write(&pCDC, buff_rx,100);
 	     first =1;
	   }else{
	     COM0->US_RPR = (unsigned int) buff_rx;
	     COM0->US_RCR = 100;
	     pCDC.Write(&pCDC, buff_rx1,100);
	     first=0;
	   }
	}

	if ( status & AT91C_US_TIMEOUT){            // 检测错误
	 Trace_Toggel_LED( LED4) ;
	 status = 100 - COM0->US_RCR;
	 if  (status !=0){
 	   if ( first == 0){
		COM0->US_RPR = (unsigned int) buff_rx1;
		COM0->US_RCR = 100;
 	        pCDC.Write(&pCDC, buff_rx,status);
 	        first =1;
	   }else{
	        COM0->US_RPR = (unsigned int) buff_rx;
	        COM0->US_RCR = 100;
	        pCDC.Write(&pCDC, buff_rx1,status);
	        first=0;
	    }
            COM0->US_CR = AT91C_US_STTTO;
          }
	}
	 USART_pt->US_CR = AT91C_US_RSTSTA;          // 复位状态位
}

/*******************************************************************************
 * 说明:AT91F_US_Printk函数,通过UART发送一个字符串
 * 参数:char *buffer(参数为指向以\0结束的字符串)
 * 返回值:无
*******************************************************************************/
void AT91F_US_Put( char *buffer) {
	while(*buffer != '\0') {
		while (!AT91F_US_TxReady(COM0));
		AT91F_US_PutChar(COM0, *buffer++);
	}
}

/*******************************************************************************
 * 说明:Usart_init函数,UART0初始化
 * 参数:无
 * 返回值:无
*******************************************************************************/
void Usart_init ( void ) {
    COM0= AT91C_BASE_US0;
    AT91F_PIO_CfgPeriph(                       // 配置PIO控制器,定义RXD,TXD引脚
	 AT91C_BASE_PIOA,                      // PIO 控制器基地址
	 ((unsigned int) AT91C_PA5_RXD0    ) | // PA5->RXD0
	 ((unsigned int) AT91C_PA6_TXD0    ) , // PA6->TXD0
	 0 );
    AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<<AT91C_ID_US0 ) ;       // 允许PIOA时钟频率
    AT91F_US_Configure (COM0, MCK,AT91C_US_ASYNC_MODE,USART_BAUD_RATE , 0); // 配置UART
    COM0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;                            // 允许UART

    AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, AT91C_ID_US0, USART_INTERRUPT_LEVEL,    // UART0 开中断
                           AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, Usart_c_irq_handler);
    AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0);

    AT91F_PDC_Open (AT91C_BASE_PDC_US0);       // 设置PDC
    COM0->US_RPR = (unsigned int) buff_rx;
    COM0->US_RCR = 100;
    first = 0;
    COM0->US_RTOR = 10;
    AT91F_US_EnableIt(COM0,AT91C_US_RXBUFF | AT91C_US_TIMEOUT );
}

⌨️ 快捷键说明

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