2023-05-05 02:09 AM
2023-05-05 06:17 AM
I didn't see your code, but it seems you are trying to stop current system clock. If this is the case, you can't.
2023-05-05 06:21 AM
here is the code :
/* Put system in low power wait mode until next round of test */
#include "Micro_hw_defs.h" //Micro-specific HW configuration
#include "stm8l15x_clk.h"
#include "stm8l15x_flash.h"
//Sleep until woken up by an event
//Can't call non-RAM functions! Only FLASH_PowerRunModeConfig() is certified for that
IN_RAM(void sleep(void))
{
//1 - Enter Low Power Run Mode
//Be in RAM, done by the prototype modifier
#ifdef TEST_WITHOUT_MOTHERBOARD
//Switch clock to LSI
CLK->CKDIVR = (uint8_t)CLK_SYSCLKDiv_1;
CLK->SWR = (uint8_t)CLK_SYSCLKSource_LSI;
while(CLK->SCSR != CLK_SYSCLKSource_LSI);
#else
//Switch clock to LSE
CLK->CKDIVR = (uint8_t)CLK_SYSCLKDiv_1;
CLK->SWR = (uint8_t)CLK_SYSCLKSource_LSE;
while(CLK->SCSR != CLK_SYSCLKSource_LSE);
#endif
//Switch off peripherals
SPI1->CR1 &= (uint8_t)(~SPI_CR1_SPE); //the other drivers are already off when not used
CLK->PCKENR1 = 0x00;
CLK->PCKENR2 = 0x00;
//Switch off HSI
CLK->ICKCR &= (uint8_t)(~CLK_ICKCR_HSION);
while((CLK->ICKCR & CLK_ICKCR_HSIRDY) == CLK_ICKCR_HSIRDY); //don't know why it doesn't fall
//Mask all interrupts
disableInterrupts();
//Switch off flash
FLASH_PowerRunModeConfig(FLASH_Power_IDDQ);
while((CLK->REGCSR & CLK_REGCSR_EEREADY) == CLK_REGCSR_EEREADY);
//Configure regulator ultra-low power mode
CLK->REGCSR |= CLK_REGCSR_REGOFF;
while((CLK->REGCSR & CLK_REGCSR_REGREADY) == CLK_REGCSR_REGREADY);
//2 - Enter (and leave on event) Low Power Wait Mode
wfe();
//Clear RTC Wake Up Event
RTC->ISR2 = 0; //We don't use the other bits
//3 - Exit Low Power Run Mode
//Switch on main regulator
CLK->REGCSR &= (uint8_t)(~CLK_REGCSR_REGOFF);
while((CLK->REGCSR & CLK_REGCSR_REGREADY) == 0);
//Switch on flash
FLASH_PowerRunModeConfig(FLASH_Power_On);
while((CLK->REGCSR & CLK_REGCSR_EEREADY) == 0);
//Switch on HSI
CLK->ICKCR |= CLK_ICKCR_HSION;
while((CLK->ICKCR & CLK_ICKCR_HSIRDY) == 0);
//Switch clock to HSI
CLK->CKDIVR = (uint8_t)CLK_SYSCLKDiv_2;
CLK->SWR = (uint8_t)CLK_SYSCLKSource_HSI;
while(CLK->SCSR != CLK_SYSCLKSource_HSI);
//reset interrupt mask
enableInterrupts();
//switch on peripherals
SPI1->CR1 |= SPI_CR1_SPE;
CLK->PCKENR1 = CLK_GATING_REG1;
CLK->PCKENR2 = 0x04; //RTC
}
in the datasheet to enter low power run mode you must disable high speed oscillator
2023-05-05 06:47 AM
You are not following the instructions to switch clock, see RM0031 pages 93 and 94. CLK_SWCR is not used in you code. It seems current system clock is still HSI.
2023-05-05 07:19 AM
SWEN is lset to 1 before this function
SWEN==1
SWR=LSI
check SCSR == LSI
and in the register SCSR == LSI
so we are using the LSI clock