0% found this document useful (0 votes)
30 views25 pages

Controllerstech-Co

Uploaded by

wakawuluh
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
30 views25 pages

Controllerstech-Co

Uploaded by

wakawuluh
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 25

email     

42세 이하인 경우 이 게임을 플레이하지 마십시오.


RAID: Shadow Legends

Ad

Low Power Modes in STM32


By default, the microcontroller is in Run mode after a system or a power-on reset. In
Run mode, the CPU is clocked by HCLK and the program code is executed. STM32
have Several low power modes are available to save power, when the CPU does not
need to be kept running, for example when waiting for an external event. Today in
this tutorial we are going to discuss these modes.

There are 3 Low Poer Modes available in STM32, and they are as follows

ADVERTISEMENT

Ads by

Know Your Future: Free Tarot Reading


SLEEP MODE -> FPU core stopped, peripherals kept running
astrozop.com
This website uses cookies to improve your experience. If you continue to use this site, you agree with it.
Ok
Privacy PolicySTOP MODE -> all clocks are stopped
Ad
STANDBY MODE -> 1.2 V domain powered off
keyboard_arrow_up

SLEEP MODE
I will first start with the simplest one, which is SLEEP MODE. In this mode, CPU CLK
is turned OFF and there is no effect on other clocks or analog clock sources. The
current consumption is HIGHEST in this mode, compared to other Low Power
Modes.

Entry
In order to enter the SLEEP MODE, we must disable the systick interrupt first, or
else this interrupt will wake the MCU every time the interrupt gets triggered.

HAL_SuspendTick();

Next, we will enter the sleep mode by executing the WFI (Wait For Interrupt), or WFE
(Wait For Event) instructions. If the WFI instruction was used to enter the SLEEP
MODE, any peripheral interrupt acknowledged by the NVIC can wake up the device.

HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);

Wakeup
As mentioned above, I have entered the SLEEP MODE using the WFI instruction, so
the device will wakeup whenever any interrupt is triggered.

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)


{
HAL_ResumeTick();
}

Inside the callback function we can resume the systick, so that we can use the
delay function again for the rest of the code.

SLEEPONEXIT
This is another feature available in SLEEP MODE, where the MCU will wake up
when the interrupt is triggered, it will process the ISR, and go back to sleep when the
ISR exits. This is useful when we want the controller to run only in the interrupt
mode.

HAL_PWR_EnableSleepOnExit ();

The above function must be called before going into the SLEEP MODE to activate
the sleeponexit feature. We can disable it by calling

HAL_PWR_DisableSleepOnExit ();

The entire code for the SLEEP MODE, with SLEEPONEXIT feature is shown below

main function
uint8_t Rx_data;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)


{
HAL_UART_Receive_IT(huart, &Rx_data, 1);
str = "WakeUP from SLEEP by UART\r\n";
HAL_UART_Transmit(&huart2, (uint8_t *)str, strlen (str), HAL_MAX_DELA
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)


{
str = "WakeUP from SLEEP by EXTI\r\n";
HAL_UART_Transmit(&huart2, (uint8_t *)str, strlen (str), HAL_MAX_DELA
HAL_PWR_DisableSleepOnExit ();
}

int main ()
{
......
......
HAL_UART_Receive_IT(&huart2, &Rx_data, 1);
while (1)

Below is the result of the above code.

sleep mode result

Basically, when the MCU wakes up because of the UART interrupt, it goes back to
sleep after processing the ISR (i.e after printing the string), but when it wakes up due
to the EXTI, the SLEEPONEXIT is disabled, and rest of the main function is
executed as usual.

Check out the Video Below

SLEEP Mode in STM32F103 || CubeIDE || Low Power Mode || …


Share
Ad

Personalized Content Tailored to Your


Preferences - All in One Place
DiscoveryFeed

STOP MODE
In Stop mode, all clocks in the 1.2 V domain are stopped, the PLLs, the HSI and the
HSE RC oscillators are disabled. Internal SRAM and register contents are
preserved. STOP MODE have may different categories depending on what should
be turned off. Below is the picture from the STM32F446RE reference manual
stop mode f4

Entry
Just like sleep mode, In order to enter the STOP MODE, we must disable the
systick interrupt, or else this interrupt will wake the MCU every time the interrupt
gets triggered.

HAL_SuspendTick();

Next, we will enter the sleep mode by executing the WFI (Wait For Interrupt), or WFE
(Wait For Event) instructions. If the WFI instruction was used to enter the STOP
MODE, EXTI, Independent watchdog (IWDG), or RTC can wake up the device. Also
I am using the first mode as shown in the picture above i.e. The main Regulator will
be turned off and only the LOW Power Regulator will be running.

HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);

Wakeup
As mentioned above, I have entered the STOP MODE using the WFI instruction, so
the device will wakeup whenever any interrupt is triggered by an EXTI, Independent
watchdog (IWDG), or RTC.
We must reconfigure the SYSTEM CLOCKS after wakeup, as they were disabled
when entering the STOP MODE. Also don’t forget to resume the systick.

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)


{
if(GPIO_Pin == GPIO_PIN_13)
{
SystemClock_Config ();
HAL_ResumeTick();
}
}

SLEEPONEXIT
SleeponExit works the same way as it does for the SLEEP mode. You can check the
implementation above under the SLEEP mode.

The entire code for STOP MODE is as shown below

main function

void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)


{
SystemClock_Config ();
HAL_ResumeTick();
char *str = "WAKEUP FROM RTC\n NOW GOING IN STOP MODE AGAIN\n\n";
HAL_UART_Transmit(&huart2, (uint8_t *) str, strlen (str), HAL_MAX_DE

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)


{
if(GPIO_Pin == GPIO_PIN_13)
{
SystemClock_Config ();
HAL_ResumeTick();
char *str = "WAKEUP FROM EXTII\n\n";
HAL_UART_Transmit(&huart2, (uint8_t *) str, strlen (str), HAL_MAX_
HAL_PWR_DisableSleepOnExit();
}
}

int main ()
{

The RTC Setup is very long, and it is explained in the VIDEO. DO check the video
below to understand it.

stop mode working

When the MCU enters the STOP MODE, it can be woken up by either RTC periodic
trigger, or by EXTI line. When the former wakes the MCU, the interrupt is
processed, where it will print the string, and than goes back in the STOP MODE.
Whereas, when the EXTI line wakes the device, the sleeponexit will be disabled,
and the main loop will run.

Check out the Video Below


Scientists First Thought They Were Statues
Investing Magazine

Ad

STANDBY MODE
The Standby mode allows to achieve the lowest power consumption. It is based on
the Cortex®-M4 with FPU deepsleep mode, with the voltage regulator disabled. The
1.2 V domain is consequently powered off. The PLLs, the HSI oscillator and the HSE
oscillator are also switched off.

Entry
Before entering the STANDBY MODE, we must disable the wakeup flags as shown
below
/* Clear the WU FLAG */
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);

/* clear the RTC Wake UP (WU) flag */


__HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&hrtc, RTC_FLAG_WUTF);

Next, enable the wakeup pin, or the RTC periodic wakeup (if you want to use RTC)

/* Enable the WAKEUP PIN */


HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);

/* enable the RTC Wakeup */


/* RTC Wake-up Interrupt Generation:
Wake-up Time Base = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSI))
==> WakeUpCounter = Wake-up Time / Wake-up Time Base

To configure the wake up timer to 5s the WakeUpCounter is set to 0x2


RTC_WAKEUPCLOCK_RTCCLK_DIV = RTCCLK_Div16 = 16
Wake-up Time Base = 16 /(32KHz) = 0.0005 seconds
==> WakeUpCounter = ~5s/0.0005s = 20000 = 0x2710
*/
if (HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0x2710, RTC_WAKEUPCLOCK_RTCCLK_DI
{
Error_Handler();
}

and finally enter the STANDBY MODE

HAL_PWR_EnterSTANDBYMode();

Wakeup
The standby wakeup is same as a system RESET. The entire code runs from the
beginning just as if it was a RESET. The only difference between a reset and a
STANDBY wakeup is that, when the MCU wakesup, The SBF status flag in the
PWR power control/status register (PWR_CSR) is set. The wakeup can be
triggered by WKUP pin rising edge, RTC alarm (Alarm A and Alarm B), RTC
wakeup, tamper event, time stamp event, external reset in NRST pin, IWDG reset.

The entire code for the STANDBY MODE is as shown below

main function

int main ()
{
..............
.............
if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)
{
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); // clear the flag

/** display the string **/


char *str = "Wakeup from the STANDBY MODE\n\n";
HAL_UART_Transmit(&huart2, (uint8_t *)str, strlen (str), HAL_MAX_D

/** Blink the LED **/


for (int i=0; i<20; i++)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
HAL_Delay(200);
}

/** Disable the WWAKEUP PIN **/


HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); // disable PA0

/** Deactivate the RTC wakeup **/


standby mode

200+ Free Online Games


@game_zop

Ad

Check out the Video Below


DOWNLOAD SECTION

Delicious Fresh Fruit Salad Recipe


KetoJust

Ad

DOWNLOAD DONATE

Related Posts:

FLASH Programming in STM32


STM32 Timers #10. Timer in Gated
Mode

STM32 as I2C SLAVE || PART 1

W25Q Flash Series || Part 5 || how


to update sectors

WS2812 LEDs using SPI

STM32 Communication using HC-


05
W25Q Flash Series || Part 7 ||
QUADSPI Write, Read, Memory

W25Q Flash Series || Part 8 ||


QUADSPI External Loader

17 Comments. Leave
new

César Braojos Corroto


September 19, 2023 4:39 PM

Hello , isue a dual-core st (


stm32h7) i need put all system in
standby mode , but i only use
m4core. My m7 core don´t have app
yet.

I use the hal function (


HAL_PWR_EnterStandbyMode), my
consumption does not go down,
which means that the system does
not go to full standby..
how can i do?

Reply

DJSG
April 24, 2023 2:08 PM

For sleep mode, you use an


arbitrary GPIO pin to wake up MCU.
Can I use any pin to wake it up from
standby mode?

Reply

Liz
June 20, 2022 10:19 PM

Hi! Using this example is possible to


standby minutes or hours??
Because I tried to change the time of
the standby and it only works from
1-30 seconds

Reply

admin
June 20, 2022 11:33 PM

The definition of
HAL_RTCEx_SetWakeUpTimer_IT
function is as follows:
HAL_RTCEx_SetWakeUpTimer_IT
(RTC_HandleTypeDef * hrtc,
uint32_t WakeUpCounter,
uint32_t WakeUpClock)
The “WakeUpCounter” is 32 bit
variable, so you can’t input
higher value than that.
You can adjust the clock and
other things as mentioned in the
comment section (where I have
used this function) to set the
time as per your need.

Reply

Liz
June 21, 2022 8:41 PM

Thanks!

Reply

Mariusz
March 27, 2022 2:07 AM

==> WakeUpCounter = ~5s/0.0005s


= 20000 = 0x2710
????

Reply

Tuan
June 16, 2022 11:52 AM

==> WakeUpCounter =
~5s/0.0005s = 10000 = 0x2710

Reply

zekoli
February 9, 2022 1:07 PM

Hi. I boot with stm32L010C6Tx. I


am in standby mode. While
waiting in standby mode, it shows
between 3.1 micro amps and 50
micro amps 50 microamps is too
high, I can’t use it like this. . I
turned off all peripherals. What
else should I turn off? Why coul
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void
MX_LPUART1_UART_Init(void);
static void MX_I2C1_Init(void);
static void MX_ADC_Init(void);
static void MX_RTC_Init(void);
if
(__HAL_PWR_GET_FLAG(PWR_FLAG_SB)
!= RESET) {
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
printf(“Wakeup from the STANDBY
MODE\n\n”);
for (int i = 0; i < 20; i++) {
HAL_GPIO_TogglePin(GPIOC,
GPIO_PIN_13);
HAL_Delay(200);
}
HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);
HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);
}
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
__HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&hrtc,
RTC_FLAG_WUTF);
printf(“About to enter the STANDBY
MODE\n\n”);
for (int i = 0; i < 5; i++) {
HAL_GPIO_TogglePin(GPIOC,
GPIO_PIN_13);
HAL_Delay(750);
}
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
if
(HAL_RTCEx_SetWakeUpTimer_IT(&hrtc,
0x5A55,
RTC_WAKEUPCLOCK_RTCCLK_DIV16)
!= HAL_OK) {
Error_Handler();
}
printf(“STANDBY MODE is ON\n\n”);

HAL_GPIO_DeInit(GPIOC,
GPIO_PIN_13);
HAL_GPIO_DeInit(GPIOA,
SDIO_Pin);
HAL_GPIO_DeInit(GPIOA,GPO3_Pin);
HAL_GPIO_DeInit(GPIOA,BUZZER_Pin);
HAL_GPIO_DeInit(GPIOA,
GPIO_PIN_0);
HAL_GPIO_DeInit(GPIOA,
CSB_Pin);
HAL_GPIO_DeInit(GPIOA,FCSB_Pin);
HAL_GPIO_DeInit(GPIOA,SCLK_Pin);
HAL_UART_DeInit(&hlpuart1);
HAL_I2C_DeInit(&hi2c1);
HAL_ADC_DeInit(&hadc);

HAL_PWR_EnterSTANDBYMode();

Reply

Dhamodharan Krishnan
August 23, 2021 7:43 AM
Awesome explanation!

Reply

Muhammad Ahmed
June 1, 2021 3:26 PM

Thanks

Reply

Darryl
December 22, 2020 4:56 AM

I tried pay pal for donation but it


failed. will try something else

Reply

Alex
November 30, 2020 2:29 AM

Many thanks!
But, I tried to wakeup stm32L053
(nucleo stm32l053) from ALARM A
and… nothing! Of course, I used the
directives:
__HAL_RTC_ALARM_CLEAR_FLAG(&hrtc,
RTC_FLAG_ALRAF);
__HAL_RTC_ALARMA_ENABLE(&hrtc)

before
HAL_PWR_EnterSTANDBYMode().

(The line “if


(HAL_RTCEx_SetWakeUpTimer_IT(&hrtc,
0x2710, … ” was commented to
eleminate effects of WakeUpTimer).
Why this problem appeared?

Reply

adam
September 5, 2020 3:22 PM

Thanks your time for your excellent


explanation. I found some problem
for the standby. Each time when turn
on the MCU, it will print “wakeup
from standby”, Actually it should not
happen until enter standby then exit
from standby mode. Also each time
when wake up by Wakeup pin (rising
PA0 ) it prints “wakeup from
standby” twice. So far I haven’t
found how to fix that.

Reply

admin
September 6, 2020 10:03 AM

that’s an unusual behavior. I


would recommend that you
debug your code. reset the mcu
and step over each function.
while doing so, check the
contents of PWR_CSR register.
The SBF bit is set when the
mcu wakes up from standby.
SO in case of reset, this
shouldn’t be set.

Reply
abdullah
June 27, 2020 4:46 PM

stand_by modda 2mA e kadar


düşüyor. vidyoda uA seviyelerinde
görünüyor. kod aynı olduğu halde
2mA görüyorum. yardım edermisiniz

Reply

admin
June 28, 2020 12:12 AM

maybe urs is not entering the


standby.. blink some LED
before entering the sleep mode
so that you can confirm this

Reply

Mati
May 27, 2020 5:19 PM

Really nice work. You deserve for


much more viewers :O

Reply

Leave a Reply
Your email address will not be
published. Required fields are
marked *

Comment *
Name *

Email *

Post Comment

HOME

ABOUT US

Privacy Policy

SHOP WITH US

DONATE HERE

CONTACT US

    email
Search 

© 2017 All rights reserved


Privacy Policy

You might also like