Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывания в AT91SAM7S
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
DAPA
1111493779.gif wassat.gif Привет Всем. Помогите, уже несколько дней мучаюсь на д прерыванием IRQ1 в AT91SAM7S256, перепробовал уйму вариантов, увы wassat.gif 1111493779.gif
Вот один из вариантов:

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 (;;)
{


}
}
aaarrr
Цитата(DAPA @ Oct 17 2009, 17:12) *
dum = AT91C_BASE_PIOA->PIO_ISR;//разрешить следующее прерывание IRQ1(сброс ВСЕХ прерываний)

Это сброс прерывания PIO, к внешним IRQx никакого отношения не имеет.
Еще забыли запись AIC_EOICR в конце обработки прерывания.

Цитата(DAPA @ Oct 17 2009, 17:12) *
AT91F_PIO_CfgInputFilter(AT91C_BASE_PIOA, IRQ_1);//включение входного фильтра для линии IRQ1

Входной фильтр распространяется только на модуль PIO, к периферийным входам пин всегда подключен напрямую.

Цитата(DAPA @ Oct 17 2009, 17:12) *
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, AT91C_ID_IRQ1 );

В этом тоже нет необходимости.

Если честно, не вижу причин почему бы прерыванию не срабатывать.
Не забыли ли включить прерывания глобально?
Как организована обработка вектора (0x18) прерывания?
DAPA
Прошу прощения, разве глобальные прерывания разрешаются не в регистрах AIC?

AT91C_BASE_AIC->AIC_IECR = (1<<31);

Цитата
Как организована обработка вектора (0x18) прерывания?

Что это за вектор прерывания, и зачем его обрабатывать?
Ведь номер вектора соответствует номеру переферии: (0x18)=24.
А векторы с 15 по 29 зарезервированы.
aaarrr
Цитата(DAPA @ Oct 17 2009, 21:18) *
Прошу прощения, разве глобальные прерывания разрешаются не в регистрах AIC?

Нет, разрешаются битом I регистра PSR.

Цитата(DAPA @ Oct 17 2009, 21:18) *
Что это за вектор прерывания, и зачем его обрабатывать?

Вектор, на который процессор переходит по сигналу nIRQ. Вектора AIC'а совсем из другой оперы.
DAPA
Цитата
Вектор, на который процессор переходит по сигналу nIRQ. Вектора AIC'а совсем из другой оперы.

Процессор переходит на него по ЛЮБОМУ сигналу nIRQ?
И зачем его обрабатывать в этом случае?
aaarrr
Цитата(DAPA @ Oct 17 2009, 23:01) *
Процессор переходит на него по ЛЮБОМУ сигналу nIRQ?
И зачем его обрабатывать в этом случае?

У процессора ARM7TDMI есть только две линии прерываний - nIRQ и nFIQ. При получении сигнала по первой, он переходит на вектор 0x18, по второй - на вектор 0x1C.
AIC является лишь надстройкой над родной системой прерываний.
Вот я и пытаюсь выяснить, что в вашей программе накручено по адресу 0x18.
DAPA
Цитата
Нет, разрешаются битом I регистра PSR.

В даташите сказано что регистр PSR тоько для чтения
aaarrr
Цитата(DAPA @ Oct 17 2009, 23:15) *
В даташите сказано что регистр PSR тоько для чтения

Вы часом CPSR/SPSR с PIO_PSR не путаете, а?
DAPA
Я ничего не делал с адресом 0x18, просто в литературе на эту тему ни чего не нашёл.
(я только начинаю разбираться с ARM, пока что освоил, только: таймер(режим генератора), вывод синхросигналов на PCKn и PWM) laughing.gif
А прерывания nIRQ, необходимо для приёма стробов от внешнего устройства, с частотой, примерно, 20000 выборок в секунду.

Цитата
Вы часом CPSR/SPSR с PIO_PSR не путаете, а?

Я имел в виду PIO_PSR.

Да, и подскажите, пожалуйсто, алгоритм настройки какого либо устройства в составе AT91SAM7S
(если можно, на примере раннее описаной проблемы) unsure.gif
aaarrr
Цитата(DAPA @ Oct 17 2009, 23:43) *
Я ничего не делал с адресом 0x18, просто в литературе на эту тему ни чего не нашёл.

Почитайте вот этот документ. Собственно с него и стоило начинать изучение.
DAPA
Пардон, а не подскажите как в IAR называется регистр CPSR( что-то вроде AT91.._BASE_CPSR)?
aaarrr
Цитата(DAPA @ Oct 18 2009, 00:38) *
Пардон, а не подскажите как в IAR называется регистр CPSR( что-то вроде AT91.._BASE_CPSR)?

Никак он не называется. Доступ к нему из-под "C" возможен только с помощью intrinsic-функций или asm-вставок.
DAPA
Кстати о регистре CPSR, в файле Cstartup.s обнаружил следующее:
...
I_BIT DEFINE 0x80
F_BIT DEFINE 0x40
...
;- Disable Interrupt and switch back in IRQ mode
msr CPSR_c, #I_BIT | IRQ_MODE
...
DAPA
Урррррааааааа!!!!
Заработало.
Всё оказалось элементарно, необходимо было ипользовать intrinsic функцию:

__enable_interrupt();

Которая, как и говорилось, глобально влючает прерывания.

08.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif 08.gif
DAPA
laughing.gif Прошу прощения, что не по адресу laughing.gif
А как закрыть тему?
rezident
Цитата(DAPA @ Oct 19 2009, 01:28) *
laughing.gif Прошу прощения, что не по адресу laughing.gif
А как закрыть тему?
Закрыть свою собственную тему имеют возможность пользователи группы "Свой". Поэтому вашу тему может закрыть только модератор. Закрываю.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.