2025-04-11 12:05 PM - last edited on 2025-04-11 3:09 PM by mƎALLEm
Hi
I am wanting to use the LPTIM to break out of STOP2. I have a function to set the timer, and go into stop mode. After setting LPTIM1->ARR, LPTIM_ISR_ARROK in the LPTIM1->ISR is never set. After X amount of seconds, the STOP2 exits as expected, but the PWR_SR1_WUF in the PWR->SR1 is never set. The timer interupt is called when the STOP2 exits. Here is my code, not sure what I am doing wrong, anyone help?:
#define PWR_CR2_LPTIM1WUF_Pos (5U)
#define PWR_CR2_LPTIM1WUF (1UL << PWR_CR2_LPTIM1WUF_Pos)
//always gets called when STOP2 exits
void LPTIM1_IRQHandler(void)
{
// Just clear the interrupt to prevent re-entry
if (LPTIM1->ISR & LPTIM_ISR_ARRM) {
LPTIM1->ICR = LPTIM_ICR_ARRMCF;
}
}
void LPTIM1_StartSTOP2Timeout_ms(uint32_t ms)
{
// Enable LPTIM1 and its clock
RCC->APB1ENR1 |= RCC_APB1ENR1_LPTIM1EN;
// Enable LSI clock
RCC->CSR |= RCC_CSR_LSION;
while (!(RCC->CSR & RCC_CSR_LSIRDY));
// Select LSI as LPTIM1 clock
RCC->CCIPR &= ~RCC_CCIPR_LPTIM1SEL;
RCC->CCIPR |= (0b01 << RCC_CCIPR_LPTIM1SEL_Pos);
// Enable LPTIM1
LPTIM1->CR = LPTIM_CR_ENABLE;
// Set prescaler /32 (1ms tick)
LPTIM1->CFGR &= ~LPTIM_CFGR_PRESC;
LPTIM1->CFGR |= (0b101 << LPTIM_CFGR_PRESC_Pos); // /32
// Clear status flags
LPTIM1->ICR = 0xFFFFFFFF;
// Set ARR and wait for it to latch
LPTIM1->ARR = ms;
long Tick=0xfffff; <<even increased
while (!(LPTIM1->ISR & LPTIM_ISR_ARROK))
if(!--Tick)
break; // << always breaks , and LPTIM1->ISR always 0
// Allow wakeup from LPTIM1
PWR->CR2 |= PWR_CR2_LPTIM1WUF;
NVIC_EnableIRQ(LPTIM1_IRQn);
LPTIM1->IER |= LPTIM_IER_ARRMIE;
if (PWR->SR1 & PWR_SR1_WUF) {
PWR->SCR |= PWR_SCR_CWUF; // Clear the wake-up flag before entering STOP2
}
// Set STOP2 mode
PWR->CR1 &= ~PWR_CR1_LPMS;
PWR->CR1 |= PWR_CR1_LPMS_STOP2;
// Confirm STOP2 mode is active
if ((PWR->CR1 & PWR_CR1_LPMS) == PWR_CR1_LPMS_STOP2) {
printf("Entered STOP2 mode\n"); <<< gets called
} else {
printf("STOP2 mode not entered\n");
}
// Enable deep sleep
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
// Start timer in one-shot mode
LPTIM1->CR |= LPTIM_CR_SNGSTRT;
HAL_SuspendTick();
// Enable deep sleep mode (SLEEPDEEP bit in SCR)
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
// Enter STOP2 mode
printf("Entering STOP2 mode...\n");
HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI); // Enter STOP2 mode with the WFI entry (Wait For Interrupt)
// --- 6. After Wake-up: Handle timeout and clear wake-up flag ---
if (PWR->SR1 & PWR_SR1_WUF) {
// Clear the wake-up flag
PWR->SCR |= PWR_SCR_CWUF; << never gets called
}
HAL_ResumeTick();
SystemClock_Config();
}
Many thanks
Scott