【发布时间】:2021-11-04 19:23:14
【问题描述】:
我曾经在 arduino 上有一个项目,使用 atmega328p 芯片,代码如下:
// used for deep sleep
#include <avr/wdt.h>
static void go_to_sleep_and_power_down_and_wake_up_again_in_2_seconds()
{
// wake up again in 4 seconds
wdt_enable(WDTO_4S);
// go to deep sleep
{
// BIG difference when in sleep
// Diable ADC (analog to digital converter)
ADCSRA &= ~(1 << 7);
SMCR |= (1 << 2); // power down mode
SMCR |= 1; // enable sleep;
// BOD DISABLE (big difference when in sleep only)
MCUCR |= (3 << 5); // set both BODS and BODSE at the same time
MCUCR = (MCUCR & ~(1 << 5)) | (1 << 6); // then set the BODS bit and clear the BOSE bit at the same time
__asm__ __volatile__("sleep");
}
// this line should not execute
}
void setup()
{
// init code...
// read sensor value
// pseudo code:
if(valueReadFromSensor == 0)
{
turnOnAlarm();
return;
}
go_to_sleep_and_power_down_and_wake_up_again_in_2_seconds()
}
void loop(){
// not used
}
代码非常简单,一旦唤醒,它就会从传感器读取数据并重新进入睡眠状态。 2 秒后,它再次唤醒并重复相同的过程。
例如,我如何在 bluepill 上的 stm32 上做同样的事情?我已经设法使用此功能HAL_PWR_EnterSTANDBYMode(); 进入待机模式。但是,例如,我怎样才能在 2 秒内再次唤醒?
编辑
我试过这个来源:
使用旧版本的 stm32 cube ide 和不同的板。我尝试了执行相同步骤的视频,并且一些定义使代码无法编译。 https://www.youtube.com/watch?v=zQ1sT9fjd3E
我没有使用 freeRtos https://electronics.stackexchange.com/a/562120/56969
【问题讨论】:
-
可能有帮助的讨论:stm32duino.com/viewtopic.php?t=922
-
我不确定是否存在 1:1 匹配的能力,但我对 TI MCU 所做的是在进入程序循环之前保存当前的活动电源状态。在程序循环结束时,我让 MCU 进入睡眠状态。为了触发唤醒,我设置了一个在 10 秒后触发的中断,并在中断处理程序中将 MCU 恢复到之前的活动电源状态,这会强制程序循环再次执行(在程序循环结束时再次进入睡眠状态)。这是一种常见的策略,它允许保持 ISR 函数很小,本质上只是设置标志来触发主循环中的处理。
-
这看起来像你想要的 STM32 wake up from standby by RTC -- 或者关闭。
标签: c++ stm32 platformio standby