Vit2005 (03.08.2006 18:35, просмотров: 2622)
LPC2138 и прерывания таймера 0 Странная вещь происходит после 7145-го прерывания таймера 0
0000005Bh 1
0000005Ch 2
0000005Ah 3
0000005Bh 4
.....
0000005Ch 7143
0000005Ch 7144
0000005Ch 7145
0000005Ch 5
0000005Ch 2
0000005Ch 32337
0000005Ah 32338
0000005Ch 1073745593
0000005Ah 3
0000005Ah 4
Повторяемось 100%.
После 7145-го прерывания таймера 0
всегда получается мусор.
Не пойму где могут быть грабли.
#define _VIC_TIMER0 4
#define _VIC_ENABLE (1 << 5)
#define SAMPLES_PER_SECOND (300)
//
ULONG cntISR =0;
//
void timer0_ISR(void)
{
INTERRUPT_ENTRY();
// check the interrupt sources
if(T0IR & 1)
{
// clear MR0 Interrupt
T0IR |= 1;
tprintf("\n\r%08Xh %lu",T0TC,++cntISR);
}
VICSoftIntClr = (1<<_VIC_TIMER0);
VICVectAddr = 0x00000000; // clear this interrupt from the VIC
INTERRUPT_EXIT();
}
//
int main (void)
{
/* Initialize the system */
Initialize();
uart0Init(B115200,UART_8N1,UART_FIFO_14);
/* Initialize timer0 */
// set prescaler
T0PR = 0;
// reset timer
T0TCR = 2;
// start timer
T0TCR = 1;
// setup timer0 for IRQ
VICIntSelect &= ~(1<<_VIC_TIMER0);
// assign VIC slot
VICVectCntl4 = _VIC_ENABLE | _VIC_TIMER0;
VICVectAddr4 = (unsigned long )timer0_ISR;
// enable interrupt
VICIntEnable |= (1<<_VIC_TIMER0);
// setup MR0 value
T0MR0 = (FOSC*PLL_M)/SAMPLES_PER_SECOND;
// enable timer0 interrupt and reset on MR0 match
T0MCR |= 3;
/* Enable interrupts */
EnableIRQ();
//
for(;;);
}
/* EOF */