STM32 睡眠模式
第1章 低功耗模式簡(jiǎn)介
在 STM32 的正常工作中,具有四種工作模式:運(yùn)行、睡眠、停止和待機(jī)模式。
在系統(tǒng)或電源復(fù)位以后,微控制器處于運(yùn)行狀態(tài),當(dāng)CPU不需繼續(xù)運(yùn)行時(shí),可以利用多種低功耗模式來節(jié)省功耗。這些低功耗模式電源消耗不同、喚醒時(shí)間不同和喚醒源不同。
例如等待某個(gè)外部事件時(shí),用戶需要根據(jù)最低電源消耗、最快速啟動(dòng)時(shí)間和可用的喚醒源等條件,所以需要根據(jù)自身的需要選定一個(gè)最佳的低功耗模式。
STM32F1有三種低功耗模式:
1、 睡眠模式(Cortex?-M3內(nèi)核停止,所有外設(shè)包括Cortex-M3核心的外設(shè),如NVIC、系統(tǒng)時(shí)鐘(SysTick)等仍在運(yùn)行)。
2、 停止模式(所有的時(shí)鐘都已停止)。
3、 待機(jī)模式(1.8V電源關(guān)閉)。
各種低功耗模式的對(duì)比如下表:
說明:
WFI和WFE都是系統(tǒng)指令,WFI是表示中斷,WFE表示事件。
第2章 睡眠模式簡(jiǎn)介
在睡眠模式下,所有的I/O引腳都保持它們?cè)谶\(yùn)行模式時(shí)的狀態(tài)。
2.1 進(jìn)入睡眠模式
進(jìn)入睡眠模式:
通過執(zhí)行WFI或WFE指令進(jìn)入睡眠狀態(tài)。根據(jù)Cortex? M3系統(tǒng)控制寄存器中的SLEEPONEXIT位的值,有兩種選項(xiàng)可用于選擇睡眠模式進(jìn)入機(jī)制:
1、SLEEP-NOW:如果SLEEPONEXIT位被清除,當(dāng)WRI或WFE被執(zhí)行時(shí),微控制器立即進(jìn)入睡眠模式。
2、SLEEP-ON-EXIT:如果SLEEPONEXIT位被置位,系統(tǒng)從最低優(yōu)先級(jí)的中斷處理程序中退出時(shí),微控制器就立即進(jìn)入睡眠模式。
兩種進(jìn)入睡眠模式的模式 WFI 和 WFE:
WFI(Wait for interrupt)和 WFE(Wait for event)都是內(nèi)核指令,會(huì)調(diào)用對(duì)應(yīng)匯編指令,具體描述可以查看**《CM3 權(quán)威指南》**。
進(jìn)入睡眠模式,內(nèi)核時(shí)鐘關(guān)閉,內(nèi)核停止,所有外設(shè)包括 Cortex M3 核心的外設(shè),如 NVIC、系統(tǒng)時(shí)鐘(SysTick)等仍在運(yùn)行,保留睡眠前的寄存器數(shù)據(jù)、內(nèi)存數(shù)據(jù)等。
2.1 退出睡眠模式
退出睡眠模式:
如果執(zhí)行WFI指令進(jìn)入睡眠模式,任意一個(gè)被嵌套向量中斷控制器響應(yīng)的外設(shè)中斷都能將系統(tǒng)從睡眠模式喚醒。
如果執(zhí)行WFE指令進(jìn)入睡眠模式,則一旦發(fā)生喚醒事件時(shí),微處理器都將從睡眠模式退出。
如何進(jìn)入和退出睡眠模式,細(xì)節(jié)參考如下表:
第3章 睡眠模式代碼示例
代碼如下:
main.c
KEYUP_Init();
while(1)
{
if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) == 0)
{
LED1 = 0;
__WFI();/* 進(jìn)入睡眠模式 */
LED1 = 1;
}
}
void KEYUP_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); /* 使能復(fù)用功能時(shí)鐘 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /* 使能按鍵端口時(shí)鐘 */
/* 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); /* 延時(shí)消抖 */
if(EXTI_GetFlagStatus(EXTI_Line0) == SET)
{
printf("退出睡眠模式\r\n");
}
EXTI_ClearITPendingBit(EXTI_Line0);/* 清除LINE0上的中斷標(biāo)志位 */
}
總結(jié)
實(shí)驗(yàn)現(xiàn)象:當(dāng)按鍵按下后,進(jìn)入睡眠模式,LED1點(diǎn)亮,PA0所在外部中斷觸發(fā)后退出睡眠模式,LED1熄滅。文章來源:http://www.zghlxwxcb.cn/news/detail-624602.html
睡眠模式相對(duì)比較簡(jiǎn)單些,直接調(diào)用一下系統(tǒng)指令__WFI就可以進(jìn)入睡眠了,退出只需一個(gè)任意外部中斷即可。文章來源地址http://www.zghlxwxcb.cn/news/detail-624602.html
到了這里,關(guān)于STM32 低功耗-睡眠模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!