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的功耗对比情况,供参考