STM32WB LPTIM counter(Timing)
前言
在STM32中,相對較新的MCU部分型號配有LPTIM定時器。 比如:STM32F7、H7高性能MCU,STM32L0、 L4低功耗MCU,以及新推出的G0、G4系列中都配有這種LPTIM定時器。 具體哪些MCU配有LPTIM,大家可以下載對應的數據手冊查看。 本文圍繞STM32WB講述其中的LPTIM定時器。
LPTIM block diagram
LPTIM的RCC和其他定時器相比較,其RCC功能更加豐富。
通過上面框圖可以發現,LPTIM 可通過多個時鐘源提供時鐘。
它可以由內部時鐘信號提供時鐘,內部時鐘信號可通過復位和時鐘控制器 (RCC) 在 APB、 LSI、 LSE 或 HSI 時鐘源中進行選擇。
低功耗定時器時鐘選擇問題(重要)
1、lptim_ker_ck接口
內核時鐘,供lptim使用。 lptim_ker_tim接入到CLKMUX雙路選擇器的一個輸入端,另一個輸入端是LPTIM_IN1或者LPTIM_IN2的輸入。也就是說LPTIM的計數器可以選擇lptim_ker_ck,也可以選擇LPTIM_IN1或者LPTIM_IN。
2、最關鍵的地方來了
(1) CLKMUX多路選擇器對應的是CFGR寄存器的bit0:CKSEL
用於控制內核時鐘選擇由內部時鐘源(APB時鐘或LSE、LSI和HSI等任何其他內置振盪器)提供時鐘。
也可以選擇由外部時鐘源通過 LPTIM 外部 Input提供時鐘。
(2) Count mode對應的是CFGR寄存器的bit23:COUNTMODE計數模式位,用於選擇 LPTIM 使用哪個時鐘源來為計數器提供時鐘。
可以選擇計數器在每個內部時鐘脈衝後遞增。
或者在 LPTIM 外部 Input上的每個有效時鐘脈衝後遞增。
3、應用的時候,我們可以選擇
(1) CKSEL = 0 , COUNTMODE = 0
表示LPTIM內核時鐘使用的內部時鐘源,計數器通過內部時鐘脈計數。
(2) CKSEL = 0 , COUNTMODE = 1
表示LPTIM內核時鐘使用的內部時鐘源,計數器通過外部輸入脈衝計數。
(3) CKSEL = 1 , COUNTMODE = x
表示LPTIM內核時鐘使用的外部時鐘源,計數器通過外部輸入脈衝計數。
定時器句柄結構體LPTIM_HandleTypeDef
時鐘源參數Source可以選擇如下兩種。
- #define LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC ((uint32_t)0x00U)
- 表示LPTIM 由內部時鐘源(APB 時鐘或APB 或 LSE、LSI和HSI等)提供時鐘。
- #define LPTIM_CLOCKSOURCE_ULPTIM LPTIM_CFGR_CKSEL
- 表示LPTIM 由外部時鐘源通過 LPTIM 外部 Input1 提供時鐘。
One-shot mode
Continous mode
Timeout function
The detection of an active edge on one selected trigger input can be used to reset the LPTIM counter. This feature is controlled through the TIMOUT bit.
The first trigger event will start the timer, any successive trigger event will reset the counter and the timer will restart.
Timeout
/* ### Start the Timeout function in interrupt mode ################# */
/*
* Period = 65535
* Pulse = 32767
* According to this configuration (LPTIMER clocked by LSE & compare = 32767,
* the Timeout period = (compare + 1)/LSE_Frequency = 1s
*/
if (HAL_LPTIM_TimeOut_Start_IT(&hlptim1, PERIOD, TIMEOUT) != HAL_OK)
{
Error_Handler();
}
//will use this call back function
void HAL_LPTIM_CompareMatchCallback(LPTIM_HandleTypeDef *hlptim)
PulseCounter
/* ### Start counting in interrupt mode ############################# */
/*
* Period = 1000
*/
if (HAL_LPTIM_Counter_Start_IT(&hlptim1, 1000) != HAL_OK)
{
Error_Handler();
}
//will use this call back function
void HAL_LPTIM_AutoReloadMatchCallback(LPTIM_HandleTypeDef *hlptim)