Здравствуйте! Недавно начал изучать ARM7. Использую at91sam7S64, тулчейн - yagarto.
Пробую поработать с прерываниями RTT. Пишу простейший пример, в котором при инкременте RTT возникает прерывание, обработчик зажигает светодиоды.
Прошиваю контроллер, прерывания не возникает. Не понимаю, где косяк, может кто-нибудь сталкивался с чем-то подобным, подскажите.
main.c
Код
#define LED_1 (1 << 3)
#define LED_2 (1 << 4)
#define LED_MASK (LED_1 | LED_2)
volatile AT91PS_RTTC pRTT = AT91C_BASE_RTTC;
volatile AT91PS_AIC pAIC = AT91C_BASE_AIC;
volatile AT91PS_PIO pPIO = AT91C_BASE_PIOA;
extern void __attribute__((interrupt("IRQ"))) ISR_rtt(void)
{
unsigned int status;
status = pRTT -> RTTC_RTSR;
if ((status & AT91C_RTTC_RTTINC) == AT91C_RTTC_RTTINC) {
pPIO -> PIO_PER = LED_MASK;
pPIO -> PIO_OER = LED_MASK;
pPIO -> PIO_CODR = LED_MASK;
}
}
void ConfigureRtt(void)
{
unsigned int previousTime;
// Configure RTT for a 1 second tick interrupt
pRTT -> RTTC_RTMR = (32768 | AT91C_RTTC_RTTRST);
previousTime = pRTT -> RTTC_RTVR;
while (previousTime == (pRTT -> RTTC_RTVR));
// Enable RTT interrupt
// Disable the interrupt first
pAIC -> AIC_IDCR = SOURCE1;
// Configure mode and handler
AT91C_BASE_AIC->AIC_SMR[SOURCE1] = 0;
AT91C_BASE_AIC->AIC_SVR[SOURCE1] = (unsigned int) ISR_rtt;
// Clear interrupt
AT91C_BASE_AIC->AIC_ICCR = SOURCE1;
AT91C_BASE_AIC -> AIC_IECR = SOURCE1;
pRTT -> RTTC_RTMR |= AT91C_RTTC_RTTINC;
}
int main (void)
{
ConfigureRtt();
while (1)
{
}
return(0);
}
startup.s & low_level_init.c
src.zip ( 6.34 килобайт )
Кол-во скачиваний: 73