cancel
Showing results for 
Search instead for 
Did you mean: 

Needed LPTIMER valid reinitialize sequence

npatil15
Associate III

Hello,

I have problem statement, in which I have to re-Initialize lptimer for different timer value, as per current scenario, I have

Clock: 32Khz (LSI)

Divisor = 128

Period: Any time as per dynamic input.

 

So I want information about how I can safely reset the lptimer and then again re-init for different timer. Here is the reference lptimer code. where

/* uint32_t effectiveFreq = 32000/ 128; // 250 Hz uint32_t tickTimeInMS = 1000 / effectiveFreq; // 4 ms*/ #define TICK_TIME_IN_MS 4 void ReInit_LPTIM1(uint32_t timerInMS) { /*lptimer reset block start*/ HAL_LPTIM_IC_Stop_IT(&hlptim1, LPTIM_CHANNEL_1); __HAL_LPTIM_DISABLE(&hlptim1); if (HAL_LPTIM_DeInit(&hlptim1) != HAL_OK) { Error_Handler(); } __HAL_RCC_LPTIM1_FORCE_RESET(); __HAL_RCC_LPTIM1_RELEASE_RESET(); /*lptimer reset block end*/ LPTIM_OC_ConfigTypeDef sConfig1 = {0}; hlptim1.Instance = LPTIM1; hlptim1.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC; hlptim1.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV128; hlptim1.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE; hlptim1.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE; hlptim1.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL; hlptim1.Init.Input1Source = LPTIM_INPUT1SOURCE_GPIO; hlptim1.Init.Input2Source = LPTIM_INPUT2SOURCE_GPIO; hlptim1.Init.RepetitionCounter = 0; hlptim1.Init.Period = timerInMS/TICK_TIME_IN_MS - 1 ; if (HAL_LPTIM_Init(&hlptim1) != HAL_OK) { Error_Handler(); } sConfig1.Pulse = hlptim1.Init.Period; sConfig1.OCPolarity = LPTIM_OCPOLARITY_HIGH; if (HAL_LPTIM_OC_ConfigChannel(&hlptim1, &sConfig1, LPTIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } __HAL_LPTIM_ENABLE_IT(&hlptim1, LPTIM_IT_CC1); HAL_LPTIM_IC_Start_IT(&hlptim1, LPTIM_CHANNEL_1); }
View more

Here, adding reset block is not working correctly, and if we remove this reset block then it works fine. But I want it should be clear/reset before re-initialize for safe working for longer run.

Thanks

Nitin 

 

1 ACCEPTED SOLUTION

Accepted Solutions
ahsrabrifat
Senior II

 

Here’s a modified ReInit_LPTIM1() approach that should work more reliably and be safe for long-term use without hard-resetting the peripheral at the RCC level:

 

 
void ReInit_LPTIM1(uint32_t timerInMS) { // Step 1: Disable LPTIM and stop channel __HAL_LPTIM_DISABLE(&hlptim1); HAL_LPTIM_IC_Stop_IT(&hlptim1, LPTIM_CHANNEL_1); // Step 2: Disable interrupt __HAL_LPTIM_DISABLE_IT(&hlptim1, LPTIM_IT_CC1); // Step 3: DeInit peripheral if (HAL_LPTIM_DeInit(&hlptim1) != HAL_OK) { Error_Handler(); } // Step 4: Reconfigure peripheral without RCC force-reset LPTIM_OC_ConfigTypeDef sConfig1 = {0}; hlptim1.Instance = LPTIM1; hlptim1.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC; hlptim1.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV128; hlptim1.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE; hlptim1.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE; hlptim1.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL; hlptim1.Init.Input1Source = LPTIM_INPUT1SOURCE_GPIO; hlptim1.Init.Input2Source = LPTIM_INPUT2SOURCE_GPIO; hlptim1.Init.RepetitionCounter = 0; // Step 5: Calculate and set new period hlptim1.Init.Period = timerInMS / TICK_TIME_IN_MS - 1; if (HAL_LPTIM_Init(&hlptim1) != HAL_OK) { Error_Handler(); } sConfig1.Pulse = hlptim1.Init.Period; sConfig1.OCPolarity = LPTIM_OCPOLARITY_HIGH; if (HAL_LPTIM_OC_ConfigChannel(&hlptim1, &sConfig1, LPTIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } // Step 6: Re-enable interrupt and start again __HAL_LPTIM_ENABLE_IT(&hlptim1, LPTIM_IT_CC1); HAL_LPTIM_IC_Start_IT(&hlptim1, LPTIM_CHANNEL_1); }
View more

 

 

View solution in original post

1 REPLY 1
ahsrabrifat
Senior II

 

Here’s a modified ReInit_LPTIM1() approach that should work more reliably and be safe for long-term use without hard-resetting the peripheral at the RCC level:

 

 
void ReInit_LPTIM1(uint32_t timerInMS) { // Step 1: Disable LPTIM and stop channel __HAL_LPTIM_DISABLE(&hlptim1); HAL_LPTIM_IC_Stop_IT(&hlptim1, LPTIM_CHANNEL_1); // Step 2: Disable interrupt __HAL_LPTIM_DISABLE_IT(&hlptim1, LPTIM_IT_CC1); // Step 3: DeInit peripheral if (HAL_LPTIM_DeInit(&hlptim1) != HAL_OK) { Error_Handler(); } // Step 4: Reconfigure peripheral without RCC force-reset LPTIM_OC_ConfigTypeDef sConfig1 = {0}; hlptim1.Instance = LPTIM1; hlptim1.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC; hlptim1.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV128; hlptim1.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE; hlptim1.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE; hlptim1.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL; hlptim1.Init.Input1Source = LPTIM_INPUT1SOURCE_GPIO; hlptim1.Init.Input2Source = LPTIM_INPUT2SOURCE_GPIO; hlptim1.Init.RepetitionCounter = 0; // Step 5: Calculate and set new period hlptim1.Init.Period = timerInMS / TICK_TIME_IN_MS - 1; if (HAL_LPTIM_Init(&hlptim1) != HAL_OK) { Error_Handler(); } sConfig1.Pulse = hlptim1.Init.Period; sConfig1.OCPolarity = LPTIM_OCPOLARITY_HIGH; if (HAL_LPTIM_OC_ConfigChannel(&hlptim1, &sConfig1, LPTIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } // Step 6: Re-enable interrupt and start again __HAL_LPTIM_ENABLE_IT(&hlptim1, LPTIM_IT_CC1); HAL_LPTIM_IC_Start_IT(&hlptim1, LPTIM_CHANNEL_1); }
View more