STM32L051低功耗STOP模式串口中斷喚醒

STM32L051進(jìn)入STOP模式后递览,除去通過(guò)RTC喚醒冀瓦,還可通過(guò)外部中斷喚醒,在stop without rtc模式下電流消耗能達(dá)到0.4uA康吵。很多時(shí)候酬诀,我們需要使用STM32的串口進(jìn)行喚醒托酸,比如接收到串口命令后MCU喚醒進(jìn)行相關(guān)操作吊履。本文總結(jié)下STM32L051的STOP模式寨典,通過(guò)外部中斷「按鍵耀盗、串口」進(jìn)行喚醒想虎。

串口喚醒的思路就是在MCU進(jìn)入STOP前將RX腳設(shè)為EXTI模式,并使能對(duì)應(yīng)的中斷叛拷,喚醒后重新初始化串口舌厨、配置時(shí)鐘。實(shí)際上都是使用的外部中斷喚醒忿薇。

  1. 在進(jìn)入STOP模式前對(duì)外設(shè)進(jìn)行設(shè)置邓线,GPIO要設(shè)置成模擬輸入狀態(tài),取消串口配置恢復(fù)默認(rèn)。
static void system_config_before_stop(void)
{
    GPIO_InitTypeDef GPIO_Initure;

    HAL_UART_DeInit(&huart1);
    /* Enable Ultra low power mode */
    HAL_PWREx_EnableUltraLowPower();

    /* Enable the fast wake up from Ultra low power mode */
    HAL_PWREx_EnableFastWakeUp();

    /* Select HSI as system clock source after Wake Up from Stop mode */
    __HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI);

    /* Enable GPIOs clock */
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOC_CLK_ENABLE();

    /* Configure all GPIO port pins in Analog Input mode (floating input trigger OFF) */
    GPIO_Initure.Pin = GPIO_PIN_All;
    GPIO_Initure.Mode = GPIO_MODE_ANALOG;
    GPIO_Initure.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_Initure);
    HAL_GPIO_Init(GPIOB, &GPIO_Initure);
    HAL_GPIO_Init(GPIOC, &GPIO_Initure);

    /* Disable GPIOs clock */
    __HAL_RCC_GPIOA_CLK_DISABLE();
    __HAL_RCC_GPIOB_CLK_DISABLE();
    __HAL_RCC_GPIOC_CLK_DISABLE();
}
  1. 設(shè)置喚醒源中斷煌恢,這里配置了按鍵和串口RX相關(guān)中斷骇陈。
static void stop_exit_config(void)
{
    GPIO_InitTypeDef GPIO_Initure = {0};
    __HAL_RCC_GPIOA_CLK_ENABLE();

    GPIO_Initure.Pin = KEY_PIN;
    GPIO_Initure.Mode = GPIO_MODE_IT_RISING;
    GPIO_Initure.Pull = GPIO_PULLDOWN;
    HAL_GPIO_Init(KEY_PORT, &GPIO_Initure);

    HAL_NVIC_SetPriority(EXTI2_3_IRQn, 3, 0);
    HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);

    GPIO_Initure.Pin = GPIO_PIN_10;
    GPIO_Initure.Mode = GPIO_MODE_IT_FALLING;
    GPIO_Initure.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOA, &GPIO_Initure);
    HAL_NVIC_SetPriority(EXTI4_15_IRQn, 2, 0);
    HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);

}
  1. 調(diào)用庫(kù)函數(shù)進(jìn)入STOP模式。
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
  1. 退出STOP模式后要恢復(fù)時(shí)鐘瑰抵。特別注意在進(jìn)入STOP模式后系統(tǒng)時(shí)鐘變成了MSI你雌。
static void clock_config_after_stop(void)
{
    HAL_StatusTypeDef ret = HAL_OK;
    RCC_OscInitTypeDef RCC_OscInitStructure = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStructure = {0};

    /* Enable Power Control clock */
    __HAL_RCC_PWR_CLK_ENABLE();

    /* The voltage scaling allows optimizing the power consumption when the device is
       clocked below the maximum system frequency, to update the voltage scaling value
       regarding system frequency refer to product datasheet.  */
    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

    /* Get the Oscillators configuration according to the internal RCC registers */
    HAL_RCC_GetOscConfig(&RCC_OscInitStructure);

    /* After wake-up from STOP reconfigure the system clock: Enable HSI and PLL */
    RCC_OscInitStructure.OscillatorType = RCC_OSCILLATORTYPE_HSI;
    RCC_OscInitStructure.HSEState = RCC_HSE_OFF;
    RCC_OscInitStructure.HSIState = RCC_HSI_ON;
    RCC_OscInitStructure.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
    RCC_OscInitStructure.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStructure.PLL.PLLSource = RCC_PLLSOURCE_HSI;
    RCC_OscInitStructure.PLL.PLLMUL = RCC_PLLMUL_4;
    RCC_OscInitStructure.PLL.PLLDIV = RCC_PLLDIV_2;
    ret = HAL_RCC_OscConfig(&RCC_OscInitStructure); //3?ê??ˉ
    if (ret != HAL_OK) while (1);

    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
       clocks dividers */
    RCC_ClkInitStructure.ClockType = RCC_CLOCKTYPE_SYSCLK;
    RCC_ClkInitStructure.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    ret = HAL_RCC_ClockConfig(&RCC_ClkInitStructure, FLASH_LATENCY_1); //í?ê±éè??FLASH?óê±?ü?ú?a1
    if (ret != HAL_OK) while (1);
}
  1. 恢復(fù)各外設(shè)狀態(tài),比如GPIO二汛、串口等初始化婿崭。
  2. 在需要進(jìn)入STOP模式的地方直接調(diào)用函數(shù)。
static void enter_stop_mode(void)
{
    //1. 配置stop之前各外設(shè)
    system_config_before_stop();

    //2.設(shè)置喚醒中斷
    stop_exit_config();

    //3. 進(jìn)入stop
    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);

    //3.退出stop后恢復(fù)各外設(shè)
    clock_config_after_stop();

    //4.恢復(fù)各外設(shè)
    gpioInit();
    uart1Init(115200);
}

目前測(cè)試到消耗電流與數(shù)據(jù)手冊(cè)一致肴颊。

stop
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末氓栈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子婿着,更是在濱河造成了極大的恐慌授瘦,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竟宋,死亡現(xiàn)場(chǎng)離奇詭異提完,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)丘侠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)徒欣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蜗字,你說(shuō)我怎么就攤上這事打肝≈拢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵粗梭,是天一觀的道長(zhǎng)争便。 經(jīng)常有香客問(wèn)我,道長(zhǎng)楼吃,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任妄讯,我火速辦了婚禮孩锡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亥贸。我一直安慰自己躬窜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布炕置。 她就那樣靜靜地躺著荣挨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朴摊。 梳的紋絲不亂的頭發(fā)上默垄,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音甚纲,去河邊找鬼口锭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛介杆,可吹牛的內(nèi)容都是我干的鹃操。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼春哨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼荆隘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起赴背,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤椰拒,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后凰荚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體耸三,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年浇揩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仪壮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胳徽,死狀恐怖积锅,靈堂內(nèi)的尸體忽然破棺而出爽彤,到底是詐尸還是另有隱情,我是刑警寧澤缚陷,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布适篙,位于F島的核電站,受9級(jí)特大地震影響箫爷,放射性物質(zhì)發(fā)生泄漏嚷节。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一虎锚、第九天 我趴在偏房一處隱蔽的房頂上張望硫痰。 院中可真熱鬧,春花似錦窜护、人聲如沸效斑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)缓屠。三九已至,卻和暖如春护侮,著一層夾襖步出監(jiān)牢的瞬間敌完,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工羊初, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蠢挡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓凳忙,卻偏偏與公主長(zhǎng)得像业踏,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涧卵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 很多MCU都有低功耗模式勤家,以滿足對(duì)功耗要求苛刻的應(yīng)用場(chǎng)景。STM32系列MCU的低功耗模式根據(jù)其內(nèi)核與類型的不同也...
    TonyCode閱讀 6,111評(píng)論 0 0
  • # STM32之串口DMA接收不定長(zhǎng)數(shù)據(jù) ## 引言 在使用stm32或者其他單片機(jī)的時(shí)候柳恐,會(huì)經(jīng)常使用到串口通訊伐脖,...
    杰杰T_T閱讀 535評(píng)論 0 0
  • 有一次做一個(gè)東西,為了盡量不占用CPU的處理數(shù)據(jù)時(shí)間,所以就使用DMA接收串口的數(shù)據(jù),但是呢問(wèn)題來(lái)了.,,,,,怎...
    楊奉武閱讀 3,163評(píng)論 0 1
  • 問(wèn)題描述: stm32L151使用RTC喚醒來(lái)退出stop模式,RTC運(yùn)行但不能喚醒 RTC喚醒成功后乐设,進(jìn)入sto...
    飛速遺忘閱讀 5,790評(píng)論 0 1
  • 姓名:周崇杰 學(xué)號(hào):16140120059 專業(yè):機(jī)械設(shè)計(jì)制造及其自動(dòng)化 轉(zhuǎn)載自:http://blog.csd...
    CJbaby閱讀 3,489評(píng)論 0 3