【STM32C0评测】sleep,standby,stop,run四种状态功耗检测

【STM32C0评测】sleep,standby,stop,run四种状态功耗检测

1 sleep,standby,stop,run四种工作状态

STM32C071 是一款基于 ARM Cortex-M0+ 内核的微控制器,它提供了多种工作模式以优化功耗和性能。以下是 STM32C071 的四种主要工作状态:Run、Sleep、Stop 和 Standby。

Run 状态:这是微控制器的正常工作状态,所有外设和内核都处于活动状态,以全速运行。在这种状态下,功耗相对较高,但性能也达到最佳。

Sleep 状态:在这种状态下,CPU 停止工作,但外设和内存保持活动状态。Sleep 状态可以显著降低功耗,同时保持对外设的快速响应。从 Sleep 状态唤醒通常只需要几微秒。

Stop 状态:Stop 状态比 Sleep 状态更进一步降低功耗。在这种状态下,CPU、外设和内存都停止工作,但某些外设(如 RTC、备份寄存器等)仍可保持运行。从 Stop 状态唤醒需要更长的时间,通常在毫秒级别。

Standby 状态:这是功耗最低的状态,几乎所有模块都停止工作,包括 CPU、外设、内存和振荡器。只有电源控制器和复位电路保持活动状态。从 Standby 状态唤醒需要最长的时间,通常在几十毫秒级别。Standby 状态适用于长时间不活动的应用,如电池供电设备。

在范例代码中,分别在运行和sleep,standby,stop状态切换,展示结果。状态时用标志位来置位而确定的。

检测的方法有两种,一种直接连STLINK一起测量,然后减去其数据

另一种是从开发板的JP5跳线断开,连接万用表的电流档测量。结果相差不大。

2 sleep状态及功耗

2.1 运行代码

int main(void)

{

HAL_Init();

SystemClock_Config();

__HAL_RCC_PWR_CLK_ENABLE();

BSP_LED_Init(LED1);

BSP_PB_Init(BUTTON_USER, BUTTON_MODE_EXTI);

__HAL_FLASH_PREFETCH_BUFFER_DISABLE();

while (1)

{

BSP_LED_Off(LED1);

HAL_SuspendTick();

HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);

HAL_ResumeTick();

BSP_LED_Init(LED1);

}

}

2.2 代码说明

通过中断进入睡眠模式并从中唤醒。

在相关软件中,系统时钟设置为 48 MHz。

一个 EXTI 线通过 PC.13 连接到用户按钮,并配置为在按键按下时在下降沿产生中断。

SysTick 被编程为每 1 ms 产生一次中断,并且在 SysTick 中断处理程序中,LED1 被切换以指示 MCU 是处于睡眠模式还是运行模式。

启动后 5 秒,系统自动进入睡眠模式,并且 LED1 停止切换。

用户可以在任何时候按下用户按钮来唤醒系统。

然后软件在运行模式下运行 5 秒,然后再自动进入睡眠模式。

LED1 用于监控系统状态,如下所示:

LED1 切换:系统处于运行模式

LED1 关闭:系统处于睡眠模式

2.3 效果

断开JP5位80uA,即0.8mA

3 standby状态及功耗

3.1 核心代码如下

int main(void)

{

HAL_Init();

SystemClock_Config();

BSP_LED_Init(LED1);

/* Enable Power Control clock */

__HAL_RCC_PWR_CLK_ENABLE();

/* Check if the system was resumed from Standby mode */

if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)

{

/* Clear Standby flag */

__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);

/* Check and Clear the Wakeup flag */

if (__HAL_PWR_GET_FLAG(PWR_FLAG_WUF2) != RESET)

{

__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WUF2);

}

}

HAL_Delay(5000);

HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN2_HIGH);

HAL_PWREx_EnablePullUpPullDownConfig();

HAL_PWREx_EnableGPIOPullUp(PWR_GPIO_C, GPIO_PIN_13);

__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WUF2);

BSP_LED_On(LED1);

while (1)

{

}

}

编译下载通过

3.2 代码说明

系统时钟设置为 48 MHz,一个 EXTI 线连接到 PC.13 引脚并配置为在下降沿产生中断。

SysTick 被编程为每 1 ms 产生一次中断,并且在 SysTick 中断处理程序中,LED1 被切换以指示 MCU 是处于待机模式还是运行模式。

当在 EXTI 线上检测到下降沿时,会产生一个中断并唤醒系统,然后程序检查并清除待机标志。

清除待机标志后,软件启用连接到 PC.13 的唤醒引脚 PWR_WAKEUP_PIN2,然后清除指示已从 PWR_WAKEUP_PIN2 接收到唤醒事件的相应标志。

最后,系统再次进入待机模式,导致 LED1 停止切换。

接下来,用户可以通过按下连接到唤醒引脚 PWR_WAKEUP_PIN2 的用户按钮来唤醒系统。

WKUP 引脚上的下降沿将从待机模式唤醒系统。

或者,外部复位也将导致系统唤醒。应用程序需要确保 SysTick 在从待机模式唤醒后,程序执行以与复位后相同的方式重新开始,LED1 重新开始切换。

LED1 用于监控系统状态,如下所示:

LED1 切换:系统处于运行模式

LED1 关闭:系统处于待机模式

LED1 打开:配置失败(系统将进入无限循环)

3.3 演示效果

断开测量1.35mA

4 stop状态及功耗

4.1 代码

int main(void)

{

HAL_Init();

BSP_LED_Init(LED1);

BSP_LED_Init(LED2);

SystemClock_Config();

BSP_PB_Init(BUTTON_USER, BUTTON_MODE_EXTI);

__HAL_RCC_PWR_CLK_ENABLE();

while (1)

{

HAL_Delay(5000);

BSP_LED_Off(LED1);

BSP_LED_Off(LED2);

HAL_SuspendTick();

HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);

SYSCLKConfig_STOP();

}

}

4.2 代码解析

如何使用中断进入停止模式并从中唤醒。

在相关软件中,系统时钟设置为 48 MHz,一个 EXTI 线通过 PC13 连接到用户按钮,并配置为在按键按下时在下降沿产生中断。

SysTick 被编程为每 1 ms 产生一次中断,并且在 SysTick 中断处理程序中,LED1 被切换以指示 MCU 是处于停止模式还是运行模式。

启动后 5 秒,系统自动进入停止模式,LED1 停止切换。

用户可以在任何时候按下用户按钮来唤醒系统。

然后软件在运行模式下运行 5 秒,然后再自动进入停止模式。

两个 LED(LED1 和 LED2)用于监控系统状态,如下所示:

LED2 亮起:配置失败(系统将进入无限循环)

LED1 切换:系统处于运行模式

LED1 关闭:系统处于停止模式

这些步骤在无限循环中重复。

编译并通过

4.3 效果

断开JP5电流最小,7.6uA

5 小结

这个代码都是通过置位函数实现置位,如下代码,分别控制流过的电流和功耗。

HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);

或者

HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);

在停止状态非常小,比正常运行小很多。可以通过不同的功耗对比实现不同的效果。最大工作电流1.35mA,最低停止低至7.6uA,而且可以迅速由软件切换,效果非常好,实现低功耗快速切换。

下面是包括stlink的功耗对比情况,供参考

相关推荐

10 款最佳 AI 女友应用和网站(2025 年 XNUMX 月)
xy蓝月传奇开服时间,开服最少的蓝月传奇(蓝月传奇每天几点开新区)
笔记本电脑散热板哪个牌子好?笔记本散热板十大名牌排行榜
为什么没人PK了?分析新老PK场究竟差距在哪