
Привет Всем. Помогите, уже несколько дней мучаюсь на д прерыванием IRQ1 в AT91SAM7S256, перепробовал уйму вариантов, увы
Вот один из вариантов:
CODE
#include "Board.h"
#define EXT_OC 18432000 // Exetrnal ocilator MAINCK
#define MCK 48054857
//=================================================================
#define IRQ_1 (1<<30)
#define LED_1 (1<<26)
///////////////////////////////////////////////////////////////////
#define IRQ1_INTERRUPT_LEVEL 5
char flag = 0;
char dum;
//обработчик прерывания от IRQ1
void button(void){
AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LED_1);
/*
if( flag ==1 )
{
AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LED_1);
flag = 0;
}
else
{
AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, LED_1);
flag = 1;
};
*/
dum = AT91C_BASE_PIOA->PIO_ISR;//разрешить следующее прерывание IRQ1(сброс ВСЕХ прерываний)
dum = dum;
};
//инициализация внешнего прерывания на линии IRQ1
void irq_interrupt_init(void){
AT91F_PIO_CfgInput(AT91C_BASE_PIOA, IRQ_1);
AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, IRQ_1, 0);
AT91F_PIO_CfgInputFilter(AT91C_BASE_PIOA, IRQ_1);//включение входного фильтра для линии IRQ1
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, AT91C_ID_IRQ1 );
AT91C_BASE_AIC->AIC_IDCR = (1<<31);
AT91C_BASE_AIC->AIC_SMR[31] = (0x1<<5)|(0x6);
AT91C_BASE_AIC->AIC_SVR[31] = (unsigned int)button;
AT91C_BASE_AIC->AIC_IECR = (1<<31);
// AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_IRQ1, 2, 2, button);
//идентификатор устройства, приоритет, тип чувствительности, указателт на обработчик
// AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_IRQ1);
};
int main( void ){
AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5<<24);
AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, LED_1);
irq_interrupt_init();
for (;;)
{
}
}
Причина редактирования: Оформление цитаты исходника.