Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Интервальный таймер PIT SAM7S128
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Anton_1000
Во время выоплнения программы Процедура обработчик прерываний от интервального таймера PIT
вызывается только один раз, а не периодически. В чем моя ошибка?

КОД:
// обработчик прерываний от интервального таймера PIT
void PIT_handler (void)
{ unsigned int status;
//сброс прывания от PIT
status=AT91C_BASE_PITC->PITC_PIVR;
status=status;
// действия при прерывании
AT91F_US_PutChar ( AT91C_BASE_US0, 'P');
}

// ИНИЦИАЛИЗАЦИЯ
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC,AT91C_ID_SYS,6,AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE,
PIT_handler );
AT91F_PITInit ( AT91C_BASE_PITC,100,18432000 );
AT91F_PITEnableInt ( AT91C_BASE_PITC );
AT91F_AIC_EnableIt ( AT91C_BASE_AIC, AT91C_ID_SYS );
Сергей Борщ
Цитата(Anton_1000 @ May 17 2009, 10:35) *
В чем моя ошибка?
Мало информации. Не видно кода основного обработчика (того, где происходит ветвление по AIC_IVR).
Anton_1000
Явного определения этого регистра в программе нет.
Правильно ли понимаю, что ветвление определяет код в файле SAM7.s компилятора КЕЙЛ.
Vectors LDR PC,Reset_Addr
LDR PC,Undef_Addr
LDR PC,SWI_Addr
LDR PC,PAbt_Addr
LDR PC,DAbt_Addr
NOP ; Reserved Vector
; LDR PC,IRQ_Addr
LDR PC,[PC,#-0xF20] ; Vector From AIC_IVR
; LDR PC,FIQ_Addr
LDR PC,[PC,#-0xF20] ; Vector From AIC_FVR

Reset_Addr DCD Reset_Handler
Undef_Addr DCD Undef_Handler
SWI_Addr DCD SWI_Handler
PAbt_Addr DCD PAbt_Handler
DAbt_Addr DCD DAbt_Handler
DCD 0 ; Reserved Address
IRQ_Addr DCD IRQ_Handler
FIQ_Addr DCD FIQ_Handler

Undef_Handler B Undef_Handler
SWI_Handler B SWI_Handler
PAbt_Handler B PAbt_Handler
DAbt_Handler B DAbt_Handler
IRQ_Handler B IRQ_Handler
FIQ_Handler B FIQ_Handler
sergeeff
Ну так вас и спрашивают, как же обработчик прерывания от PIT выглядит? То что вы называете организацией "ветвления" - это организация таблицы векторов прерывания ARM процессора.
Сергей Борщ
Цитата(Anton_1000 @ May 17 2009, 13:52) *
Явного определения этого регистра в программе нет.
Как это нет? А вот это: LDR PC,[PC,#-0xF20] ; Vector From AIC_IVR
Из этой строки следует, что обработчик у вас описан неправильно: Он должен быть с квалификатором __irq или подобным (поищите в документации на Кейла), и, кроме того, он должен заканчиваться записью в AIC_EIOCR.
Anton_1000
Указание на єтот обработчик в функции AT91F_AIC_ConfigureIt

// обработчик прерываний от интервального таймера PIT
void PIT_handler (void)
{ unsigned int status;
//сброс прывания от PIT
status=AT91C_BASE_PITC->PITC_PIVR;
status=status;
// действия при прерывании
AT91F_US_PutChar ( AT91C_BASE_US0, 'P');
}
sergeeff
Коллега Борщ вам явно указывает, что ваша PIT_handler объявлена неправильно, как void PIT_handler(void), а надо:
void __irq PIT_handler(void).

Вы разницу понимаете? Если не понимаете, то включите в проект пункт генерации ассемблерного листинга и посмотрите, какой код генерит компилятор в обоих случаях.

Вообще, про прерывания в ARM на форуме десятый раз, наверное, все разжевывается.
Anton_1000
Спасибо я понял свою ошибку с __irq.
Просто пробовал код из книги Редькина "Микроконтроллеры АРМ7", а там оказалась засада.
Сергей Борщ
Цитата(Anton_1000 @ May 17 2009, 16:23) *
Спасибо я понял свою ошибку с __irq.
Кроме этого еще должна быть запись в AIC_EIOCR.
Цитата(Anton_1000 @ May 17 2009, 16:23) *
Просто пробовал код из книги Редькина "Микроконтроллеры АРМ7"
Вверху справа есть ссылка поиск по форуму. Наберите там "Редькин".

И еще посмотрите вот это сообщение. Мне почему-то кажется, что в данном случае Редькин не при чем, просто для используемого вами метода обработки (без __irq) вы выбрали не тот стартап.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.