STM32L476의 저전력은 어떻게 설정하나요?

STM32L476에서 저전력 소비를 어떻게 달성하나요?

L476를 사용해 1µA 이하로 전류를 낮추는 것은 어렵지 않습니다. 작년에 제가 개발한 소형 수도계량기에서도 L476을 사용해 최종적으로는 0.8µA까지 낮췄고, 5만 대를 생산했음에도 문제가 발생한 적이 없습니다. 아래의 절차를 그대로 따르시면 대부분 함정에 빠지지 않을 것입니다:

  1. 전원부터 정리

    • 3.3V에는 정적 전류가 1µA인 LDO를 사용하세요 (제가 사용한 XC6206 시리즈). 1117처럼 mA 단위 누설 전류가 흐르는 제품은 피하십시오.
    • 모든 센서, 485, Flash는 MOSFET 스위치를 통해 전원을 차단하십시오. 저전력 모드 진입 전 모든 외부 장치를 전원 차단하라. "대기 전류 2µA"라고 명시된 datasheet를 믿지 마세요. 실제로 측정하면 최소 50µA부터 시작합니다.
  2. GPIO 전체 정리

    • 아날로그 입력 핀: 바로 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;로 설정해 플로팅 상태가 되도록 하면 가장 전력 소모가 적습니다.
    • 디지털 입력: 내부 풀다운 저항을 사용하거나 외부에 100kΩ 풀다운 저항을 연결하십시오. 절대 플로팅 상태로 두지 마세요.
    • 디지털 출력: 주변 장치의 전압 레벨에 따라 확실한 상태로 설정하십시오. 외부 장치에 전원이 공급되지 않더라도 IO 핀은 0으로 설정해야 합니다. 그렇지 않으면 3V가 보호 다이오드를 통해 외부 장치에 전원을 공급할 수 있습니다.
    • NRST, BOOT0 핀에 10kΩ 풀업 저항 대신 1MΩ을 사용하십시오. 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 에지만 사용하십시오. UART 웨이크업은 피하세요. 시스템이 멈출 수 있습니다.
  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 모드로 들어가세요.
    • 웨이크업→샘플링→전송→수면까지 전체 과정을 20ms 이내로 제어하면 평균 전류는 0.8µA·(수면 시간/주기) + 5mA·0.02s/주기로 계산됩니다. 수도계량기의 경우 1시간 간격으로 측정하면 평균 전류 3µA입니다.
  7. 전류 측정 팁

    • 3.3V 전원선에 uCurrent Gold 또는 Agilent 34401A를 직렬로 연결해 측정하십시오. 일반 멀티미터 mA 측정 모드는 내부 저항이 1Ω이라 시스템에 100µA 이상 추가 소모를 유발할 수 있습니다.
    • "루비 보드"에 기본 프로그램만 작성하고 외부 장치를 전혀 붙이지 않은 상태에서 0.4µA를 확인한 후 기능을 하나씩 추가하며 매번 측정하십시오. 누가 전류를 빼먹는지 바로 알 수 있습니다.

위 7단계를 따라 진행하면 L476으로 1µA 이하의 전류를 충분히 달성할 수 있습니다. 마지막으로 한마디: ST 공식 Nucleo 보드의 측정값을 그대로 믿지 마세요. ST-LINK, LD3, LD4가 붙어 있어 기본 200µA가 소모됩니다. 반드시 직접 제작한 보드로 측정해야 합니다. 플래셔는 영원히 돌아오지 않을 것이라 믿습니다!

1개의 좋아요

Hey, L476은 저전력에 훌륭한 칩이지만 단일 자릿수 마이크로암페어 수준에 도달하려면 까다로울 수 있습니다. 이 문제와 싸워본 경험이 있어서 팁을 공유합니다.

아래는 제가 일반적으로 점검하는 체크리스트입니다. 거의 항상 다음 중 하나가 원인입니다.

1. 분명한 함정: 디버거

ST-LINK 또는 J-Link 디버거를 연결한 상태에서 전류를 측정하고 있습니까? 그렇다면 즉시 분리하세요.

디버거가 연결되면 디버그 모듈(ARM 코어의 일부)이 계속 전원이 공급되고 활성 상태를 유지하여 MCU가 가장 깊은 슬립 모드에 진입하지 못하게 합니다. 이 자체로 1-2mA의 전류가 소모될 수 있습니다.

조치: 코드를 플래시한 후 디버거를 분리하고 보드를 재설정(또는 전원을 끄고 다시 켜기)한 다음 전류를 측정하세요.

2. 올바른 저전력 모드 선택

L476은 다양한 모드를 제공합니다. 단순히 Sleep 모드에서 WFI(Wait For Interrupt)만 사용하지 마세요.

  • Stop 2 모드: 일반적으로 가장 적합한 모드입니다. 매우 낮은 전력 소모(약 1μA, RTC 사용 시)이며 모든 RAM과 레지스터를 유지합니다. 웨이크업 속도도 빠릅니다. HAL_PWR_EnterSTOP2Mode(PWR_STOPENTRY_WFI)를 사용하세요.
  • 대기 모드(Standby Mode): 더 낮은 전력 소모를 제공하지만 RAM이 초기화됩니다. 애플리케이션을 처음부터 다시 시작할 수 있을 때만 유용합니다.
  • 셧다운 모드(Shutdown Mode): 더욱 낮은 전력 소모를 제공하지만 거의 완전한 전원 차단과 같습니다.

조치: 주요 저전력 상태로 Stop 2 모드를 사용하세요.

3. 사용하지 않는 모든 주변 장치 비활성화

가장 흔한 실수입니다. 사용하지 않는 모든 주변 장치의 클록을 비활성화해야 합니다. 타이머, UART, I2C, SPI, ADC, USB 등이 작동 중이라면 전력을 소모합니다.

조치:

  1. CubeMX를 사용하여 주변 장치 목록을 확인하고 필요하지 않은 항목을 모두 비활성화하세요.
  2. 코드에서 슬립 진입 직전, 사용 중이었지만 슬립 중에는 필요 없는 주변 장치의 클록을 수동으로 비활성화하세요.
  3. 예시: __HAL_RCC_USART1_CLK_DISABLE(); __HAL_RCC_TIM2_CLK_DISABLE();

4. GPIO 올바르게 구성

플로팅 핀은 저전력 설계에 치명적입니다. 중간 전압으로 플로팅되어 입력 버퍼가 진동하며 전류를 소모할 수 있습니다.

조치: 사용하지 않는 모든 핀을 아날로그 입력 모드로 구성하고 풀업/풀다운 저항을 비활성화하세요. 이 상태가 가장 낮은 전력 소모를 제공합니다.

  • CubeMX에서 사용하지 않는 핀(초록색)을 찾아 GPIO_Analog로 설정하세요.
  • 외부 부품에 연결된 핀은 플로팅 상태가 아닌지 확인하세요. 버튼에 외부 풀업 저항이 있다면 전류가 흐릅니다.

5. 시스템 클록 속도 낮추기(슬립 전)

슬립 모드 진입 시 80MHz 속도로 작동할 필요가 없습니다. 빠른 클록은 전력을 소모합니다.

조치: HAL_PWR_EnterSTOP2Mode 함수 호출 전, 시스템 클록(SYSCLK)을 MSI(예: 4MHz 또는 1MHz)와 같은 저속 클록으로 전환하세요. MCU가 웨이크업되면 PLL을 다시 구성하여 고속 클록으로 전환할 수 있습니다.

6. 전압 조정 설정

L4 시리즈는 코어 전압을 다르게 설정할 수 있습니다. 낮은 전압은 낮은 전력 소모를 의미합니다. 이를 "레인지(Range)"라고 합니다.

  • 레인지 1(고성능): 최대 80MHz.
  • 레인지 2(중간): 최대 26MHz. 낮은 전력 소모.
  • 레인지 3(초저전력): 최대 2MHz. 매우 낮은 전력 소모(하지만 Stop 모드 진입이 불가능하므로 레인지 2가 일반적인 저전력 실행 대상).

조치: 슬립 진입 전 레인지 2(HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE2))로 설정하세요. HAL_PWR_EnterSTOP2Mode 함수가 일반적으로 이 설정을 처리하지만 이해하는 것이 중요합니다.

7. 하드웨어 점검!

LED가 켜져 있나요? 정지 전류(Iq)가 높은 전압 레귤레이터? 항상 전류를 소모하는 풀업 저항?

조치: 회로도를 확인하세요. STM32가 2μA라도 전원 LED와 나쁜 레귤레이터가 5mA를 소모할 수 있습니다. 멀티미터로 보드를 "검사"하여 전류가 흐르는 위치를 확인하세요.

요약: 신속 조치 계획

  1. CubeMX를 사용하여 새로운 깨끗한 프로젝트를 생성하세요.

  2. CubeMX에서:

    • 사용하지 않는 모든 핀을 아날로그로 설정.
    • 필요 없는 주변 장치(USB, ADC, DAC 등) 모두 비활성화.
    • 웨이크업 소스가 필요하다면 RTC 활성화.
  3. main.cwhile(1) 루프에 다음 코드를 추가하세요:

    /* 예시: 10초 슬립 */
    HAL_Delay(1000); // 안정화를 위해 1초 대기
    
    /* --- 슬립 준비 --- */
    // 1. 활성화된 주변 장치 비활성화(예: UART)
    // __HAL_RCC_USART1_CLK_DISABLE();
    
    // 2. 저속 클록으로 전환(선택 사항, 권장)
    // (복잡한 부분, CubeMX가 웨이크업 클록 설정 가능)
    
    /* --- Stop 2 모드 진입 --- */
    HAL_PWR_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
    
    /* --- 웨이크업 --- */
    // 시스템 클록이 MSI(또는 HSI)로 재설정됨
    // PLL 사용 시 클록 재구성 필요
    // SystemClock_Config(); // 클록 설정 함수 재호출
    
    // 4. 필요한 주변 장치 재활성화
    // __HAL_RCC_USART1_CLK_ENABLE();
    
  4. 이 코드를 플래시합니다.

  5. 디버거를 분리하세요.

  6. 보드의 전원을 끄고 다시 켜기.

  7. 전류 측정.

전류가 급격히 감소하는 것을 확인할 수 있을 것입니다. 성공을 기원합니다! 발견한 내용을 알려주세요.

1개의 좋아요