|
STM32G474xx HAL 用户手册
|
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(