0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

為什么要串口喚醒STOP模式?如何才能實現串口喚醒STOP模式呢?

冬至子 ? 來源:CSDN ? 作者:Sanjay_Wu ? 2023-06-06 11:02 ? 次閱讀

前言

STM32常見的低功耗模式有三種:睡眠模式、STOP模式以及待機模式,STM32L系列還有其他低功耗模式。這里主要講的是STOP模式,STOP模式可以通過外部中斷或事件喚醒,但是不能通過串口中斷喚醒,因為串口中斷本身不是外部中斷,那么如何才能實現串口喚醒STOP模式呢?

因為我這里只是為了做驗證,為了快速驗證,我也就沒有用RT-Thread的PM電源管理組件進入STOP模式,感興趣的讀者可以用RT-Thread的電源管理組件去實現進行STOP模式。

一、為什么要串口喚醒STOP模式?

想象一下,在某些場合,如果你有一個無線通信模塊(例如ESP8266SIM800C)和STM32通過串口發(fā)送AT命令來對接服務器實現與服務器的數據交互,那么如果在沒有進行數據交互的時候,我們是不是可以讓STM32進入STOP模式來達到省電的狀態(tài),從而讓電池續(xù)航更長。例如:STM32+ESP8266與后臺服務器進行數據交互,當不用發(fā)送數據完畢,等待下次發(fā)送數據或等待后臺下發(fā)數據給設備的這段時間可以讓STM32進入STOP模式來達到省電,當后臺服務器下發(fā)數據給設備的時候,我們可以向讓后臺發(fā)送一個喚醒設備的指令,ESP8266接收到后臺的這條指令之后通過串口下發(fā)給STM32,那么就可以喚醒STM32了,這時候STM32就可以繼續(xù)接收后臺下發(fā)的數據。

二、串口喚醒STOP模式的思路

1、我們知道STOP模式只能外部中斷或事件喚醒,那么想象一下,在STM32進行STOP模式之前,是不是可以先將UART_RX對應的GPIO引腳配置為外部中斷引腳,而串口接收到字符相當于接收到01010…這樣的高低電平,從二可以喚醒串口,當喚醒之后,我們再馬上重新初始化串口,把UART_RX對應的GPIO引腳配置為接收中斷模式?答案當然是可以的。

2、喚醒之后的程序是從哪里開始執(zhí)行?答案是從進行STOP模式之前的那個地方重新開始執(zhí)行,一會進行驗證。

三、串口喚醒STOP模式實驗

光說不練都是假把式,接下來進行實驗。

1、 實驗平臺: 中國移動物聯網OneNET NB開發(fā)板(板載STM32)。

2、STM32F103RET6、12M外部晶振、串口3進行實驗。

3、 操作系統 RT-Thread。

4、用RT-Thread創(chuàng)建兩個線程,一個線程用于讀取按鍵是否按下,按下則調用進入STOP模式函數進入STOP模式,另一個線程讀取串口接收到的數據。

1、如何進行STOP模式?

實驗時用的是標準庫,在這里主要實現在進入STOP模式前將RX對應的GPIO引腳配置為外部中斷模式以及進入STOP模式,代碼如下:

1/**************************************************************
 2函數名稱:system_enter_stop
 3函數功能:系統進入STOP模式
 4輸入參數:無
 5返 回 值:無
 6備    注:無
 7**************************************************************/
 8void system_enter_stop(void)
 9{
10        uart_exti_init(); /* 進入STOP模式前配置RX引腳為外部中斷模式 */
11    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR , ENABLE); /* 開電源管理時鐘 */
12    //PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI); /* 進入STOP模式,外部中斷喚醒 */
13    PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFE); /* 進入STOP模式,外部中斷或事件喚醒 */
14}

2、配置RX對應的GPIO引腳為外部中斷模式

這里采用RT-Thread的PIN設備進行配置,在配置之前需要先關閉UART中斷、復位UART、復位GPIO,然后在進行配置為外部中斷模式,代碼如下:

1/**************************************************************
 2函數名稱:uart_exti_init
 3函數功能:RX引腳配置為外部中斷
 4輸入參數:無
 5返 回 值:無
 6備    注:無
 7**************************************************************/
 8void uart_exti_init(void)
 9{
10        /* 關閉UART中斷、復位UART、復位GPIO */
11    USART_ITConfig(USART3, USART_IT_RXNE, DISABLE);
12    USART_Cmd(USART3, DISABLE);
13    GPIO_DeInit(GPIOB);
14    USART_DeInit(USART3);
15
16    /* 配置RX對應的GPIO引腳為外部中斷模式 */
17    rt_pin_mode(PIN_UART3_RX, PIN_MODE_INPUT_PULLUP);
18    rt_pin_attach_irq(PIN_UART3_RX, PIN_IRQ_MODE_FALLING, uart_exti_callback, RT_NULL);
19    rt_pin_irq_enable(PIN_UART3_RX, PIN_IRQ_ENABLE);
20}

3、接收中斷回調函數

在上面的配置中,有一個接收回調函數uart_exti_callback,就是在發(fā)送中斷的時候要執(zhí)行的事情,在接收回調函數里面,我們主要實現SystemInit,重新初始化串口,代碼如下:

1/**************************************************************
 2函數名稱:uart_exti_callback
 3函數功能:RX引腳外部中斷喚醒回調函數
 4輸入參數:args:回調函數入口參數
 5返 回 值:無
 6備    注:無
 7**************************************************************/
 8void uart_exti_callback(void *args)
 9{
10    SystemInit();
11    uart_reinit();      /* 重新初始化串口 */
12    rt_kprintf("wake up\\r\\n");
13
14}

4、進入STOP模式的線程

這里,創(chuàng)建一個線程來實現判斷是否按鍵按下,按下則調用system_enter_stop函數進入STOP模式,同時為了驗證喚醒之后時鐘正常以及程序是從進行STOP模式之前的那個地方重新開始執(zhí)行,我們設計LED燈500ms亮500ms滅,再一個計數變量,每隔1秒自動加1并打印,代碼如下:

1static void sleep_thread_entry(void *parameter)
 2{
 3    unsigned char key;
 4    unsigned int count=0;
 5
 6    while(1)
 7    {
 8        key = key_scan(0);
 9
10        if(key == KEY4_PRES)
11        {
12            rt_kprintf("system_enter_stop\\r\\n");
13            system_enter_stop();
14        }
15        LED1(1);
16        rt_thread_mdelay(500);
17        LED1(0);
18        rt_thread_mdelay(500);
19        rt_kprintf("count:%d\\r\\n",count);
20        count++;
21    }
22}

5、實驗操作和現象

1、開機之后,LED閃爍,串口打印count每隔1秒加1的值,等待一小會按下按鍵KEY4進入STOP模式:

圖片

FinSH抓取的串口打印信息

2、對比進入STOP模式前和STOP模式之后的電流情況(這里進入STOP模式之后電流還是很大是因為我們板子還接了其他耗電的模塊,我們這對比電流有沒有降下來就可以了),很明顯,電流降下來了:

圖片

進入STOP模式前的電流

圖片

進入STOP模式后的電流

3、通過串口發(fā)送一個字符“A”,喚醒了STM32,這時候串口并不會打印字符“A”,因為喚醒之后要重新初始化串口,第二次發(fā)送字符“A”才能顯示,這時候,我們觀察FinSH打印出來的信息,可以看到count是從9開始打印,說明STOP喚醒之后會從原來進入STOP模式之前的地方重新執(zhí)行代碼:

圖片

驗證代碼的執(zhí)行情況

圖片

喚醒之后第二次發(fā)一個字符能正常打印

4、接下來,我們再次按下KEY4重新然STM32進入STO模式,然后發(fā)送一個比較長的字符串來喚醒STM32,例如發(fā)“ABCDEFGHIJKLMNOPQ1234567890”,這時候,我們發(fā)現第一次發(fā)送之后,竟然會有字符出來,不是說沒有嗎?而且這些字符和我們發(fā)送的不一樣,少了,第二次才正常:

圖片

喚醒之后打印字符不正常

四、串口喚醒存在的問題

1、上面我們提到,發(fā)送一個字符喚醒就很正常,而發(fā)送比較長的字符串喚醒卻出現了不然正常的現象,這是為什么呢?想象一下m如果你是發(fā)一串很長的數據來喚醒串口,這串數據也是通過0101010等二進制來發(fā)送的,當RX引腳被觸發(fā)中斷喚醒MCU之后,喚醒之后串口初始化完成了,剩余的數據也就會接著以010101的高低電平發(fā)給STM32的串口,有可能導致有些字符的01丟失了一部分(例如上面出現了K567890),從而可以接下來的字符會打印出來。如果是發(fā)一個字符,一個字符的01010101其實也就8位,發(fā)送很快的,喚醒之后都已經發(fā)送結束了,所以就會直接喚醒,也就不會接收這個字符,只有第二次發(fā)送的時候才會接收到這個字符。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 電源管理
    +關注

    關注

    115

    文章

    6100

    瀏覽量

    143366
  • STM32
    +關注

    關注

    2258

    文章

    10828

    瀏覽量

    352492
  • GPIO
    +關注

    關注

    16

    文章

    1175

    瀏覽量

    51515
  • RT-Thread
    +關注

    關注

    31

    文章

    1239

    瀏覽量

    39435
  • ESP8266
    +關注

    關注

    50

    文章

    959

    瀏覽量

    44545
收藏 人收藏

    評論

    相關推薦

    MM32 在STOP模式下通過UART喚醒

    ,并使能對應的中斷來實現,相關代碼在MiniBoard上測試可以實現該功能。 從STOP模式喚醒串口
    發(fā)表于 12-14 17:03

    STM32F2電源管理STOP模式不能喚醒

    STM32F2電源管理STOP模式,無法喚醒~我采用的是外部8M晶振,進入STOP模式的代碼如下: /* To minimize the c
    發(fā)表于 03-08 07:05

    基于LPUART喚醒STOP模式下的MCU使用限制介紹

    在低功耗應用中有時會讓MCU進入STOP模式以節(jié)省功耗,在有些芯片架構中,若要實現這種應用,往往會在進低功耗模式之前將串口的管腳設置成帶外部
    發(fā)表于 07-18 04:10

    使用HAL庫RTC時鐘喚醒低功耗STOP和STANDBY模式

    STM32F1系列使用HAL庫RTC時鐘喚醒低功耗STOP和STANDBY模式目錄STM32F1系列使用HAL庫RTC時鐘喚醒低功耗STOP
    發(fā)表于 07-23 06:11

    STM32串口喚醒STOP模式實現 精選資料推薦

    中斷喚醒,因為串口中斷本身不是外部中斷,那么如何才能實現串口喚醒
    發(fā)表于 08-16 08:54

    STM32 低功耗停機模式STOP)管腳中斷(INTERRUPT)喚醒實現及優(yōu)化

    停止模式STOP)管腳中斷喚醒實現(HAL庫)。2. 低功耗模式STM32L4的低功耗模式
    發(fā)表于 12-07 16:21 ?25次下載
    STM32 低功耗停機<b class='flag-5'>模式</b>(<b class='flag-5'>STOP</b>)管腳中斷(INTERRUPT)<b class='flag-5'>喚醒</b><b class='flag-5'>實現</b>及優(yōu)化

    STM32 低功耗停機模式STOP)管腳事件(EVENT)喚醒實現及優(yōu)化

    STM32 低功耗停止模式STOP)管腳事件喚醒實現及優(yōu)化1. 介紹STM32具有多種低功耗模式,當前以STM32L4系列的低功耗
    發(fā)表于 12-07 16:21 ?11次下載
    STM32 低功耗停機<b class='flag-5'>模式</b>(<b class='flag-5'>STOP</b>)管腳事件(EVENT)<b class='flag-5'>喚醒</b><b class='flag-5'>實現</b>及優(yōu)化

    STM32串口喚醒STOP模式實現

    中斷喚醒,因為串口中斷本身不是外部中斷,那么如何才能實現串口喚醒
    發(fā)表于 12-07 16:36 ?22次下載
    STM32<b class='flag-5'>串口</b><b class='flag-5'>喚醒</b><b class='flag-5'>STOP</b><b class='flag-5'>模式</b>的<b class='flag-5'>實現</b>

    STM32外部中斷、串口喚醒低功耗

    外部中斷或RTC喚醒待機模式-(standby):待機模式的功耗為2uA,TAMPER引腳不關斷,通過WKUP引腳喚醒在項目中綜合選擇了停止模式
    發(fā)表于 12-31 19:05 ?29次下載
    STM32外部中斷、<b class='flag-5'>串口</b><b class='flag-5'>喚醒</b>低功耗

    STM32 低功耗STOP模式,RTC喚醒

    芯片:STM32L071CB開發(fā)環(huán)境:STM32CubeMX + keil5.33使用實時時鐘RTC的 WakeUpTimer定時器產生的中斷將STM32從STOP低功耗模式喚醒。STOP
    發(fā)表于 12-31 19:06 ?45次下載
    STM32 低功耗<b class='flag-5'>STOP</b><b class='flag-5'>模式</b>,RTC<b class='flag-5'>喚醒</b>

    STM32F1系列使用HAL庫低功耗STOP和STANDBY模式喚醒(RTC時鐘喚醒+外部中斷喚醒示例)

    STM32F1系列使用HAL庫RTC時鐘喚醒低功耗STOP和STANDBY模式目錄STM32F1系列使用HAL庫RTC時鐘喚醒低功耗STOP
    發(fā)表于 12-31 19:09 ?65次下載
    STM32F1系列使用HAL庫低功耗<b class='flag-5'>STOP</b>和STANDBY<b class='flag-5'>模式</b><b class='flag-5'>喚醒</b>(RTC時鐘<b class='flag-5'>喚醒</b>+外部中斷<b class='flag-5'>喚醒</b>示例)

    APM32F030C8T6_軟件問題_如何在睡眠模式stop模式喚醒

    APM32F030C8T6_軟件問題_如何在睡眠模式stop模式喚醒
    發(fā)表于 11-09 21:03 ?0次下載
    APM32F030C8T6_軟件問題_如何在睡眠<b class='flag-5'>模式</b>和<b class='flag-5'>stop</b><b class='flag-5'>模式</b>中<b class='flag-5'>喚醒</b>

    APM32F030C8T6_軟件問題_進入stop模式之后無法使用按鍵喚醒

    APM32F030C8T6_軟件問題_進入stop模式之后無法使用按鍵喚醒
    發(fā)表于 11-09 21:03 ?2次下載
    APM32F030C8T6_軟件問題_進入<b class='flag-5'>stop</b><b class='flag-5'>模式</b>之后無法使用按鍵<b class='flag-5'>喚醒</b>

    串口DMA STOP模式喚醒故障問題

    重點就放在了跟串口底層相關的部分,因為在進STOP模式之前會把所有的外設處理一下,串口、DMA都會關掉,喚醒之后重新使能,問題可能出在了這里
    發(fā)表于 11-21 21:50 ?1514次閱讀

    使用MM32F0270 LPTIM從STOP模式喚醒

    使用MM32F0270 LPTIM從STOP模式喚醒
    的頭像 發(fā)表于 10-26 16:46 ?824次閱讀
    使用MM32F0270 LPTIM從<b class='flag-5'>STOP</b><b class='flag-5'>模式</b><b class='flag-5'>喚醒</b>