|
вопрос про прерывания, AT91SAM7X |
|
|
|
Dec 6 2007, 11:06
|
Участник

Группа: Новичок
Сообщений: 49
Регистрация: 14-02-07
Пользователь №: 25 346

|
Судя по даташиту, в начале обработки прерывания необходимо прочитать регистр AIC_IVR, как они выражаются, это the entry point of the interrupt handling.. В конце обработки прерывания необходимо прописать что-нибудь в регистр AIC_EOICR, т.к. это the exit point of the interrupt handling..
Так вот.. до недавнего времени мне удавалось вполне успешно обрабатывать прерывания (TC, CAN, ADC), не читая AIC_IVR, а читая соответствующие статусные регистры перриферии, сбрасывающие флаг, свидетельствующий о произошедшем прерывании и прописывая какое-то значение в AIC_EOICR..
Однако при обработке прерываний от PIO и IRQ0, IRQ1 я натолкнулся на некоторые трудности.. Например, при настройке IRQ0 на срабатывание по высокому уровню без чтения AIC_IVR программа зацикливается на функции прерывания.. Когда же произвожу чтение AIC_IVR, функция прерывания выполняется один раз и больше ни на что не реагирует (кроме ресета..)
В связи с этим вопрос: необходимо ли читать регистр AIC_IVR и если да, то в каких случаях?
|
|
|
|
|
 |
Ответов
|
Apr 22 2009, 14:39
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078

|
У меня почти такая же проблема: второй раз не обрабатывает прерывание и докучи перезаписывает один из существующих массивов (программа не зависает, если это важно). Камень AT91RM9200 Инициализация (сделана отдельной функцией): Код void IntInit(void) {AT91F_PIO_CfgInput(AT91C_BASE_PIOA, DataInput); AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, DataInput, 0); AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, AT91C_ID_IRQ2, 7, AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED, PIOA_Handler); // prio AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_IRQ2); } Обработчик: Код extern int p[33]; static void PIOA_Handler( void ) { AT91C_BASE_AIC->AIC_IVR; AT91C_BASE_PIOB->PIO_SODR |= ( DDS_P2_MODULATION ); /* PB7 - выв 87 AT91RM9200 */ AT91C_BASE_PIOB->PIO_CODR |= ( DDS_P2_MODULATION ); /* PB7 are output */ AT91C_BASE_AIC->AIC_ICCR |= ( 1UL<<AT91C_ID_IRQ2 );//clear interrupt AT91C_BASE_AIC->AIC_EOICR = 0; } Строки, касающиеся прерывания из main(): Код ... IntInit(); AT91C_BASE_PIOB->PIO_SODR |= ( DDS_P2_MODULATION ); /* PB7 - выв 87 AT91RM9200 */ __enable_interrupt(); delay(5000); AT91C_BASE_PIOB->PIO_CODR |= ( DDS_P2_MODULATION ); /* PB7 are output */ ...
Сообщение отредактировал Antokha - Apr 22 2009, 15:16
|
|
|
|
|
Apr 22 2009, 20:05
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Antokha @ Apr 22 2009, 18:39)  У меня почти такая же проблема: второй раз не обрабатывает прерывание и докучи перезаписывает один из существующих массивов (программа не зависает, если это важно). Обработчик: Код extern int p[33]; static void PIOA_Handler( void ) { AT91C_BASE_AIC->AIC_IVR; AT91C_BASE_PIOB->PIO_SODR |= ( DDS_P2_MODULATION ); /* PB7 - выв 87 AT91RM9200 */ AT91C_BASE_PIOB->PIO_CODR |= ( DDS_P2_MODULATION ); /* PB7 are output */ AT91C_BASE_AIC->AIC_ICCR |= ( 1UL<<AT91C_ID_IRQ2 );//clear interrupt AT91C_BASE_AIC->AIC_EOICR = 0; } Во-первых как Вам уже сказали нужно оформить правильно функцию прерывания(в зависимости от компилятора). Ну и вообще-то сброс прерывания от PIO делается не записью AIC_ICCR, а чтением PIOx_ISR, при этом нужно иметь в виду что сбросятся все прерывания которые пришли на порт в данный момент времени: When the software reads PIO_ISR, all the interrupts are automatically cleared. This signifies that all the interrupts that are pending when PIO_ISR is read must be handled.
|
|
|
|
Сообщений в этой теме
Sergei_K вопрос про прерывания Dec 6 2007, 11:06 Сергей Борщ Цитата(Sergei_K @ Dec 6 2007, 13:06) В св... Dec 6 2007, 11:19 aaarrr Добавлю немного.
AIC_IVR лучше читать сразу при п... Dec 6 2007, 14:02 xelax не перестанет если AIC находится в Protect режиме. Dec 7 2007, 06:58   singlskv Цитата(aaarrr @ Apr 23 2009, 00:12) Ну, в... Apr 22 2009, 20:25 aaarrr Во-первых, не нужно читать write-only регистры. Во... Apr 22 2009, 16:53 Antokha ЦитатаВо-первых, не нужно читать write-only регист... Apr 22 2009, 17:24 aaarrr Цитата(Antokha @ Apr 22 2009, 21:24) Если... Apr 22 2009, 17:32 Antokha AT91C_BASE_PIOB->PIO_SODR |= ( DDS_P2_MODULATIO... Apr 22 2009, 17:52 aaarrr Цитата(Antokha @ Apr 22 2009, 21:52) AT91... Apr 22 2009, 18:04 sergeeff Функция обработчика объявлена как обычная функция,... Apr 22 2009, 18:44 Antokha ЦитатаФункция обработчика объявлена как обычная фу... Apr 22 2009, 19:00 aaarrr Цитата(Antokha @ Apr 22 2009, 23:00) Вооб... Apr 22 2009, 19:16 Antokha Книжка может быть и Редькина, точно скажу завтра д... Apr 22 2009, 19:23 aaarrr Цитата(Antokha @ Apr 22 2009, 23:23) При ... Apr 22 2009, 19:26 Antokha Про ошибку завтра днём. Компилятор (от IAR 5.11) д... Apr 22 2009, 19:30 Сергей Борщ Цитата(Antokha @ Apr 22 2009, 17:39) Кодe... Apr 22 2009, 20:49 Antokha ЦитатаAIC_IVR читается дважды. Огласите название к... Apr 23 2009, 04:52 aaarrr Цитата(Antokha @ Apr 23 2009, 08:52) [cod... Apr 23 2009, 11:09  SpiritDance Цитата(aaarrr @ Apr 23 2009, 15:09) Опять... Apr 28 2009, 06:23   MiklPolikov AT91SAM7S32
Если читаю IVR вначале прерывания, пр... Nov 20 2009, 00:27 Dron_Gus Потому что если вы уже попали в обработчик конкрет... Nov 20 2009, 07:04
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|