Что-то с самом у меня не клеится. Не пионимаю как организовать прерывание по переполнению таймера.
вобщем что понятно. нужно проинициализировать aic и поставить таймер в режим сравнения. в регистр сравнения rc таймера записать максимальное значение 0xFFFF
Код
void set_timer_channel1_to_timer_mode(void)
{
/* */
//AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC1] = PRIORITY_TIMER1 | AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE;
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC1] = PRIORITY_TIMER1 | AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED;
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC1] = (unsigned int)ih_timer1_overload;
/* ðàçðåøàåì ïðåðûâàíèå îò êàíàëà 1 òàéìåðà-ñ÷åò÷èêà */
AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_TC1);
/* ïîäêëþ÷àåì ê êàíàëó ñèñòåìíóþ ÷àñòîòó è âêëþ÷àåì âûâîä */
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_TC1);
/* */
AT91C_BASE_TC1->TC_CMR = AT91C_TC_CLKS_TIMER_DIV1_CLOCK
|
AT91C_TC_WAVE
|
AT91C_TC_WAVESEL_UP_AUTO;
AT91C_BASE_TC1->TC_RC = 0xFFFF;
AT91C_BASE_TC1->TC_IER = AT91C_TC_CPCS;
/* çàïóñêàåì òàéìåð */
AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
}
далее пишется простенький обработчик
Код
void ih_timer1_overload(void) __irq
{
// Time = AT91C_BASE_AIC->AIC_IVR; //automatic clear current interrupt
AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_TC1); //clear current interrupt
//if(AT91C_BASE_TC1->TC_SR & AT91C_TC_CPCS)
{
Time = 0xFFFF;
ReloadCountTime++;
ReloadCountPulses = 0;
}
}
Что не понятно.
1. Надо ли очищать какой-то флаг источника прерываний в САМе? То есть правильно ли я делаю что пишу первую(закоментированную) или вторую строчки обработчика?
2. Каким образом таймер генерит прерывания и выбирается их конкретный источник (сравнение по ra rb rc, захват и пр.) в даташите по этому поводу очень грамотно написано
Цитата
Interrupt
The TC has an interrupt line connected to the Advanced Interrupt Controller (AIC). Handling the
TC interrupt requires programming the AIC before configuring the TC.
Круто ничего не скажешь... дальше то что?
по поводу определения истьочника подозреваю надо читать статус. Но генерятся то прерывания когда?
3 Прерывание вызывается но только один раз. Подозреваю это из-за того что я что-то упустил с источниками прерываний. Или вообще что-то упустил. При этом я вижу в эмуляторе что флаг cpcs в регистре статуса не изменяется. При каких условиях сбрасывается CPCS?
Памажите а?
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.