STM32U083有3个LPTIMER,如果以LSI或LSE为时钟源,在除standby以外的low power模式比如stop2只有LPTIMER可以运行,其它时钟如TIM、systick都停了。个人感觉LPTIMER在一些RTOS的deep sleep的tickless模式下可以用来做定时器负责唤醒timer事件。LPTIMER cnt有16bit,最大prescaler是128,所以 如果时钟源是32768HZ的LSI,那么tickless最长延时可以达到2^16/(32768/128)=256秒,精度是1/(32768/128)秒,大概3.9毫秒,精度马马虎虎。如果LPTIMER的cnt能有24bit或32bit就更好了,这样可以既有精度又比较大的最大延时。LPTIMER结合STOP2低功耗模式可以实现一些很有意思的功能,比如以这个MCU结合墨水屏做个低功耗日历台钟,墨水屏台钟精度如果只要精确到分钟,可以LPTIMER1定时1分钟唤醒,MCU刷新墨水屏后进入stop2模式 ,这个台钟功耗应该低得吓人。
本轮STM32U083测评以开箱点灯开始,今天就以LPTIMER来实现一个点灯程序作为本轮STM32U083测评的收尾。此次点灯特别的地方在于它充分利用STM32U083的众多低功耗模式的支持和LPTIMER特性实现超低功耗的点灯,思路是MCU toggle LED后就进入stop2模式,LPTIMER定时唤醒MCU,再toggle LED,如此循环往复。
代码不用从头开始写,咱就把STM32Cube_FW_U0_V1.0.0自带的LPTIM_Timeout样例工程改改就能用。关键 修改如下:
MX_LPTIM2_Init(void)函数中把Trigger source改成software:
hlptim2.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE;
死循环进stop2低功耗模式:
/*Suspend Tick increment to prevent wakeup by Systick interrupt.
Otherwise the Systick interrupt will wake up the device within 1ms (HAL time base)*/
HAL_SuspendTick();
for (;;) {
/* ### Enter in Stop2 mode ########################################### */
HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
}
HAL_LPTIM_CompareMatchCallback()只干一件事就是toggle LED:
void HAL_LPTIM_CompareMatchCallback(LPTIM_HandleTypeDef *hlptim)
{
/* Timeout was reached, toggle LED4 */
BSP_LED_Toggle(LED4);
}
运行视频https://www.bilibili.com/video/BV1yt421N7oy/
最后谢谢21ic的测评机会!
|