Low Power PWM(Timer)

前言

隨者低功號產品越來越要求,ST就推出Low power應用的MCU與相對應腳位,其中ST MCU中的L系列就是專屬的Low power的MCU,另外部分MCU也有低功耗腳位的MCU 例如F7、H7、G0、G4與WB系列,本章節會針對LPTIM這隻腳位去做詳細解說與用法切換震盪來源

LPTIM功能

LPTIM:Low-power timer,即低功耗定時器(16bit)
LPTIM與一般TIM不同處主要是在除了待機模式下全部電源模式保持運行,而且沒有內部時鐘源也能運行
下圖我們也可以看到L0與G0不相同,因此不同的系列LPTIM的設置會有不同需要再確認(其中WB系列與G0系列相同)

STM32WB55 Clock tree

注意:CLKMUX選擇對應的是CFGR寄存器的bit0:CKSEL,用于控制内核clock選擇由内部時鐘源(APB或LSE、LSI和HSI等任何其他內部震盪器)提供。也可以選擇由外部clock源通過 LPTIM 外部 Input提供。

LPTIM特性

內部clock:LSE、 LSI、 HSI 或 APB 
LPTIM輸入的外部clock(在沒有LP震盪器情況可以使用脈衝計數器)
其中LPTIM具有Glicth濾波器(如下圖)

LPTIM_ClockConfigTypeDef定義

typedef struct
{
  uint32_t Source;   
  uint32_t Prescaler;  
}LPTIM_ClockConfigTypeDef;

Source可以選擇如下

  1. #define LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC  ((uint32_t)0x00U)
  2. #define LPTIM_CLOCKSOURCE_ULPTIM             LPTIM_CFGR_CKSEL

第一種表示LPTIM 使用內部clock(APB 或APB 或 LSE、LSI和HSI等)
第二種表示LPTIM 由外部Clock通過 LPTIM 外部 Input1 提供Clock。

Timer底層配置(GPIO、Clock、中斷)

HAL_LPTIM_Init就會调用HAL_LPTIM_MspInit

__weak void HAL_LPTIM_MspInit(LPTIM_HandleTypeDef *hlptim)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(hlptim);

  /* NOTE : This function Should not be modified, when the callback is needed,
            the HAL_LPTIM_MspInit could be implemented in the user file
   */
}

PS:HAL_LPTIM_DeInit就會调用HAL_LPTIM_MspDeInit
基本設置外還需要配置好GPIO、Clock、中斷才能完整使用,以下為配置LPTIM1使用PD13做PWM範例

void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
GPIO_InitTypeDef     GPIO_InitStruct;

  /* 使用LPTIM Clock */
  __HAL_RCC_LPTIM1_CLK_ENABLE();

  /* 使用GPIO  Enable GPIO PORT */
  __HAL_RCC_GPIOD_CLK_ENABLE();

  /* 配置PD13 */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
  GPIO_InitStruct.Alternate = GPIO_AF1_LPTIM1;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}

小結流程

  1. 通過函数HAL_LPTIM_Init()做初始化
  2. 低功耗定時器的底層配置是通過函数HAL_LPTIM_MspInit()實現
  3. 選擇低功耗定時器支持的6種工作模式
    1. PWM模式:使用HAL_LPTIM_PWM_Start()或 HAL_LPTIM_PWM_Start_IT()
    2. 單脈衝模式:在此模式下,當滿足條件時,輸出出可以切換高低電壓,使用HAL_LPTIM_SetOnce_Start()或 HAL_LPTIM_SetOnce_Start_IT()
    3. Encoder模式:HAL_LPTIM_Encoder_Start()或HAL_LPTIM_Encoder_Start_IT()!!注意非每個LPTIM都支持此模式!!
    4. 超時模式:HAL_LPTIM_TimeOut_Start()或 HAL_LPTIM_TimeOut_Start_IT()
    5. 計數模式:HAL_LPTIM_Counter_Start()或  HAL_LPTIM_Counter_Start_IT()
  4. 停止任何模式:用户可以通過调用相應的API來停止任何模式: HAL_LPTIM_Xxx_Stop 或 HAL_LPTIM_Xxx_Stop_IT(如果此模式已經在中斷方式下啟動)

Leave a Comment

Your email address will not be published. Required fields are marked *

Shopping Cart