Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: как работает TC на at91rm9200
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
boryx
столкнулся с проблемой.

конфигурю регистры для любого таймера скажем для TC5

at91_tc5_write(AT91_TC_CCR, AT91_TC_CLKEN);//enable timer
at91_tc5_write(AT91_TC_CMR,
AT91_TC_TIMER_CLOCK5| //slow clock ~32kHz
AT91_TC_WAVE| //wave mode
AT91_TC_WAVESEL_UP_AUTO); //triger on RC

at91_tc5_write(AT91_TC_RC, 0x1000);
at91_tc5_write(AT91_TC_CCR, AT91_TC_SWTRG); //restart timer
at91_tc5_write(AT91_TC_IER, AT91_TC_CPCS);//enable interrupt

теперь по даташиту счетчик должен считать, и когда дойдет до 0х1000 должно сработать прерывание.

на практике прекращается загрузка сисетмы и прерыване запускается все время, захватывая все ресурсы
я так понимаю, что флажок не сбрасывается. Или я что-то не так делаю???

какие будут соображения
beer_warrior
А вы правильно настроили AIC?
B что-нибудь подобное использовали?
Код
//clear interrupt flag
AT91F_PITGetPIVR(AT91C_BASE_PITC);
//end of intterupt
AT91C_BASE_AIC->AIC_EOICR = 0;
boryx
Цитата(beer_warrior @ May 25 2006, 10:26) *
А вы правильно настроили AIC?
B что-нибудь подобное использовали?
Код
//clear interrupt flag
AT91F_PITGetPIVR(AT91C_BASE_PITC);
//end of intterupt
AT91C_BASE_AIC->AIC_EOICR = 0;


Да с этим вроде как все впорядке.
на at91rm9200 стоит LINUX.

при инициализации драйвера
request_irq(AT91_ID_TC5, ...)

до того момента, как я энаблю прерывание на соответствие с RC (да или любого другоа) все в порядке.
а как включаю прерывание, оно срабатывает сного и сного без перерыва.

Таимер я использую для своих нужд и ножки не энаблю в PIO.

мне нужно, чтобы через определенные промежутки времени срабатывала функцияю

Сейчас использую Линуксовский таймер, но промежутки получаются слишком большие.

в проце 6 таймеров а я linux загружаю лишней работой...

кто может привести рабочий пример как с таймером работать, какие команды в каком порядке запускать.

писал дрова для SPI,SSC и такой проблемы не возникало.
beer_warrior
Я наверное невнятно спросил - флажок прерывания должен сниматься явно в EOICR - вы это учли?
стр.258
The End of Interrupt Command Register is used by the interrupt routine to indicate that the interrupt treatment is complete.
Any value can be written because it is only necessary to make a write to this register location to signal the end of interrupt
treatment.
Или каким-то образом конфликтует с Линухом.
boryx
Цитата(beer_warrior @ May 25 2006, 13:56) *
Я наверное невнятно спросил - флажок прерывания должен сниматься явно в EOICR - вы это учли?
стр.258
The End of Interrupt Command Register is used by the interrupt routine to indicate that the interrupt treatment is complete.
Any value can be written because it is only necessary to make a write to this register location to signal the end of interrupt
treatment.
Или каким-то образом конфликтует с Линухом.



с Линухом конфликта быть не может. только мой драйвер обрабатывает прерывание с этим номером.
Интересно что при обработке других прерываний в др. драйверах никогда не обнулял этот флаг, так как это Линух где то сам делает в обработчике.

Спасибо, очень интересная идея с EOICR, буду пробовать. Может для прерываний у таймеров влажок почему-то не сбрасывается.
sapID
Еще в прерывании стоит считать регистр статуса таймера
Код от Atmel для SAM7 (в rm9200, вроде, также):

//* Acknowledge interrupt status
dummy = AT91C_BASE_TC1->TC_SR;
//* Suppress warning variable "dummy" was set but never used
dummy = dummy;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.