STM32G474xx HAL 用户手册
stm32g4xx_hal_comp.c
转到此文件的文档。
00001 /**
00002   ******************************************************************************
00003   * @file    stm32g4xx_hal_comp.c
00004   * @author  MCD Application Team
00005   * @brief   COMP HAL模块驱动程序。
00006   *          本文件提供固件功能,用于管理COMP外设的以下功能:
00007   *           + 初始化和反初始化函数
00008   *           + 外设控制函数
00009   *           + 外设状态函数
00010   *
00011   ******************************************************************************
00012   * @attention
00013   *
00014   * Copyright (c) 2019 STMicroelectronics.
00015   * All rights reserved.
00016   *
00017   * This software is licensed under terms that can be found in the LICENSE file
00018   * in the root directory of this software component.
00019   * If no LICENSE file comes with this software, it is provided AS-IS.
00020   *
00021   ******************************************************************************
00022   @verbatim
00023   ==============================================================================
00024           ##### COMP 外设特性 #####
00025   ==============================================================================
00026 
00027   [..]
00028       STM32G4xx器件系列集成了七个模拟比较器实例:
00029       COMP1、COMP2、COMP3、COMP4、COMP5、COMP6和COMP7。
00030       (#) 比较器的输入负端(反相输入)和输入正端(非反相输入)
00031           可以设置为内部参考源或GPIO引脚
00032           (请参阅参考手册中的GPIO列表)。
00033 
00034       (#) 比较器输出电平可通过HAL_COMP_GetOutputLevel()获取,
00035           并可重定向到其他外设:GPIO引脚(比较器的复用功能模式)、定时器。
00036           (请参阅参考手册中的GPIO列表)。
00037 
00038       (#) 比较器具有通过EXTI控制器的中断能力,
00039           支持从睡眠和停止模式唤醒。
00040 
00041           在相应的IRQ处理程序中,可以使用宏__HAL_COMP_COMPx_EXTI_GET_FLAG()获取正确的中断源。
00043 
00045             ##### 如何使用此驱动 #####
00046   ==============================================================================
00047   [..]
00048       本驱动提供函数用于配置和编程STM32G4xx器件的比较器实例。
00050 
00050       要使用比较器,请按以下步骤操作:
00052 
00053       (#)  通过实现HAL_COMP_MspInit()初始化COMP底层资源:
00054       (++) 使用HAL_GPIO_Init()配置连接到比较器正负输入端的GPIO为模拟模式。
00055       (++) 如有需要,使用HAL_GPIO_Init()将连接到比较器输出的GPIO配置为复用功能模式。
00056       (++) 如需要,使用HAL_GPIO_Init()函数以中断模式配置并启用EXTI线路,选择所需敏感级别,然后使用HAL_NVIC_EnableIRQ()函数启用比较器中断向量。
00057 
00058       (#)  使用HAL_COMP_Init()函数配置比较器:
00059       (++) 选择输入负端(反相输入)
00060       (++) 选择输入正端(非反相输入)
00061       (++) 选择迟滞
00062       (++) 选择消隐源
00063       (++) 选择输出极性
00064 
00065       -@@- HAL_COMP_Init()内部调用__HAL_RCC_SYSCFG_CLK_ENABLE()
00066           以启用比较器的内部控制时钟。
00067           但是,这是一个遗留策略。在未来的STM32系列中,
00068           COMP时钟使能必须在"HAL_COMP_MspInit()"中由用户实现。
00070           因此,为兼容性考虑,建议在"HAL_COMP_MspInit()"中实现__HAL_RCC_SYSCFG_CLK_ENABLE()。
00070 
00071       (#)  可以随时通过使用新输入结构参数值再次调用HAL_COMP_Init()函数进行重新配置。
00072 
00073       (#)  使用HAL_COMP_Start()函数使能比较器。
00074 
00075       (#)  使用HAL_COMP_TriggerCallback()或HAL_COMP_GetOutputLevel()函数
00076           管理比较器输出(事件和输出电平)。
00077 
00078       (#)  使用HAL_COMP_Stop()函数禁用比较器。
00079 
00080       (#)  使用HAL_COMP_DeInit()函数反初始化比较器。
00081 
00082       (#)  为安全起见,可以使用HAL_COMP_Lock()函数锁定比较器配置。
00083           唯一的解锁方式是设备硬件复位。
00084 
00085     *** 回调注册 ***
00086     =============================================
00087     [..]
00088 
00089      编译标志USE_HAL_COMP_REGISTER_CALLBACKS,当设置为1时,
00090      允许用户动态配置驱动回调。
00091      使用函数HAL_COMP_RegisterCallback()
00092      注册中断回调。
00093     [..]

00095      函数HAL_COMP_RegisterCallback()允许注册以下回调:
00096        (+) TriggerCallback       : COMP触发回调。
00097        (+) MspInitCallback       : MspInit回调。
00098        (+) MspDeInitCallback     : MspDeInit回调。
00099      此函数需要HAL外设句柄、回调ID和用户回调函数指针作为参数。
00100     [..]
00101 
00102      使用函数HAL_COMP_UnRegisterCallback将回调重置为默认
00103      弱函数。
00104     [..]
00105 
00106      HAL_COMP_UnRegisterCallback需要HAL外设句柄和
00107      回调ID作为参数。
00108      此函数允许重置以下回调:
00109        (+) TriggerCallback       : COMP触发回调。
00110        (+) MspInitCallback       : MspInit回调。
00111        (+) MspDeInitCallback     : MspDeInit回调。
00112     [..]
00113 
00114      默认情况下,在HAL_COMP_Init()之后且状态为HAL_COMP_STATE_RESET时,
00115      所有回调都设置为相应的弱函数:
00116      例如HAL_COMP_TriggerCallback()。
00117      例外情况是MspInit和MspDeInit函数,它们仅在
00118      这些回调为空(之前未注册)时在HAL_COMP_Init()/HAL_COMP_DeInit()中
00119      重置为遗留弱函数。
00120     [..]
00121 
00122      如果MspInit或MspDeInit不为空,HAL_COMP_Init()/HAL_COMP_DeInit()
00123      会保留并使用用户的MspInit/MspDeInit回调(无论状态如何,之前注册的)。
00124     [..]
00125 
00126      回调只能在HAL_COMP_STATE_READY状态下注册/注销。
00127      例外情况是MspInit/MspDeInit函数可以在HAL_COMP_STATE_READY或HAL_COMP_STATE_RESET状态下注册/注销,
00128      因此注册的(用户)MspInit/DeInit回调可用于Init/DeInit期间。
00129     [..]
00130 
00131      然后,用户首先使用HAL_COMP_RegisterCallback()注册MspInit/MspDeInit用户回调,
00132      然后再调用HAL_COMP_DeInit()或HAL_COMP_Init()函数。
00133     [..]
00134 
00135      当编译标志USE_HAL_COMP_REGISTER_CALLBACKS设置为0或
00136      未定义时,回调注册功能不可用,所有回调
00137      都设置为相应的弱函数。
00138 
00139   @endverbatim
00140   ******************************************************************************
00141   */
00142 
00143 /* Includes ------------------------------------------------------------------*/
00144 #include "stm32g4xx_hal.h"
00145 
00146 /** @addtogroup STM32G4xx_HAL_Driver
00147   * @{
00148   */
00149 
00150 #ifdef HAL_COMP_MODULE_ENABLED
00151 
00152 
00153 
00154 /** @defgroup COMP COMP
00155   * @brief COMP HAL模块驱动程序
00156   * @{
00157   */
00158 
00159 /* Private typedef -----------------------------------------------------------*/
00160 /* Private define ------------------------------------------------------------*/
00161 /** @addtogroup COMP_Private_Constants
00162   * @{
00163   */
00164 
00165 /* COMP启动时间延迟。                                               */
00166 /* 注意:需要延迟以达到传播延迟规格。             */
00167 /* 字面量设置为最大值(请参阅器件数据手册,                   */
00168 /* 参数"tSTART")。                                                       */
00169 /* 单位:微秒                                                                   */
00170 00180 #define COMP_DELAY_STARTUP_US           (5UL)      /*!< COMP启动时间延迟 */
00181 
00182 /* COMP电压Scaler稳定时间延迟。                          */
00183 /* 字面量设置为最大值(请参阅器件数据手册,                   */
00184 /* 参数"tSTART_SCALER")。                                                */
00185 /* 单位:微秒                                                                   */
00186 00186 #define COMP_DELAY_VOLTAGE_SCALER_STAB_US (200UL)  /*!< COMP电压Scaler稳定时间延迟 */
00187 
00188 00188 #define COMP_OUTPUT_LEVEL_BITOFFSET_POS    (30UL)
00189 
00190 /**
00191   * @}
00192   */
00193 
00194 /* Private macro -------------------------------------------------------------*/
00195 /* Private variables ---------------------------------------------------------*/
00196 /* Private function prototypes -----------------------------------------------*/
00197 /* Exported functions --------------------------------------------------------*/
00198 
00199 /** @defgroup COMP_Exported_Functions COMP导出函数
00200   * @{
00201   */
00202 
00203 /** @defgroup COMP_Exported_Functions_Group1 初始化/反初始化函数
00204   *  @brief    初始化和反初始化函数。
00205   *
00206 @verbatim
00207  ===============================================================================
00208               ##### 初始化和反初始化函数 #####
00209  ===============================================================================
00210     [..]  本节提供初始化和反初始化比较器的函数
00211 
00212 @endverbatim
00213   * @{
00214   */
00215 
00216 /**
00217   * @brief  根据COMP_InitTypeDef中的指定参数初始化COMP,并初始化相关的句柄。
00218   * @note   如果选中的比较器被锁定,则无法执行初始化。
00219   *         要解锁配置,请执行系统复位。
00220   * @param  hcomp  COMP句柄
00221   * @retval HAL状态
00222   */
00223 00224 HAL_StatusTypeDef HAL_COMP_Init(COMP_HandleTypeDef *hcomp)
00225 {
00226   uint32_t tmp_csr;
00227   uint32_t exti_line;
00228   uint32_t comp_voltage_scaler_initialized; /* 如果比较器电压Scaler未初始化则为值"0" */
00229   __IO uint32_t wait_loop_index = 0UL;
00230   HAL_StatusTypeDef status = HAL_OK;
00231 
00232   /* 检查COMP句柄分配和锁定状态 */
00233   if (hcomp == NULL)
00234   {
00235     status = HAL_ERROR;
00236   }
00237   else if (__HAL_COMP_IS_LOCKED(hcomp))
00238   {
00239     status = HAL_ERROR;
00240   }
00241   else
00242   {
00243     /* 检查参数 */
00244     assert_param(IS_COMP_ALL_INSTANCE(hcomp->Instance));
00245     assert_param(IS_COMP_INPUT_PLUS(hcomp->Instance, hcomp->Init.InputPlus));
00246     assert_param(