STM32G474xx HAL 用户手册
stm32g4xx_hal_lptim.c
转到此文件的文档。
00001 /**
00002   ******************************************************************************
00003   * @file    stm32g4xx_hal_lptim.c
00004   * @author  MCD Application Team
00005   * @brief   LPTIM HAL 模块驱动程序。
00006   *          此文件提供固件函数,用于管理低功耗定时器 (LPTIM) 外设的以下功能:
00007   *           + 初始化和反初始化功能。
00008   *           + 轮询模式下的启动/停止操作功能。
00009   *           + 中断模式下的启动/停止操作功能。
00010   *           + 读取操作功能。
00011   *           + 外设状态功能。
00012   *
00013   ******************************************************************************
00014   * @attention
00015   *
00016   * Copyright (c) 2019 STMicroelectronics.
00017   * 保留所有权利。
00018   *
00019   * 本软件受可在本软件组件根目录下的 LICENSE 文件中找到的条款约束。
00020   * 如果本软件未附带 LICENSE 文件,则按原样提供。
00021   *
00022   ******************************************************************************
00023   @verbatim
00024   ==============================================================================
00025                      ##### 如何使用此驱动程序 #####
00026   ==============================================================================
00027     [..]
00028       LPTIM HAL 驱动程序可按如下方式使用:
00029 
00030       (#) 通过实现 HAL_LPTIM_MspInit() 来初始化 LPTIM 底层资源:
00031          (++) 使用 __HAL_RCC_LPTIMx_CLK_ENABLE() 使能 LPTIM 接口时钟。
00032          (++) 如果使用中断(例如 HAL_LPTIM_PWM_Start_IT()):
00033              (+++) 使用 HAL_NVIC_SetPriority() 配置 LPTIM 中断优先级。
00034              (+++) 使用 HAL_NVIC_EnableIRQ() 使能 LPTIM IRQ 处理程序。
00035              (+++) 在 LPTIM IRQ 处理程序中,调用 HAL_LPTIM_IRQHandler()。
00036 
00037       (#) 使用 HAL_LPTIM_Init() 初始化 LPTIM HAL。此函数主要配置:
00038          (++) 实例:LPTIM1。
00039          (++) 时钟:计数器时钟。
00040              (+++) 源:可以是 ULPTIM 输入 (IN1) 或内部时钟之一(APB、LSE 或 LSI)。
00041              (+++) 预分频器:选择时钟分频器。
00042          (++) UltraLowPowerClock:仅在选择 ULPTIM 作为计数器时钟源时使用。
00043              (+++) 极性:如果选择 ULPTIM 输入,则为计数器单元的有效边沿极性。
00044              (+++) 采样时间:用于配置时钟毛刺滤波器的时钟采样时间。
00045          (++) 触发:计数器如何启动。
00046              (+++) 源:触发可以是软件或硬件触发之一。
00047              (+++) 有效边沿:仅适用于硬件触发。
00048              (+++) 采样时间:用于配置触发毛刺滤波器的触发采样时间。
00049          (++) 输出极性:可以使用两种相反的极性。
00050          (++) 更新模式:指定自动重装载值和比较值的更新是立即进行还是在当前周期结束后进行。
00051          (++) Input1Source:为输入1选择的源(GPIO 或比较器输出)。
00052          (++) Input2Source:为输入2选择的源(GPIO 或比较器输出)。输入2仅用于编码器功能,因此仅适用于 LPTIM1 实例。
00053 
00054       (#) 提供六种模式:
00055 
00056          (++) PWM 模式:要生成具有指定周期和脉冲的 PWM 信号,请调用 HAL_LPTIM_PWM_Start() 或用于中断模式的 HAL_LPTIM_PWM_Start_IT()。
00057 
00058          (++) 单脉冲模式:要生成响应于激励的具有指定宽度的脉冲,请调用 HAL_LPTIM_OnePulse_Start() 或用于中断模式的 HAL_LPTIM_OnePulse_Start_IT()。
00059 
00060          (++) 单次设置模式:在此模式下,当发生比较匹配时,输出会改变电平(如果输出极性配置为高,则从低电平变为高电平,否则相反)。要启动此模式,请调用 HAL_LPTIM_SetOnce_Start() 或用于中断模式的 HAL_LPTIM_SetOnce_Start_IT()。
00061 
00062          (++) 编码器模式:要使用编码器接口,请调用 HAL_LPTIM_Encoder_Start() 或用于中断模式的 HAL_LPTIM_Encoder_Start_IT()。仅适用于 LPTIM1 实例。
00063 
00064          (++) 超时模式:所选触发输入上的有效边沿会重置计数器。第一个触发事件将启动定时器,任何后续触发事件都将重置计数器,定时器将重新启动。要启动此模式,请调用 HAL_LPTIM_TimeOut_Start_IT() 或用于中断模式的 HAL_LPTIM_TimeOut_Start_IT()。
00065 
00066          (++) 计数器模式:计数器可用于计算 LPTIM Input1 上的外部事件,或用于计算内部时钟周期。要启动此模式,请调用 HAL_LPTIM_Counter_Start() 或用于中断模式的 HAL_LPTIM_Counter_Start_IT()。
00067 
00068 
00069       (#) 用户可以通过调用相应的 API 来停止任何进程:HAL_LPTIM_Xxx_Stop() 或如果进程已在中断模式下启动,则调用 HAL_LPTIM_Xxx_Stop_IT()。
00070 
00071       (#) 使用 HAL_LPTIM_DeInit() 反初始化 LPTIM 外设。
00072 
00073     *** 回调注册 ***
00074   =============================================
00075   [..]
00076   编译定义 USE_HAL_LPTIM_REGISTER_CALLBACKS 设置为 1 时,允许用户动态配置驱动程序回调。
00077   [..]
00078   使用函数 HAL_LPTIM_RegisterCallback() 注册回调。HAL_LPTIM_RegisterCallback() 的参数为 HAL 外设句柄、回调 ID 和指向用户回调函数的指针。
00079   [..]
00080   使用函数 HAL_LPTIM_UnRegisterCallback() 将回调重置为默认弱函数。HAL_LPTIM_UnRegisterCallback 的参数为 HAL 外设句柄和回调 ID。
00081   [..]
00082   这些函数允许注册/注销以下回调:
00083 
00084     (+) MspInitCallback         : LPTIM 基础 Msp 初始化回调。
00085     (+) MspDeInitCallback       : LPTIM 基础 Msp 反初始化回调。
00086     (+) CompareMatchCallback    : 比较匹配回调。
00087     (+) AutoReloadMatchCallback : 自动重装载匹配回调。
00088     (+) TriggerCallback         : 外部触发事件检测回调。
00089     (+) CompareWriteCallback    : 比较寄存器写入完成回调。
00090     (+) AutoReloadWriteCallback : 自动重装载寄存器写入完成回调。
00091     (+) DirectionUpCallback     : 向上计数方向改变回调。
00092     (+) DirectionDownCallback   : 向下计数方向改变回调。
00093 
00094   [..]
00095   默认情况下,初始化后且状态为 HAL_LPTIM_STATE_RESET 时,所有中断回调都设置为相应的弱函数:例如 HAL_LPTIM_TriggerCallback()、HAL_LPTIM_CompareMatchCallback()。
00096 
00097   [..]
00098   MspInit 和 MspDeInit 函数的例外情况是,仅当这些回调为空(未事先注册)时,才会在 Init/DeInit 中重置为传统弱功能。如果 MspInit 或 MspDeInit 不为空,则 Init/DeInit 会保留并使用用户 MspInit/MspDeInit 回调(事先注册)。
00099 
00100   [..]
00101   回调只能在 HAL_LPTIM_STATE_READY 状态下注册/注销。MspInit/MspDeInit 的例外情况是,可以在 HAL_LPTIM_STATE_READY 或 HAL_LPTIM_STATE_RESET 状态下注册/注销,因此注册的(用户)MspInit/DeInit 回调可在 Init/DeInit 期间使用。在这种情况下,请在调用 DeInit 或 Init 函数之前,先使用 HAL_LPTIM_RegisterCallback() 注册 MspInit/MspDeInit 用户回调。
00102 
00103   [..]
00104   当编译定义 USE_HAL_LPTIM_REGISTER_CALLBACKS 设置为 0 或未定义时,回调注册功能不可用,所有回调都设置为相应的弱函数。
00105 
00106   @endverbatim
00107   ******************************************************************************
00108   */
00109 
00110 /* 包含 ------------------------------------------------------------------*/
00111 #include "stm32g4xx_hal.h"
00112 
00113 /** @addtogroup STM32G4xx_HAL_Driver
00114   * @{
00115   */
00116 
00117 /** @defgroup LPTIM LPTIM
00118   * @brief LPTIM HAL 模块驱动程序。
00119   * @{
00120   */
00121 
00122 #ifdef HAL_LPTIM_MODULE_ENABLED
00123 
00124 
00125 
00126 /* 私有类型定义 -----------------------------------------------------------*/
00127 /* 私有定义 ------------------------------------------------------------*/
00128 /** @addtogroup LPTIM_Private_Constants
00129   * @{
00130   */
00131 #define TIMEOUT                                     1000UL /* 超时时间为 1 秒 */
00132 /**
00133   * @}
00134   */
00135 
00136 /* 私有宏 -------------------------------------------------------------*/
00137 /* 私有变量 ---------------------------------------------------------*/
00138 /* 私有函数原型 -----------------------------------------------*/
00139 #if (USE_HAL_LPTIM_REGISTER_CALLBACKS == 1)
00140 static void LPTIM_ResetCallback(LPTIM_HandleTypeDef *lptim);
00141 #endif /* USE_HAL_LPTIM_REGISTER_CALLBACKS */
00142 static HAL_StatusTypeDef LPTIM_WaitForFlag(const LPTIM_HandleTypeDef *hlptim, uint32_t flag);
00143 
00144 /* 导出函数 --------------------------------------------------------*/
00145 
00146 /** @defgroup LPTIM_Exported_Functions LPTIM 导出函数
00147   * @{
00148   */
00149 
00150 /** @defgroup LPTIM_Exported_Functions_Group1 初始化/反初始化函数
00151   *  @brief    初始化和配置函数。
00152   *
00153 @verbatim
00154   ==============================================================================
00155               ##### 初始化和反初始化函数 #####
00156   ==============================================================================
00157     [..]  本节提供允许以下操作的函数:
00158       (+) 根据 LPTIM_InitTypeDef 中指定的参数初始化 LPTIM 并初始化关联的句柄。
00159       (+) 反初始化 LPTIM 外设。
00160       (+) 初始化 LPTIM MSP。
00161       (+) 反初始化 LPTIM MSP。
00162 
00163 @endverbatim
00164   * @{
00165   */
00166 
00167 /**