|
Прерывания в AT91SAM7S, Помогите!!!Я в очаянии.... |
|
|
|
Oct 17 2009, 13:12
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 4-03-09
Пользователь №: 45 664

|
 Привет Всем. Помогите, уже несколько дней мучаюсь на д прерыванием 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 (;;) {
} }
Причина редактирования: Оформление цитаты исходника.
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Oct 17 2009, 15:49
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(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) прерывания?
|
|
|
|
|
Oct 17 2009, 17:18
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 4-03-09
Пользователь №: 45 664

|
Прошу прощения, разве глобальные прерывания разрешаются не в регистрах AIC? AT91C_BASE_AIC->AIC_IECR = (1<<31); Цитата Как организована обработка вектора (0x18) прерывания? Что это за вектор прерывания, и зачем его обрабатывать? Ведь номер вектора соответствует номеру переферии: (0x18)=24. А векторы с 15 по 29 зарезервированы.
|
|
|
|
|
Oct 17 2009, 18:01
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(DAPA @ Oct 17 2009, 21:18)  Прошу прощения, разве глобальные прерывания разрешаются не в регистрах AIC? Нет, разрешаются битом I регистра PSR. Цитата(DAPA @ Oct 17 2009, 21:18)  Что это за вектор прерывания, и зачем его обрабатывать? Вектор, на который процессор переходит по сигналу nIRQ. Вектора AIC'а совсем из другой оперы.
|
|
|
|
|
Oct 17 2009, 19:01
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 4-03-09
Пользователь №: 45 664

|
Цитата Вектор, на который процессор переходит по сигналу nIRQ. Вектора AIC'а совсем из другой оперы. Процессор переходит на него по ЛЮБОМУ сигналу nIRQ? И зачем его обрабатывать в этом случае?
|
|
|
|
|
Oct 17 2009, 19:15
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 4-03-09
Пользователь №: 45 664

|
Цитата Нет, разрешаются битом I регистра PSR. В даташите сказано что регистр PSR тоько для чтения
|
|
|
|
|
Oct 17 2009, 19:43
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 4-03-09
Пользователь №: 45 664

|
Я ничего не делал с адресом 0x18, просто в литературе на эту тему ни чего не нашёл. (я только начинаю разбираться с ARM, пока что освоил, только: таймер(режим генератора), вывод синхросигналов на PCKn и PWM) А прерывания nIRQ, необходимо для приёма стробов от внешнего устройства, с частотой, примерно, 20000 выборок в секунду. Цитата Вы часом CPSR/SPSR с PIO_PSR не путаете, а? Я имел в виду PIO_PSR. Да, и подскажите, пожалуйсто, алгоритм настройки какого либо устройства в составе AT91SAM7S (если можно, на примере раннее описаной проблемы)
|
|
|
|
|
Oct 17 2009, 20:38
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 4-03-09
Пользователь №: 45 664

|
Пардон, а не подскажите как в IAR называется регистр CPSR( что-то вроде AT91.._BASE_CPSR)?
|
|
|
|
|
Oct 17 2009, 22:20
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 4-03-09
Пользователь №: 45 664

|
Кстати о регистре 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 ...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|