STM32L0系列 - LPTIM
LPTIM介绍
- LPTIM是一个16位的定时器,可多个时钟源,可在所有电源模式下(除Standby模式下)可以保持运行状态,几遍没有内部时钟源,LPTIM已经可以运行。主要用于脉冲计数器、低功耗模式下唤醒、超时功能等。
LPTIM的主要特性
16位的递增计数器
3位预分频器,可以采用8种分频(1、2、4、8、16、32、64、128)
可选时钟源
- 内部时钟源:LSE、LSI、HSI16或者APB时钟
- ULPTIM输入的外部时钟源(计数器使用)
16位的ARR自动重载寄存器
16位比较寄存器
连续、单次触发模式
可选软件、硬件输入触发
可编程的数字干扰滤波器
可 配置的输出:脉冲、PWM
可配置I/O的极性
编码器模式
LPTIM框图

LPTIM的工作模式
LPTIM支持以下两种工作模式:
- 连续模式:定时器自由运行,由触发时间启动并且到禁止之后才会停止
- 单触发模式:定时器由触发时间启动,当达到ARR值的时候停止
LPTIME 的Timeout模式
功能简介
用于Stop模式下计数器保持&唤醒
代码介绍与初始化过程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46/* ## - 1 - 系统时钟初始化############################################ */
SystemClock_Config();
/* ## - 2 - 设置LPTIM输入时钟源为HSI ############################################ */
PeriphClkInit.LptimClockSelection = RCC_LPTIM1CLKSOURCE_HSI;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
/* ## - 3 - 设置LPTIM相关参数############################################ */
hlptim1.Instance = LPTIM1;//选择LPTIM
hlptim1.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC;//选择时钟源
hlptim1.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV128;//设置分频系数
hlptim1.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE;//设置触发源
hlptim1.Init.OutputPolarity = LPTIM_OUTPUTPOLARITY_HIGH;//指定的输出电平
hlptim1.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE;//更新模式:立即更新或者结束之后更新
hlptim1.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL;//计数器源:内部或者外部
HAL_LPTIM_Init(&hlptim1);
/* ## - 4 - 使能LPTIME 外设时钟############################################ */
__HAL_RCC_LPTIM1_CLK_ENABLE();
/* ## - 5 - 设置LPTIM中断优先级############################################ */
HAL_NVIC_SetPriority(LPTIM1_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(LPTIM1_IRQn);
/* ## - 6 - 添加中断服务函数############################################ */
void LPTIM1_IRQHandler(void);
/* ## - 7 - 开启Timeout中断############################################ */
/**
* @brief 设置TimeOut中断,任意的一个翻转事件会重启计数器
* @param LPTIME句柄
* @param 自动重装载值:当计数器Count累加到重装载值之后为0,自动重新装载(最大0Xffff)
* @param Timeout计数器:当计数器累加到此值时,重启计数器
* 小于自动重装载值,小于0XFFFF
* @retval 函数的成功与失败
* @callback HAL_LPTIM_CompareMatchCallback
* @example 假设LPtim的时钟是HSI(16M),LPTIM进行128分频,那么FCount = 0.125Mhz = 125khz
* 当 T =50000/125kHz = 之后重新加载,产生中断 ;当T= 12500 /125kHz之后,唤醒MCU
* @Wakeup 以Period为周期,当Count小于Timeout时,继续低功耗;当Count大于Timeout时,退出低功 耗模式
*/
HAL_LPTIM_TimeOut_Start_IT(&hlptim1,
50000-1,//0.4s
12500-1);//0.1s
/* ## - 8 - 编写callback函数############################################ */
void HAL_LPTIM_CompareMatchCallback(LPTIM_HandleTypeDef *hlptim)
{
printf("HAL_LPTIM_CompareMatchCallback\r\n");
S_LpTIM_Config.Counter = HAL_LPTIM_ReadCounter(&hlptim1);
S_LpTIM_Config.AutoReload = HAL_LPTIM_ReadAutoReload(&hlptim1);
S_LpTIM_Config.Compare = HAL_LPTIM_ReadCompare(&hlptim1);
HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
}