interrupt_usart.c

来自「详细介绍了arm7-at91r40008,的开发全过程」· C语言 代码 · 共 285 行

C
285
字号
//*----------------------------------------------------------------------------
//*      ATMEL Microcontroller Software Support  -  ROUSSET  -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name           : interrupt_Usart.c
//* Object              : USART Interrupt Management
//*
//* 1.0 03/Jan/03 JPP   : Creation
//* 1.1 25/Jun/03 JPP   : adding  Wait for USART CLOCK ready
//*----------------------------------------------------------------------------

// Include Standard LIB  files 


#define Usart_GLOBALS
#include "../ucos_ii/includes.h"

//变量定义
INT8U	BspUsart0[BSPUSARTSIZE], BspUsart1[BSPUSARTSIZE];


extern void usart0_asm_irq_handler(void);
extern void usart1_asm_irq_handler(void);

//*----------------------------------------------------------------------------
//* Function Name       : Usart0_c_irq_handler
//* Object              : C handler interrupt function called by the interrupts 
//*                       assembling routine
//* Input Parameters    : <USART_pt> usart descriptor
//* Output Parameters   : None
//*----------------------------------------------------------------------------
void Usart0_c_irq_handler(UsartDesc *USART_pt)
{
	unsigned int status;
	unsigned int error;
	unsigned int	i, num;
	//* get Usart status register

	status = US0_CSR & US0_IMR;

	if ( status & US_ENDRX)
	{
		for (i=0; i<BSPUSARTSIZE; i++)
		{
			Usart0.Rxc_Buff[Usart0.Rxc_Wr] = BspUsart0[i];
	     	if(Usart0.Rxc_Wr<(RXC_BUFF_SIZE-1))
		    	Usart0.Rxc_Wr++;
	     	else
	    	  	Usart0.Rxc_Wr=0;
	    }
	    at91_usart_receive_frame(&USART0_DESC, (char*)BspUsart0, BSPUSARTSIZE, 9);
	}
		
	if ( status & US_TIMEOUT)
	{
		num = US0_RCR;
		num = BSPUSARTSIZE - num;
		
		for (i=0; i<num; i++)
		{
			Usart0.Rxc_Buff[Usart0.Rxc_Wr] = BspUsart0[i];
	     	if(Usart0.Rxc_Wr<(RXC_BUFF_SIZE-1))
		    	Usart0.Rxc_Wr++;
	     	else
	    	  	Usart0.Rxc_Wr=0;
	    }
	    at91_usart_receive_frame(&USART0_DESC, (char*)BspUsart0, BSPUSARTSIZE, 9);
	    //add
	}

	if ( status & US_RXRDY)
	{
     		Usart0.Rxc_Buff[Usart0.Rxc_Wr]=US0_RHR;
     		if(Usart0.Rxc_Wr<(RXC_BUFF_SIZE-1))
    	 		Usart0.Rxc_Wr++;
     		else
    	 		Usart0.Rxc_Wr=0;	//uart has received a character in UDR
	}
	
	if(Usart0.Txc_Rd != Usart0.Txc_Wr)
	{
		if( status & US_TXEMPTY)
		{
		     	US0_THR=Usart0.Txc_Buff[Usart0.Txc_Rd];//character transferred to shift register so UDR is now empty
			if(Usart0.Txc_Rd<(TXC_BUFF_SIZE-1))
		    		Usart0.Txc_Rd++;
			else
		    		Usart0.Txc_Rd=0;
		 }
	}
	else
	{
   		US0_IDR |= US_TXEMPTY;	
	}


	if ( status & US_OVRE)
	{
		error = US0_RHR;
	}

	if ( status & US_PARE) {
		error = US0_RHR;
	}

	if ( status & US_FRAME) {
		error = US0_RHR;
	}	
	US0_CR  = US_RSTSTA ;

}

//*----------------------------------------------------------------------------
//* Function Name       : Usart1_c_irq_handler
//* Object              : C handler interrupt function called by the interrupts 
//*                       assembling routine
//* Input Parameters    : <USART_pt> usart descriptor
//* Output Parameters   : None
//*----------------------------------------------------------------------------
void Usart1_c_irq_handler(UsartDesc *USART_pt)
{
	unsigned int status;
	unsigned int error;
	unsigned int	i, num;
	
	//* get Usart status register
	status = US1_CSR & US1_IMR;

	if ( status & US_ENDRX)
	{
		for (i=0; i<BSPUSARTSIZE; i++)
		{
			Usart1.Rxc_Buff[Usart1.Rxc_Wr] = BspUsart1[i];
	     	if(Usart1.Rxc_Wr<(RXC_BUFF_SIZE-1))
		    	Usart1.Rxc_Wr++;
	     	else
	    	  	Usart1.Rxc_Wr=0;
	    }
	    at91_usart_receive_frame(&USART1_DESC, (char*)BspUsart1, BSPUSARTSIZE, 9);
	}
		
	if ( status & US_TIMEOUT)
	{
		num = US1_RCR;
		num = BSPUSARTSIZE - num;
		
		for (i=0; i<num; i++)
		{
			Usart1.Rxc_Buff[Usart1.Rxc_Wr] = BspUsart1[i];
	     	if(Usart1.Rxc_Wr<(RXC_BUFF_SIZE-1))
		    	Usart1.Rxc_Wr++;
	     	else
	    	  	Usart1.Rxc_Wr=0;
	    }
	    at91_usart_receive_frame(&USART1_DESC, (char*)BspUsart1, BSPUSARTSIZE, 9);
	    //add
	}

	if ( status & US_RXRDY)
	{
     		Usart1.Rxc_Buff[Usart1.Rxc_Wr]=US1_RHR;
     		if(Usart1.Rxc_Wr<(RXC_BUFF_SIZE-1))
	    	  	Usart1.Rxc_Wr++;
     		else
    	  		Usart1.Rxc_Wr=0;
	}

	if (Usart1.Txc_Rd != Usart1.Txc_Wr)
	{
		if( status & US_TXEMPTY)
		{
		    US1_THR=Usart1.Txc_Buff[Usart1.Txc_Rd];//character transferred to shift register so UDR is now empty
			
			if(Usart1.Txc_Rd<(TXC_BUFF_SIZE-1))
		    		Usart1.Txc_Rd++;
			else
		    		Usart1.Txc_Rd=0;
		}
	}
	else
	{
   		US1_IDR |= US_TXEMPTY;
	}
		
	if ( status & US_OVRE) {

		error = US1_RHR;
	}
	if ( status & US_PARE) {
		error = US1_RHR;
	}

	if ( status & US_FRAME) {
		error = US1_RHR;
	}	

	
	US1_CR  = US_RSTSTA ;
}
//*-------------------------- External Function -------------------------------

//*----------------------------------------------------------------------------
//* Function Name       : Usart0_init
//* Object              : USART0 initialization 
//* Input Parameters    : SYNC  异步模式    同步模式
//*			: PAR   偶校验  奇校验  强制为0  强制为1 无奇偶校验 多机模式
//*			: NBSTOP  1位  1.5位  2位  保留
//*			: BAUD 波特率
//*			: 以上参数参照usart.h中定义
//*----------------------------------------------------------------------------
void Usart0_init (INT32U Mode, INT32U BAUD)
//* Begin
{
	US0_CR |= US_RXDIS + US_TXDIS;
	
 	at91_usart_open(&USART0_DESC, US_CLKS_MCK | Mode, at91_baud_com( MCK, BAUD), 0) ;
 	
 	US0_IDR = 0x3ff ;
 	  // Wait for USART CLOCK ready 
 	while ( !(US0_CSR & US_TXRDY ));

 	at91_irq_open(USART0_DESC.periph_id, USART0_INTERRUPT_LEVEL, AIC_SRCTYPE_INT_LEVEL_SENSITIVE, usart0_asm_irq_handler) ;

//	US0_IER = US_RXRDY | US_OVRE | US_PARE | US_FRAME ;
	at91_usart_receive_frame(&USART0_DESC, (char*)BspUsart0, BSPUSARTSIZE, 9);
	UsartOpen (PORT1);

}
//*----------------------------------------------------------------------------
//* Function Name       : Usart1_init
//* Object              : USART1 initialization 
//* Input Parameters    : SYNC  异步模式    同步模式
//*			: PAR   偶校验  奇校验  强制为0  强制为1 无奇偶校验 多机模式
//*			: NBSTOP  1位  1.5位  2位  保留
//*			: BAUD 波特率
//*			: 以上参数参照usart.h中定义
//*----------------------------------------------------------------------------
void Usart1_init(INT32U Mode, INT32U BAUD)
{ 	
 	US1_CR |= US_RXDIS + US_TXDIS;
 	
 	at91_usart_open(&USART1_DESC, US_CLKS_MCK | Mode, at91_baud_com( MCK, BAUD), 0) ;
 	
 	US1_IDR = 0x3ff ;
 	
 	while ( !(US1_CSR & US_TXRDY ));
 	
 	at91_irq_open(USART1_DESC.periph_id, USART1_INTERRUPT_LEVEL, AIC_SRCTYPE_INT_LEVEL_SENSITIVE, usart1_asm_irq_handler) ;
 	
// 	US1_IER = US_RXRDY | US_OVRE | US_PARE | US_FRAME  ; 	//20050816

	at91_usart_receive_frame(&USART1_DESC, (char*)BspUsart1, BSPUSARTSIZE, 9);
	UsartOpen (PORT2);
}


void UsartOpen(INT16U Port)
{
	if (Port == PORT1)
	{
		US0_IER = US_ENDRX | US_OVRE | US_PARE | US_FRAME | US_TIMEOUT;
	}
	else
	{
		US1_IER = US_ENDRX | US_OVRE | US_PARE | US_FRAME | US_TIMEOUT;
	}	
}

void UsartClose(INT16U Port)
{
	if (Port == PORT1)
	{
		US0_IDR = US_ENDRX | US_OVRE | US_PARE | US_FRAME | US_TIMEOUT;
	}
	else
	{
		US1_IDR = US_ENDRX | US_OVRE | US_PARE | US_FRAME | US_TIMEOUT;
	}	
	
} 

⌨️ 快捷键说明

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