ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
168570
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); } Заранее благодарен.