说明:
1、主要是LPTIM的6种工作模式学习。
==============================================================================
##### 如何使用此驱动 #####
==============================================================================
1、低功耗定时器的底层配置是通过函数HAL_LPTIM_MspInit()实现
(1)使用函数__HAL_RCC_LPTIMx_CLK_ENABLE()使能定时器时钟。
(2)如果调用函数HAL_LPTIM_PWM_Start_IT()使能了中断,需要调用HAL_NVIC_SetPriority()设置中断优先级,调用函数HAL_NVIC_EnableIRQ()使能中断,在中断服务程序里面调用 HAL_LPTIM_IRQHandler。
2、通过函数HAL_LPTIM_Init()做初始化,主要配置的内容如下:
(1)支持LPTIM1和LPTIM2的配置(官方手册给出的说明是有5个定时器的,程序里面不知为何注释只有LPTIM1和LPTIM2的初始化)
(2)定时器的时钟源可以选择ULPTIM input (IN1),APB, LSE, LSI 或者 HSI,且可以设置分频。
(3)超低功耗时钟UltraLowPowerClock需要选择ULPTIM,同时配置时钟极性和采样时间。
(4)触发器:计数器如何启动。
(a)来源:触发器可以是软件或其中一个硬件触发器。
(b)ActiveEdge:仅用于硬件触发。
(c)SampleTime:触发采样时间以配置触发器毛刺滤波器。
(5)输出极性:有两种相反的极性可选。
(6)更新模式:指定是否立即更新自动加载值和比较值,立即完成或在当前结束后完成 期。
(7)Input1Source:GPIO 或 比较器输出。
Input2Source:GPIO 或 比较器输出,由于Input2仅能用于编码器功能,因此Input2只能用于LPTIM1(这个待考证)
3、6种工作模式
(1)PWM模式:
启动此模式可调用HAL_LPTIM_PWM_Start()或 HAL_LPTIM_PWM_Start_IT()用于中断模式。
(2)单脉冲模式:
启动此模式可调用HAL_LPTIM_OnePulse_Start()或HAL_LPTIM_OnePulse_Start_IT()用于中断模式。
(3)单次模式:
在此模式下,当满足匹配条件时,输出可以切换高低电平(从如果输出极性配置为高,则为低电平至高电平,反之亦然)
启动此模式可可调用HAL_LPTIM_SetOnce_Start()或 HAL_LPTIM_SetOnce_Start_IT()用于中断模式。
(4)编码器模式:
启动此模式可调用HAL_LPTIM_Encoder_Start()或HAL_LPTIM_Encoder_Start_IT()中断模式。仅适用于LPTIM1(待考证)。
(5)超时模式:
有效的边沿触发输入可复位定时器。第一个触发事件将启动计时器,任何连续触发事件将重置计数器并重新开始。
启动此模式可可调用HAL_LPTIM_TimeOut_Start()或 HAL_LPTIM_TimeOut_Start_IT()用于中断模式。
(6)计数器模式:
计数器可用于计算来自Input1的外部事件或用于计算内部时钟周期。
启动此模式可调用HAL_LPTIM_Counter_Start()或 HAL_LPTIM_Counter_Start_IT()用于中断模式。
4、用户可以通过调用相应的API来停止任何模式: HAL_LPTIM_Xxx_Stop 或 HAL_LPTIM_Xxx_Stop_IT(如果此模式已经在中断模式下启动)。
5、函数HAL_LPTIM_DeInit()用来复位定时器配置。
初始化和复位初始化
HAL_StatusTypeDef HAL_LPTIM_Init(LPTIM_HandleTypeDef *hlptim);
HAL_StatusTypeDef HAL_LPTIM_DeInit(LPTIM_HandleTypeDef *hlptim);
底层初始化API接口函数
void HAL_LPTIM_MspInit(LPTIM_HandleTypeDef *hlptim);
void HAL_LPTIM_MspDeInit(LPTIM_HandleTypeDef *hlptim);
PWM模式
HAL_StatusTypeDef HAL_LPTIM_PWM_Start(LPTIM_HandleTypeDef *hlptim, uint32_t Period, uint32_t Pulse);
HAL_StatusTypeDef HAL_LPTIM_PWM_Stop(LPTIM_HandleTypeDef *hlptim);
HAL_StatusTypeDef HAL_LPTIM_PWM_Start_IT(LPTIM_HandleTypeDef *hlptim, uint32_t Period, uint32_t Pulse);
HAL_StatusTypeDef HAL_LPTIM_PWM_Stop_IT(LPTIM_HandleTypeDef *hlptim);
单脉冲模式
HAL_StatusTypeDef HAL_LPTIM_OnePulse_Start(LPTIM_HandleTypeDef *hlptim, uint32_t Period, uint32_t Pulse);
HAL_StatusTypeDef HAL_LPTIM_OnePulse_Stop(LPTIM_HandleTypeDef *hlptim);
HAL_StatusTypeDef HAL_LPTIM_OnePulse_Start_IT(LPTIM_HandleTypeDef *hlptim, uint32_t Period, uint32_t Pulse);
HAL_StatusTypeDef HAL_LPTIM_OnePulse_Stop_IT(LPTIM_HandleTypeDef *hlptim);
单次模式
HAL_StatusTypeDef HAL_LPTIM_SetOnce_Start(LPTIM_HandleTypeDef *hlptim, uint32_t Period, uint32_t Pulse);
HAL_StatusTypeDef HAL_LPTIM_SetOnce_Stop(LPTIM_HandleTypeDef *hlptim);
HAL_StatusTypeDef HAL_LPTIM_SetOnce_Start_IT(LPTIM_HandleTypeDef *hlptim, uint32_t Period, uint32_t Pulse);
HAL_StatusTypeDef HAL_LPTIM_SetOnce_Stop_IT(LPTIM_HandleTypeDef *hlptim);
编码器模式
HAL_StatusTypeDef HAL_LPTIM_Encoder_Start(LPTIM_HandleTypeDef *hlptim, uint32_t Period);
HAL_StatusTypeDef HAL_LPTIM_Encoder_Stop(LPTIM_HandleTypeDef *hlptim);
HAL_StatusTypeDef HAL_LPTIM_Encoder_Start_IT(LPTIM_HandleTypeDef *hlptim, uint32_t Period);
HAL_StatusTypeDef HAL_LPTIM_Encoder_Stop_IT(LPTIM_HandleTypeDef *hlptim);
超时模式
HAL_StatusTypeDef HAL_LPTIM_TimeOut_Start(LPTIM_HandleTypeDef *hlptim, uint32_t Period, uint32_t Timeout);
HAL_StatusTypeDef HAL_LPTIM_TimeOut_Stop(LPTIM_HandleTypeDef *hlptim);
HAL_StatusTypeDef HAL_LPTIM_TimeOut_Start_IT(LPTIM_HandleTypeDef *hlptim, uint32_t Period, uint32_t Timeout);
HAL_StatusTypeDef HAL_LPTIM_TimeOut_Stop_IT(LPTIM_HandleTypeDef *hlptim);
计数器模式
HAL_StatusTypeDef HAL_LPTIM_Counter_Start(LPTIM_HandleTypeDef *hlptim, uint32_t Period);
HAL_StatusTypeDef HAL_LPTIM_Counter_Stop(LPTIM_HandleTypeDef *hlptim);
HAL_StatusTypeDef HAL_LPTIM_Counter_Start_IT(LPTIM_HandleTypeDef *hlptim, uint32_t Period);
HAL_StatusTypeDef HAL_LPTIM_Counter_Stop_IT(LPTIM_HandleTypeDef *hlptim);
读操作
uint32_t HAL_LPTIM_ReadCounter(LPTIM_HandleTypeDef *hlptim);
uint32_t HAL_LPTIM_ReadAutoReload(LPTIM_HandleTypeDef *hlptim);
uint32_t HAL_LPTIM_ReadCompare(LPTIM_HandleTypeDef *hlptim);
LPTIM中断
void HAL_LPTIM_IRQHandler(LPTIM_HandleTypeDef *hlptim);
回调函数
void HAL_LPTIM_CompareMatchCallback(LPTIM_HandleTypeDef *hlptim);
void HAL_LPTIM_AutoReloadMatchCallback(LPTIM_HandleTypeDef *hlptim);
void HAL_LPTIM_TriggerCallback(LPTIM_HandleTypeDef *hlptim);
void HAL_LPTIM_CompareWriteCallback(LPTIM_HandleTypeDef *hlptim);
void HAL_LPTIM_AutoReloadWriteCallback(LPTIM_HandleTypeDef *hlptim);
void HAL_LPTIM_DirectionUpCallback(LPTIM_HandleTypeDef *hlptim);
void HAL_LPTIM_DirectionDownCallback(LPTIM_HandleTypeDef *hlptim);
定时器状态获取
HAL_LPTIM_StateTypeDef HAL_LPTIM_GetState(LPTIM_HandleTypeDef *hlptim); |