|
Hi, I am facing an issue in handling the usart interrupt. I am using two interrupts, external interrupt IRQ0 and usart receive interrupt.For testing purpose, IRQ0 is low all the time. In the below program, when i receive usart data, usart0_handler is executed and then IRQ0_handler also gets automatically executed. so every time usart data arrives,both interrupt routines usart and irq0 gets executed. I am using greenhills multi compiler. Can any body please point out error in this code. Thanks in advance.
#include "project.h"
#define BOARD_MCK 48000000
void PIO_Init (void); void ext_intr_1pps(void); void USART0_handler(void); void uart0_init(void);
AT91PS_USART COM0 = AT91C_BASE_US0;
unsigned char ch;
//esternal interrupt handler void IRQ0_handler(void) { AT91F_US_PutChar (COM0,ch); }
//usart receive interrupt handler void USART0_handler (void ) { unsigned int status_reg = COM0->US_CSR; if(status_reg & AT91C_US_RXRDY) { ch=AT91F_US_GetChar(COM0); } }
int main() { AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ; AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOB ) ; PIO_Init (); uart0_init(); AT91F_PIO_ClearOutput( AT91C_BASE_PIOB, AT91C_PIO_PB21 | AT91C_PIO_PB20); AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,AT91C_ID_IRQ0,AT91C_AIC_PRIOR_HIGHEST,AT91C_AIC_SRCTYPE_POSITIVE_EDGE,IRQ0_handler); AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_IRQ0); for (;;); }
void PIO_Init (void) { AT91C_BASE_PIOB->PIO_PPUER = AT91C_PIO_PB21 |AT91C_PIO_PB20; AT91F_PIO_CfgOutput( AT91C_BASE_PIOB, AT91C_PIO_PB21 | AT91C_PIO_PB20); }
void uart0_init ( void ) { AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA,((unsigned int)AT91C_PA0_RXD0)|((unsigned int)AT91C_PA1_TXD0),0);//Peripheral B
// First, enable the clock of the USART AT91F_PMC_EnablePeriphClock (AT91C_BASE_PMC,1 << AT91C_ID_US0); AT91F_US_Configure (COM0,AT91B_MCK,AT91C_US_ASYNC_MODE,9600,0);
// Enable usart transmit and receive but receive interrupt only COM0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN; AT91F_US_EnableIt(COM0,AT91C_US_RXRDY );
COM0->US_RTOR = 0x1F40; //COUNT FOR TIMEOUT OF 832ms.//for faster queries this time should be less. COM0->US_TTGR = 0; // open Usart 0 interrupt AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,AT91C_ID_US0,AT91C_AIC_PRIOR_LOWEST,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,USART0_handler); AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0); }
|