BBulat (08.10.2009 13:29, просмотров: 3739)
at91sam7s. Не вызывается старшее по приоритету прерывание от порта. Прерывания от таймера срабатывают. Прерывания происходят с частотой 100 кГц - частота, генерируемая таймером. На один из портов контроллера (PA9) приходит также сигнал с частотой 100кГц, но прерывания от порта не срабатывают, хотя приоритет у прерываний от порта выше. Почему так происходит?
//Обработка прерываний от таймера
__inline __ramfunc void timer0_irq_handler()
{
regs->PIOA_ODSR = 0x2; //Зажигаем лампочку
int ps=100000;
while(ps!=0)ps--;
regs->PIOA_ODSR = 0x0;
ps=100000;
while(ps!=0)ps--;
dummy = MipsTimerBase->TC_SR;
}
__inline __ramfunc void Start_Mips_Timer()
{
//* Enable the clock and Start timer
MipsTimerBase->TC_RA = 30; MipsTimerBase->TC_RB = 60;
MipsTimerBase->TC_CCR = AT91C_TC_CLKEN;
MipsTimerBase->TC_CCR = AT91C_TC_SWTRG ;
}
//Инициализация таймера
void Init_Mips_Timer()
{
// Init timer interrupt
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC,1 << MipsTimer.Id);
// Disable the clock and the interrupts
MipsTimerBase->TC_CCR = AT91C_TC_CLKDIS ;
MipsTimerBase->TC_IDR = 0xFFFFFFFF ;
// Set the Mode of the Timer Counter
MipsTimerBase->TC_CMR = AT91C_TC_ASWTRG_CLEAR | AT91C_TC_ACPC_CLEAR | AT91C_TC_ACPA_SET | AT91C_TC_WAVE | AT91C_TC_WAVESEL_UP_AUTO | MipsTimer.Div ;
// open Timer 0 interrupt
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, MipsTimer.Id,7,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, timer0_irq_handler);
MipsTimerBase->TC_IER = AT91C_TC_CPAS; //Enable the RA Compare interrupt
AT91F_AIC_EnableIt (AT91C_BASE_AIC, MipsTimer.Id);
Start_Mips_Timer();
}
//Обработка прерываний от порта
__ramfunc void irq_Receive()
{
regs->PIOA_ODSR = 0x80000000;
int ps=1000000;
while(ps!=0)ps--;
regs->PIOA_ODSR = 0x0;
ps=1000000;
dummy = AT91C_BASE_PIOA->PIO_ISR;
}
//Инициализация прерываний от порта
#define REC_MASK (1<<9) //Маска, разрешающая прерывание от порта PA9
void Receiver_ini()
{
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_PIOA, 6, AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE, irq_Receive);
AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA,REC_MASK);
//* set the interrupt by software
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_PIOA);
}
Заранее благодарен.