Привет всем!
Кто-нибудь сталкивался с такой трудностью - не срабатывает прерывание от таймера, хотя само событие, по которому должно случиться прерывание - происходит?
Таймер должен отмерять интервал времени 300 мкс для формирования манчестерского кода. Приведу кусок своей программы, может, кто-нибудь увидит ошибку:
Код
/* Настраиваем регистры контроллера прерываний */
AIC_IECR = (unsigned int)(1<<TC0IRQ); // бит TC0IRQ = 1 - разреш. прер. от таймера (канал 0)
AIC_SMR4 = 0x00000007; // PRIOR = 111 - приоритет =7 - самый высший
// SRCTYPE = 00 - по уровню
AIC_SVR4 = (unsigned int)(&TC0_IRQ); // адрес обработчика прерывания таймера (канал 0)
/* Настраиваем 0-й канал таймера */
TC_BCR=0x00000000; // SYNC=0 - 3 блока таймера работают независимо;
TC_BMR=0x00000015; // TC0XC0S=01 \
// TC0XC1S=01 | запрещ. внеш. такт. сигналы для всех 3-х блоков
// TC0XC2S=01 /
TC_CCR0=0x00000001; // CLKEN=1 - разрешаем подачу тактовой частоты на канал 0
TC_CMR0=0x00008040; // TCCLKS=000 - такт. частота MCK/2=32,768 МГц
// CLKI=0 - не инвертируем такт. частоту
// BURST=00 - такт. частота - не управляется внешним сигналом
// CPCSTOP=1 - останов такт. ч-ты когда достигнем значения RC0
// CPCDIS=0 - не запрещаем такт. ч-ту когда достигнем значения RC0
// EEVTEDG=00
// EEVT=00
// ENETRG=0
// CPCTRG=0
// WAVE=1 - waveform mode
// остальные биты=0 - никакой внешней реакции на достижение RC0
TC_RC0 = T_300mks; // константа, соотв. 300 мкс при такт. ч-те =32,768 МГц
TC_IER0=(unsigned int)(1<<CPCS); // CPCS=1 - прерывание по достижению значения RC0
/* Обработчик прерывания от таймера 300 мкс (канал 0). Для отладки - моргнуть светодиодом и записать некое число в регистр tmp */
__irq __arm void TC0_IRQ(void)
{
tmp = AIC_IVR;
tmp = 0xAABBCCDD;
PIO_SODR=1<<4;
delay(10); // Задержка 10 мкс
PIO_CODR=1<<4;
AIC_EOICR = 1;
}
/* Основная программа */
.............................
/* Запускаем таймер и ждем пока пройдет 300 мкс */
TC_CCR0=(TC_CCR0 | 0x00000004); // SWTRG=1 - сброс таймера и подача такт. частоты
while(1)
{
if( ((TC_SR0 >> CPCS) & 1) == 1 ) break;
// if( tmp == 0xAABBCCDD ) { tmp=0; break; }
}
...........................
Если выхожу из бесконечного цикла по флагу CPCS в статусном регистре TC_SR0 - все в порядке, т. е. таймер работает правильно. Тем не менее, если заменить усл-е выхода из бесконечного цикла на закомментированное - программа не работает, т. е. обработчик прерывания не выполняется.
Буду очень благодарен за советы и за любую помощь.
Сообщение отредактировал Supernaut - Mar 15 2007, 16:17