Полная версия этой страницы:
PIT прерывается лишь однажды
Хочу прерываться от ПИТа.Тестирую в дебаггере кейла.
В дебаггере прерывание происходить лишь однажды.Почему?Что не так?
Соответственно,в АРМах я совсем новичок...
#include <AT91SAM7X256.H> /* AT91SAMT7X256 definitions */
#include <lib_AT91SAM7X256.h>
static int aaa=0;
static int bbb=0;
void Periodic_Interval_Timer_handler (void)
{
bbb=1;
}
int main (void)
{
AT91F_PITInit(AT91C_BASE_PITC,1000,12); // enable and initialize PIT
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,AT91C_ID_SYS,7,1,Periodic_Interval_Timer_ha
ndler);
AT91F_PITC_CfgPMC(); // enable peripheral clock for PIT
AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_SYS);
AT91F_PITEnableInt(AT91C_BASE_PITC);
while(!bbb)
;
while(1)
aaa++;
}
Цитата(npopok @ May 5 2008, 12:29)

void Periodic_Interval_Timer_handler (void)
{
bbb=1;
}
Не хватает записи в регистр AIC_EOICR по окончанию обработчика.
И что-то мне не понятно, является ли эта функция обработчиком IRQ или она просто обычная функция.
Обработчик должен сохранять и восстанавливать контекст а так-же правильно выходить из режима IRQ. В разных компиляторах для этого используются разные методы и ключевые слова.
Написал
void Periodic_Interval_Timer_handler (void)
{
bbb=1;
AT91C_BASE_AIC->AIC_EOICR=1;
}
ничего не изменилось.Как был один раз, так и остался.
Насколько понял я,функция, взятая из библиотеки, включенной в кейл, сама прописывает irq и не надо писать __irq.я не прав?К тому же разок-то прерывание есть...Вот она
__inline unsigned int AT91F_AIC_ConfigureIt (
AT91PS_AIC pAic, // \arg pointer to the AIC registers
unsigned int irq_id, // \arg interrupt number to initialize
unsigned int priority, // \arg priority to give to the interrupt
unsigned int src_type, // \arg activation and sense of activation
void (*newHandler) () ) // \arg address of the interrupt handler
{
unsigned int oldHandler;
unsigned int mask ;
oldHandler = pAic->AIC_SVR[irq_id];
mask = 0x1 << irq_id ;
//* Disable the interrupt on the interrupt controller
pAic->AIC_IDCR = mask ;
//* Save the interrupt handler routine pointer and the interrupt priority
pAic->AIC_SVR[irq_id] = (unsigned int) newHandler ;
//* Store the Source Mode Register
pAic->AIC_SMR[irq_id] = src_type | priority ;
//* Clear the interrupt on the interrupt controller
pAic->AIC_ICCR = mask ;
return oldHandler;
Цитата(npopok @ May 5 2008, 14:21)

Насколько понял я,функция, взятая из библиотеки, включенной в кейл, сама прописывает irq и не надо писать __irq.я не прав?
Не правы. Надо написать:
Код
__irq void Periodic_Interval_Timer_handler(void)
{
bbb=1;
AT91C_BASE_AIC->AIC_EOICR=1;
}
Использую такой код:
Код
status = AT91C_BASE_PITC->PITC_PIVR; /* одновременно снимется флаг прерывания таймера */
AT91C_BASE_AIC->AIC_IVR = 0; /* Debug variant of vector read (protect mode is used) */
AT91C_BASE_AIC->AIC_ICCR = BIT(AT91C_ID_SYS); /* Clear timer #0 interrupt */
AT91C_BASE_AIC->AIC_EOICR = 0; /* Signal end of interrupt */
Да, надо было все таки писать __irq. С чего я взял, что не надо!?написал
__irq void Periodic_Interval_Timer_handler (void) и
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,AT91C_ID_SYS,7,1,(void (*)())Periodic_Interval_Timer_handler);
и стало нормально.всем спасибо.заодно еще и узнал, что тут надо интеррупты по-специальному заканчивать
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.