STM32L476低功耗怎么做啊?

STM32L476低功耗怎么做啊?

把板子搞到 1 µA 以内不难,我去年做的小水表就是 L476,最后停模 0.8 µA,批量 5 万块没翻过车。下面这套流程你照抄基本不会踩坑:

  1. 先整电源

    • 3.3 V 用 1 µA 静态的 LDO(我用的 XC6206 系列),别拿 1117 那种 mA 级漏电流的。
    • 所有传感器、485、Flash 都走 MOS 管开关,进低功耗前全部断电,别信“待机 2 µA”的 datasheet,真测都是 50 µA 起。
  2. GPIO 全部理一遍

    • 模拟输入脚:直接 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; 浮空最省电。
    • 数字输入:要么内部下拉,要么外部 100 k 下拉,千万别浮空。
    • 数字输出:根据外设电平拉到确定状态,哪怕外设断电了,IO 也要输出 0,否则 3 V 通过保护二极管给外设偷偷供电。
    • NRST、BOOT0 别上拉 10 k,换 1 M,省 300 µA。
  3. 时钟树只留 LSE

    • CubeMX 里 HSI/HSI16/PLL 全关,MSI 也别留。
    • RTC 定时唤醒只用 LSE,别用 LSI,LSI 一开就是 1 µA 起步。
  4. 进 STOP2,别用 Standby

    • HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI); 唤醒后 RAM 还在,省得重新初始化。
    • 唤醒源只用 RTC + 1 个 GPIO 边沿,别用串口唤醒,容易卡死。
  5. 外设关干净

    • I²C/SPI/UART 先 __HAL_RCC_*_FORCE_RESET()__HAL_RCC_*_RELEASE_RESET(),把寄存器恢复到复位值,否则 IO 锁在低电平,179 µA 的坑我替你们踩过了(见 ST 官方帖)。
    • ADC、COMP、OPAMP 先 HAL_*_DeInit(),再关时钟。
    • DMA、USB、CRC 全部关时钟,别信“自动关闭”,实测每漏一个就 20 µA。
  6. 唤醒后快速干完再睡

    • 唤醒先开 HSI16,干活,干完把外设重新 DeInit,时钟切回 LSE,再进 STOP2。
    • 整个唤醒→采样→发送→休眠控制在 20 ms 以内,平均电流就是 0.8 µA·(sleep 时间/周期) + 5 mA·0.02 s/周期,水表 1 小时采一次,平均 3 µA。
  7. 调电流技巧

    • 用 uCurrent Gold 或者 Agilent 34401A 串在 3.3 V 线上,别用万用表 mA 档,内阻 1 Ω 都能让系统多跑 100 µA。
    • 先焊“裸板”程序,啥外设不加,看到 0.4 µA 再往回加功能,每加一步测一次,一眼就知道谁在偷电。

按上面七步来,L476 做到 1 µA 以下很轻松。最后提醒一句:别把 ST 官方 Nucleo 的测量值当真理,那板子上有 ST-LINK、LD3、LD4,随便就 200 µA,一定要自己打板测。祝你一次成功,烧录器永不回头!

1個讚

嘿,L476 是一款優秀的低功耗晶片,但要達到個位數微安的數值可能有點棘手。我之前也遇到過這個問題。

以下是個我常用的檢查清單,幾乎總是其中某個原因造成的。

1. 明顯的陷阱:除錯器

您是否在連接 ST-LINK 或 J-Link 除錯器的情況下測量電流?如果連接了除錯器,請立即拔掉它。

當除錯器連接時(ARM 核心的一部分),除錯模組會保持供電並處於活動狀態,這會阻止 MCU 進入最深層的睡眠模式。它本身就會增加 1-2mA 的電流。

步驟: 先燒錄程式碼,拔掉除錯器,重置開發板(或重新上電),然後 再測量電流。

2. 選擇正確的低功耗模式

L476 有許多模式,不要只用簡單的 WFI(等待中斷)在睡眠模式中。

  • 停止2模式: 這通常是最佳選擇。功耗非常低(搭配 RTC 時約 1uA),並保留所有 RAM 和暫存器。喚醒速度快。使用 HAL_PWR_EnterSTOP2Mode(PWR_STOPENTRY_WFI)
  • 待機模式: 功耗更低,但會清除 RAM。只有當您能在喚醒後重新啟動應用程式時才適用。
  • 關機模式: 功耗更低,但幾乎等同於完全斷電。

步驟: 使用 停止2 模式作為主要低功耗狀態。

3. 停用所有未使用的週邊設備

這是常見的錯誤。所有未使用的週邊設備都必須停用其時鐘。如果您讓 Timer、UART、I2C、SPI、ADC、USB 等週邊設備的時鐘持續運行,就會消耗電力。

步驟:

  1. 使用 CubeMX 並逐一檢查週邊設備列表。停用所有不需要的功能。
  2. 在程式碼中進入睡眠前,手動停用任何在睡眠期間不需要的週邊設備時鐘。
  3. 範例:__HAL_RCC_USART1_CLK_DISABLE(); __HAL_RCC_TIM2_CLK_DISABLE();

4. 正確配置 GPIO

懸空引腳對低功耗來說是一場災難。它們可能浮動到中間電壓,導致輸入緩衝器震盪並消耗電流。

步驟: 所有未使用的 MCU 引腳必須配置為 類比輸入模式,且不啟用上拉或下拉電阻。這是它們最低功耗的狀態。

  • 在 CubeMX 中,找到所有未使用的引腳(綠色),並將其設定為 GPIO_Analog
  • 對於連接外部元件的引腳,確保它們不會懸空。例如按鈕有外部上拉電阻時,會持續消耗電流。

5. 降低系統時鐘(睡眠前)

如果您即將進入睡眠,就不需要以 80MHz 運行。高速時鐘會消耗電力。

步驟: 在呼叫 HAL_PWR_EnterSTOP2Mode 函數前,將系統時鐘(SYSCLK)切換為低速時鐘,例如 MSI(例如 4MHz 或 1MHz)。當 MCU 喚醒後,您可以重新配置 PLL 並切換回高速時鐘(如果需要)。

6. 設定電壓調節

L4 系列可以以不同電壓運行核心。較低電壓 = 較低功耗。這稱為「範圍(Range)」。

  • 範圍1(高性能): 最高 80MHz。
  • 範圍2(中等): 最高 26MHz。較低功耗。
  • 範圍3(低功耗): 最高 2MHz。非常低的功耗(但無法從此模式進入停止模式,因此 範圍2 通常是低功耗運行的目標)。

步驟: 睡眠前切換到 範圍2HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE2))。HAL_PWR_EnterSTOP2Mode 函數通常會處理這一點,但最好還是了解這一點。

7. 檢查您的硬體!

是否有 LED 亮著?靜態電流(Iq)高的電壓穩壓器?持續消耗電流的上拉電阻?

步驟: 檢查您的電路圖。您的 STM32 可能只有 2uA,但電源 LED 和劣質穩壓器可能就消耗了 5mA。使用電流表「沿著電路板」測量,找出電流流向。

總結:快速行動計畫

  1. 使用 CubeMX 生成一個全新、乾淨的專案。

  2. 在 CubeMX 中:

    • 將所有未使用的引腳設定為 類比模式
    • 停用所有不需要的週邊設備(USB、ADC、DAC 等)。
    • 如果需要喚醒源,啟用 RTC。
  3. 在您的 main.cwhile(1) 迴圈中加入以下程式碼:

    /* 這只是個範例,例如 10 秒睡眠 */
    HAL_Delay(1000); // 等待一秒讓系統穩定
    
    /* --- 睡眠準備 --- */
    // 1. 停用任何正在運行的週邊設備(例如 UART)
    // __HAL_RCC_USART1_CLK_DISABLE();
    
    // 2. 切換至低速時鐘(可選但推薦)
    // (這部分較複雜,CubeMX 可設定喚醒時鐘)
    
    /* --- 進入停止2模式 --- */
    HAL_PWR_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
    
    /* --- 喚醒 --- */
    // 系統時鐘將重設為 MSI(或 HSI)
    // 如果您之前使用 PLL,需要重新配置時鐘
    // SystemClock_Config(); // 再次呼叫時鐘配置函數
    
    // 4. 重新啟用所需的週邊設備
    // __HAL_RCC_USART1_CLK_ENABLE();
    
  4. 燒錄這段程式碼。

  5. 拔掉除錯器。

  6. 重新上電開發板。

  7. 測量電流。

您應該會看到電流大幅下降。祝您好運!請讓我們知道您的發現。

1個讚