- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I am porting a design from Nios 1 to Nios II and the timer doens't seem to be working correctly. I don't want to use the HAL device drivers (System Clock Driver or Timestamp Driver) becuase they don't fit my needs. Anyway, here is a snippet of the relevent timer code:
#define TIMER0_PERIOD (ALT_CPU_FREQ / 8000) // set to <divisor> Hz.
void timer_init( int period )
/* where period is an integer with range 0..65535, in multiples of system clk.
This sets up timer0 which is used for the servo loop. The ISR is elsewhere.
*/
{
// stop timer
IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE, ALTERA_AVALON_TIMER_CONTROL_STOP_MSK);
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE, 0); // clears TO flag
// note: for simplicity only set the periodl register. This precludes
// any periods longer than (system clock)/65535.
IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_0_BASE, period);
IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_0_BASE, 0);
// set continuous mode and turn on the interrupt, it won't do anything till timer started
IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE, (ALTERA_AVALON_TIMER_CONTROL_CONT_MSK |
ALTERA_AVALON_TIMER_CONTROL_ITO_MSK));
}
void timer_start()
{
IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE, (IORD_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE) | ALTERA_AVALON_TIMER_CONTROL_START_MSK));
}
void timer_clear_interrupt( void )
{
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE, 0);
}
int timer_snapshot( void )
{
IOWR_ALTERA_AVALON_TIMER_SNAPL(TIMER_0_BASE, 0); // capture snapshot
return ((IORD_ALTERA_AVALON_TIMER_SNAPH(TIMER_0_BASE) << 16) + IORD_ALTERA_AVALON_TIMER_SNAPL(TIMER_0_BASE));
}
int main(void)
{
timer_init( TIMER0_PERIOD );
alt_irq_register(TIMER_0_IRQ, (void *)0, timer_ISR);
timer_start();
more_init_stuff_here();
for(;;)
{
// main loop
}
}
void timer_ISR( void *context, uint32 id )
{
static unsigned int isr_count = 0;
int fader;
timer_clear_interrupt();
snap0 = timer_snapshot(); // for execution profiling
++isr_count;
// toggle LED
}
timer_ISR only gets called once (the LED only turns on and off once and then remains off). I've tried everything. Is there something I'm missing? Something simple maybe? The CONT bit means the timer is continuous, right? I'm really stuck and would appreciate any enlightenment. Thanks ahead of time. dave
Link Copied
0 Replies
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page