Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с IRQ
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
thsparrow
Здравствуйте! Недавно начал изучать ARM7. Использую at91sam7S64, тулчейн - yagarto.
Пробую поработать с прерываниями RTT. Пишу простейший пример, в котором при инкременте RTT возникает прерывание, обработчик зажигает светодиоды.
Прошиваю контроллер, прерывания не возникает. Не понимаю, где косяк, может кто-нибудь сталкивался с чем-то подобным, подскажите. help.gif

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
Нажмите для просмотра прикрепленного файла
DmitryM
[quote name='thsparrow' date='Jan 24 2011, 23:27' post='873392']
Здравствуйте! Недавно начал изучать ARM7. Использую at91sam7S64, тулчейн - yagarto.
Пробую поработать с прерываниями RTT. Пишу простейший пример, в котором при инкременте RTT возникает прерывание, обработчик зажигает светодиоды.
Прошиваю контроллер, прерывания не возникает. Не понимаю, где косяк, может кто-нибудь сталкивался с чем-то подобным, подскажите. help.gif

Конечно сталкивался rolleyes.gif В ядре то прерывания запрещены, установлен I-Bit.
thsparrow
Цитата(DmitryM @ Jan 24 2011, 23:45) *
Конечно сталкивался rolleyes.gif В ядре то прерывания запрещены, установлен I-Bit.


Т.е. необходимо вернуть режим IRQ_MODE после установки указателей SP?
msr CPSR_c, #IRQ_MODE
GetSmart
Цитата(thsparrow @ Jan 25 2011, 01:59) *
Т.е. необходимо вернуть режим IRQ_MODE после установки указателей SP?

После установки SP в регистре флагов должон быть режим SYSTEM.

А сброс I-бита это разрешение прерываний IRQ. I-бит в регистре флагов нах-ся в 7-ой позиции (маска 0x80). Делается так:
__enable_interrupt();
Сергей Борщ
QUOTE (GetSmart @ Jan 25 2011, 04:41) *
Делается так:
__enable_interrupt();
В компиляторе IAR. В arm-gcc это делается ручками, примерно так:

CODE
inline uint32_t __get_CPSR()
{
    uint32_t cpsr;
    asm volatile
    (
    " MRS  %0,CPSR    \r\n"
    :"=r"(cpsr)
    :
    );
    return cpsr;
}

inline void __set_CPSR_c(uint32_t cpsr)
{
    asm volatile
    (
    " MSR  CPSR_c, %0    \r\n"
    :
    :"r"(cpsr)
    );
}

inline void __enable_interrupts() { __set_CPSR_c(__get_CPSR() & ~(1<<7)); }
thsparrow
Насколько я понял(бит I не устанавливать вот здесь):

Код
    MSR     CPSR_c,#(SYS_MODE | F_BIT)
    LDR     sp,=__c_stack_top__                  /* set the C stack pointer */


добавил в проект header с функциями get_cpsr(), set_cpsr(), enable_irq(). К сожалению, результата это не дало, программа по-прежнему минует обработчик.

Нажмите для просмотра прикрепленного файла
GetSmart
Цитата(thsparrow @ Jan 25 2011, 15:55) *
Насколько я понял(бит I не устанавливать вот здесь):

Нет. Там он нужен. Сбрасывается бит только после инициализации AIC (прерываний).

По поводу самого проца от Атмела подсказать не могу, сижу на LPC.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.