做了网站应该如何推广,媒体平台推广,培训课程,html5网页设计案例STM32 睡眠模式 文章目录 STM32 睡眠模式第1章 低功耗模式简介第2章 睡眠模式简介2.1 进入睡眠模式2.1 退出睡眠模式 第3章 睡眠模式代码示例总结 第1章 低功耗模式简介
在 STM32 的正常工作中#xff0c;具有四种工作模式#xff1a;运行、睡眠、停止和待机模式。
在系统或…STM32 睡眠模式 文章目录 STM32 睡眠模式第1章 低功耗模式简介第2章 睡眠模式简介2.1 进入睡眠模式2.1 退出睡眠模式 第3章 睡眠模式代码示例总结 第1章 低功耗模式简介
在 STM32 的正常工作中具有四种工作模式运行、睡眠、停止和待机模式。
在系统或电源复位以后微控制器处于运行状态当CPU不需继续运行时可以利用多种低功耗模式来节省功耗。这些低功耗模式电源消耗不同、唤醒时间不同和唤醒源不同。 例如等待某个外部事件时用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等条件所以需要根据自身的需要选定一个最佳的低功耗模式。
STM32F1有三种低功耗模式 1、 睡眠模式(Cortex™-M3内核停止所有外设包括Cortex-M3核心的外设如NVIC、系统时钟(SysTick)等仍在运行)。 2、 停止模式(所有的时钟都已停止)。 3、 待机模式(1.8V电源关闭)。
各种低功耗模式的对比如下表 说明 WFI和WFE都是系统指令WFI是表示中断WFE表示事件。
第2章 睡眠模式简介
在睡眠模式下所有的I/O引脚都保持它们在运行模式时的状态。
2.1 进入睡眠模式
进入睡眠模式 通过执行WFI或WFE指令进入睡眠状态。根据Cortex™ M3系统控制寄存器中的SLEEPONEXIT位的值有两种选项可用于选择睡眠模式进入机制 1、SLEEP-NOW如果SLEEPONEXIT位被清除当WRI或WFE被执行时微控制器立即进入睡眠模式。 2、SLEEP-ON-EXIT如果SLEEPONEXIT位被置位系统从最低优先级的中断处理程序中退出时微控制器就立即进入睡眠模式。
两种进入睡眠模式的模式 WFI 和 WFE WFI(Wait for interrupt)和 WFE(Wait for event)都是内核指令会调用对应汇编指令具体描述可以查看**《CM3 权威指南》**。
进入睡眠模式内核时钟关闭内核停止所有外设包括 Cortex M3 核心的外设如 NVIC、系统时钟SysTick等仍在运行保留睡眠前的寄存器数据、内存数据等。
2.1 退出睡眠模式
退出睡眠模式 如果执行WFI指令进入睡眠模式任意一个被嵌套向量中断控制器响应的外设中断都能将系统从睡眠模式唤醒。 如果执行WFE指令进入睡眠模式则一旦发生唤醒事件时微处理器都将从睡眠模式退出。
如何进入和退出睡眠模式细节参考如下表
第3章 睡眠模式代码示例 代码如下 main.cKEYUP_Init();
while(1)
{if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) 0){LED1 0;__WFI();/* 进入睡眠模式 */LED1 1;}
}void KEYUP_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); /* 使能复用功能时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /* 使能按键端口时钟 *//* PA0端口配置 */GPIO_InitStructure.GPIO_Pin GPIO_Pin_0; /* WK_UP引脚 */GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPD; /* 下拉输入 */GPIO_Init(GPIOA, GPIO_InitStructure); /* 初始化WK_UP按键端口 *//* PA0 中断线以及中断初始化配置 WK_UP */GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);EXTI_InitStructure.EXTI_Line EXTI_Line0; EXTI_InitStructure.EXTI_Mode EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd ENABLE; /* 使能中断线 */EXTI_Init(EXTI_InitStructure); /* 外部中断0 NVIC 配置 */NVIC_InitStructure.NVIC_IRQChannel EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority 2; NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; NVIC_Init(NVIC_InitStructure);
}void EXTI0_IRQHandler(void)
{delay_ms(20); /* 延时消抖 */if(EXTI_GetFlagStatus(EXTI_Line0) SET){printf(退出睡眠模式\r\n);}EXTI_ClearITPendingBit(EXTI_Line0);/* 清除LINE0上的中断标志位 */
}总结
实验现象当按键按下后进入睡眠模式LED1点亮PA0所在外部中断触发后退出睡眠模式LED1熄灭。
睡眠模式相对比较简单些直接调用一下系统指令__WFI就可以进入睡眠了退出只需一个任意外部中断即可。