|
Интервальный таймер PIT SAM7S128 |
|
|
|
May 17 2009, 07:35
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 13-01-09
Из: г.Севастополь
Пользователь №: 43 288

|
Во время выоплнения программы Процедура обработчик прерываний от интервального таймера 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 );
|
|
|
|
|
 |
Ответов
(1 - 8)
|
May 17 2009, 10:52
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 13-01-09
Из: г.Севастополь
Пользователь №: 43 288

|
Явного определения этого регистра в программе нет. Правильно ли понимаю, что ветвление определяет код в файле 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
|
|
|
|
|
May 17 2009, 11:29
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Anton_1000 @ May 17 2009, 13:52)  Явного определения этого регистра в программе нет. Как это нет? А вот это: LDR PC,[PC,#-0xF20] ; Vector From AIC_IVR Из этой строки следует, что обработчик у вас описан неправильно: Он должен быть с квалификатором __irq или подобным (поищите в документации на Кейла), и, кроме того, он должен заканчиваться записью в AIC_EIOCR.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 17 2009, 11:30
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 13-01-09
Из: г.Севастополь
Пользователь №: 43 288

|
Указание на єтот обработчик в функции 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'); }
|
|
|
|
|
May 17 2009, 13:23
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 13-01-09
Из: г.Севастополь
Пользователь №: 43 288

|
Спасибо я понял свою ошибку с __irq. Просто пробовал код из книги Редькина "Микроконтроллеры АРМ7", а там оказалась засада.
|
|
|
|
|
May 17 2009, 15:31
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Anton_1000 @ May 17 2009, 16:23)  Спасибо я понял свою ошибку с __irq. Кроме этого еще должна быть запись в AIC_EIOCR. Цитата(Anton_1000 @ May 17 2009, 16:23)  Просто пробовал код из книги Редькина "Микроконтроллеры АРМ7" Вверху справа есть ссылка поиск по форуму. Наберите там "Редькин". И еще посмотрите вот это сообщение. Мне почему-то кажется, что в данном случае Редькин не при чем, просто для используемого вами метода обработки (без __irq) вы выбрали не тот стартап.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|