|
Помогите с прерыванием таймера, не срабатывает |
|
|
|
May 14 2009, 16:10
|
Местный
  
Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228

|
Использую IAR 4.41A, JLink J-Tag дебагер, RAM дебаг, стандартный cstartup. Код: CODE
void AT91F_TC_Open(AT91PS_TC TC_pt, unsigned int Mode, unsigned int TimerId) //* Begin { unsigned int dummy;
//* First, enable the clock of the TIMER AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<< TimerId ) ;
//* Disable the clock and the interrupts TC_pt->TC_CCR = AT91C_TC_CLKDIS ; TC_pt->TC_IDR = 0xFFFFFFFF ;
//* Clear status bit dummy = TC_pt->TC_SR; //* Suppress warning variable "dummy" was set but never used dummy = dummy; //* Set the Mode of the Timer Counter TC_pt->TC_CMR = Mode ;
//* Enable the clock TC_pt->TC_CCR = AT91C_TC_CLKEN ; //* End }
__ramfunc void timer0_c_irq_handler(void) { AT91PS_TC TC_pt = AT91C_BASE_TC0; unsigned int dummy; //* Acknowledge interrupt status dummy = TC_pt->TC_SR; //* Suppress warning variable "dummy" was set but never used dummy = dummy; }
... AT91F_TC_Open(AT91C_BASE_TC0, TC_CLKS_MCK1024, AT91C_ID_TC0);
//* Open Timer 0 interrupt AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_TC0, 0x4, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, timer0_c_irq_handler); AT91C_BASE_TC0->TC_IER = AT91C_TC_COVFS; AT91F_AIC_ClearIt(AT91C_BASE_AIC, AT91C_ID_TC0); AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_TC0); AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG; ...
код вроде сдерт с атмеловского примера, но прерывание все равно не генерируется. Причем если работать с флагом, а не с прерываниями, то все норм.
Сообщение отредактировал coolibin - May 14 2009, 16:12
--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
|
|
|
|
|
May 15 2009, 20:52
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(DpInRock @ May 15 2009, 19:55)  Я бы в код прерывания вставил что-нибудь полезное, заметное. Конечно, это же "быстрее" чем пройтись по шагам от IRQ вектора до места где торчит проц и увидеть своими глазами куда и как он прыгает. Цитата А всякие отладчики выбросил бы в ближайшее мусорное ведро. Смешно. Как раз тот случай, чем посмотреть и за пару минут решить проблему, лучше пользоваться дедовским светиком и третий день менять стартапы. Цитата Отладчик сделанный не своими руками - зло. Да-да, бабки в эпоху ленинской революции говорили, что поезда и лехтричество - это зло. Лучше телегой и со свечкой.
|
|
|
|
|
May 15 2009, 23:06
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(DpInRock @ May 16 2009, 00:39)  У меня просто никогда не было никаких отладчиков и JTAG. Ну симулятор тоже можно.. Надо то всего лишь протрассировать код IRQ. Цитата Я бы для начала убедился, что проц на нужной скорости работает. Настроил бы UART. И горя не знал бы. Это работает когда костяк программы уже есть, IRQ обрабатываются и ведется отладка прикладной части. А когда проблемы со стартапом - отладчик, причем любой формы (эмулятор, симулятор, JTAG и т.д.), наиболее эффективный способ.
|
|
|
|
|
May 17 2009, 00:44
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(DpInRock @ May 17 2009, 03:53)  Не работать прерывание может по многим причинам. Я вижу только две: - непонимание архитектуры (самая распространенная) - невнимательность Цитата(DpInRock @ May 17 2009, 03:53)  Вот у меня только что не работало прерывание от кодека. Три часа искал причину. Два бубна извел. А просто вместо числа 0x20150618 писал (методом копи-пасте из другой программы) 20150618. А это был адрес памяти. Которой в этом десятичном месте отродясь не бывало. И проц вполне справедливо зависал упираясь в несуществующий обработчик данного события. Ну вот, а кто-то тут недавно рассказывал, как это круто - вбивать все подряд цифирьками
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|