cancel
Showing results for 
Search instead for 
Did you mean: 

Stuck in Infinite_Loop

JustSomeGuy
Senior

I am using the B-L072Z-LRWAN1 and trying to code LPTIM with interrupts and no HAL. The code seems to be getting stuck in the Infinite_Loop section in the startup.s file. The comments around this loop say that an unexpected interrupt was triggered. If I remove the NVIC functions in lptim_init(), the controller does not get stuck anymore. I have tried:

-setting the IER register to 127 (all interrupt sources enabled) with a breakpoint on the lptimer IRQ handler. The handler is never called.

-declared & defined all possible IRQ_Handler functions in stm32l0xx_it.c with a while(1) inside each one, and watched all of them with breakpoints. nothing.

-putting the NVIC functions before or after setting the IER register. no change.

here is my code for the lptimer:

 

void lptim_init(LPTIM_TypeDef *LPTIM, lpTimerMode mode)
{
	uint32_t tmpcfg = 0;
	uint16_t tmpier = 0;

	//enale the oscillator for the peripheral
	__HAL_RCC_LPTIM1_CLK_ENABLE();

	//encoder mode disabled
	tmpcfg &= ~LPTIM_CFGR_ENC;
	//counter mode disabled
	tmpcfg &= ~LPTIM_CFGR_COUNTMODE;
	//preload ARR
	tmpcfg |= LPTIM_CFGR_PRELOAD;
	//set wave polarity.
	tmpcfg &= ~LPTIM_CFGR_WAVPOL;
	tmpcfg &= ~LPTIM_CFGR_WAVE;
	//disable trigger event reset
	tmpcfg &= ~LPTIM_CFGR_TIMOUT;
	//disable hardware triggers
	tmpcfg &= ~LPTIM_CFGR_TRIGEN;
	//clear trigger selection
	tmpcfg &= ~LPTIM_CFGR_TRIGSEL;
	//set prescalar division
	tmpcfg |= LPTIM_PRESCALER_DIV1;
	//clear trig filter settings
	tmpcfg &= ~LPTIM_CFGR_TRGFLT;
	//external clock settings; clear.
	tmpcfg &= ~LPTIM_CFGR_CKFLT;
	//external source clock polarity. not relevant
	tmpcfg &= ~LPTIM_CFGR_CKPOL;
	//clock selection: internal clock
	tmpcfg &= ~LPTIM_CFGR_CKSEL;

	//write the configurations to the register
	LPTIM->CFGR = tmpcfg;

	//set interrupts to trigger on every ARR match
	if(mode == lptim_mode_interrupt)
	{
		//select the interrupt trigger sources
		tmpier |= LPTIM_IER_ARRMIE;
		//write the configurations to the register
		LPTIM->IER = tmpier;

		NVIC_SetVector(LPTIM1_IRQn, (uint32_t)&LPTIM1_IRQ_Handler);
		NVIC_SetPriority(LPTIM1_IRQn, 3);
		NVIC_EnableIRQ(LPTIM1_IRQn);
		//set the interrupt vector
	}
}

void lptim_start(LPTIM_TypeDef *LPTIM, uint16_t period)
{
	//enable the timer
	LPTIM->CR = LPTIM_CR_ENABLE;

	LPTIM->ARR = period;

	//enable continuous mode
	LPTIM->CR |= LPTIM_CR_CNTSTRT;
}

void lptim_stop(LPTIM_TypeDef *LPTIM)
{
	//clear control register, disabling the timer.
	LPTIM->CR &= ~0b111U;
}

 

 and in the main() and before while(1) I have

 

  lptim_init(LPTIM1, lptim_mode_interrupt);
  lptim_start(LPTIM1, LPTIMER_PERIOD);

 

 Does anyone know why this is?

1 ACCEPTED SOLUTION

Accepted Solutions
gbm
Lead III

There is no interrupt handler properly defined in your code, so the default handler is invoked.

NVIC_SetVector normally doesn't work - remove it.

Rename your interrupt routine to the name found in startup_xxx.s file - LPTIM1_IRQHandler.

My STM32 stuff on github - compact USB device stack and more: https://github.com/gbm-ii/gbmUSBdevice

View solution in original post

3 REPLIES 3
gbm
Lead III

There is no interrupt handler properly defined in your code, so the default handler is invoked.

NVIC_SetVector normally doesn't work - remove it.

Rename your interrupt routine to the name found in startup_xxx.s file - LPTIM1_IRQHandler.

My STM32 stuff on github - compact USB device stack and more: https://github.com/gbm-ii/gbmUSBdevice

Should be LPTIM1_IRQHandler, check case

Do bisection of vectors in startup.s determine which ones make it to which infinite loop / Default_Handler

 

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..

Oh goodness. I've been staring at the code for too long and didn't notice that I wrote the IRQ handler function as LPTIM1_IRQ_Handler and not LPTIM1_IRQHandler. Thanks.