This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

app_scheduler and TIMER1 hardfault

I have the code below initializing TIMER1 and and IRQ every 1ms. I call app_sched_event_put within the timer and I get a Hardfault.

Any hints on what is going on ?

Thanks.

void high_res_timer_init(){
    // Stop timers
    NRF_TIMER1->TASKS_STOP  = 1;
    // Clear timers
    NRF_TIMER1->TASKS_CLEAR = 1;
    // Set the timer1 in Timer Mode, and timer 2 in counter mode
    NRF_TIMER1->MODE        = TIMER_MODE_MODE_Timer;
    // Prescaler 4 produces 1MHz for timer1 frequency
    NRF_TIMER1->PRESCALER      = 4;
    // Ensure 16 bit mode on both timers
    NRF_TIMER1->BITMODE        = TIMER_BITMODE_BITMODE_16Bit;
    // 1ms interrupt
    NRF_TIMER1->CC[0] = 1000;
		NRF_TIMER1->INTENSET = (TIMER_INTENSET_COMPARE0_Enabled << TIMER_INTENSET_COMPARE0_Pos);
		NVIC_EnableIRQ(TIMER1_IRQn);
	
    // Start timers
    NRF_TIMER1->TASKS_START = 1;
}

void TIMER1_IRQHandler(void) {
	
	
	if ((NRF_TIMER1->EVENTS_COMPARE[0] != 0) && ((NRF_TIMER1->INTENSET & TIMER_INTENSET_COMPARE0_Msk) !=0)) {
		NRF_TIMER1->EVENTS_COMPARE[0] = 0;
		NRF_TIMER1->TASKS_CLEAR = 1;
		nt_time++;
		if (count++ > 20) {
			app_sched_event_put(&nt_time, sizeof(nt_time), mag_scheduler_event_handler);
			count = 0;
		}
		dpin_toggle();
	}
}
Parents
  • I'm not sure of the default interrupt priority off the top of my head, but when setting up the interrupt, the priority should be set to either app high or app low. Not sure how critical this particular functionality is but I'd suggest setting the priority to see if it helps in anyway: NVIC_SetPriority(TIMER1_IRQn, APP_IRQ_PRIORITY_LOW); //APP_IRQ_PRIORITY_LOW defined in app_util_platform.h

Reply
  • I'm not sure of the default interrupt priority off the top of my head, but when setting up the interrupt, the priority should be set to either app high or app low. Not sure how critical this particular functionality is but I'd suggest setting the priority to see if it helps in anyway: NVIC_SetPriority(TIMER1_IRQn, APP_IRQ_PRIORITY_LOW); //APP_IRQ_PRIORITY_LOW defined in app_util_platform.h

Children
No Data
Related