1 /**
2 ******************************************************************************
3 * @file stm32wlxx_ll_comp.c
4 * @author MCD Application Team
5 * @brief COMP LL module driver
6 ******************************************************************************
7 * @attention
8 *
9 * Copyright (c) 2020 STMicroelectronics.
10 * All rights reserved.
11 *
12 * This software is licensed under terms that can be found in the LICENSE file
13 * in the root directory of this software component.
14 * If no LICENSE file comes with this software, it is provided AS-IS.
15 *
16 ******************************************************************************
17 */
18 #if defined(USE_FULL_LL_DRIVER)
19
20 /* Includes ------------------------------------------------------------------*/
21 #include "stm32wlxx_ll_comp.h"
22
23 #ifdef USE_FULL_ASSERT
24 #include "stm32_assert.h"
25 #else
26 #define assert_param(expr) ((void)0U)
27 #endif /* USE_FULL_ASSERT */
28
29 /** @addtogroup STM32WLxx_LL_Driver
30 * @{
31 */
32
33
34
35 /** @addtogroup COMP_LL COMP
36 * @{
37 */
38
39 /* Private types -------------------------------------------------------------*/
40 /* Private variables ---------------------------------------------------------*/
41 /* Private constants ---------------------------------------------------------*/
42 /* Private macros ------------------------------------------------------------*/
43
44 /** @addtogroup COMP_LL_Private_Macros
45 * @{
46 */
47
48 /* Check of parameters for configuration of COMP hierarchical scope: */
49 /* COMP instance. */
50
51 #define IS_LL_COMP_POWER_MODE(__POWER_MODE__) \
52 ( ((__POWER_MODE__) == LL_COMP_POWERMODE_HIGHSPEED) \
53 || ((__POWER_MODE__) == LL_COMP_POWERMODE_MEDIUMSPEED) \
54 || ((__POWER_MODE__) == LL_COMP_POWERMODE_ULTRALOWPOWER) \
55 )
56
57 #define IS_LL_COMP_INPUT_PLUS(__COMP_INSTANCE__, __INPUT_PLUS__) \
58 ((__COMP_INSTANCE__ == COMP1) \
59 ? ( ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO1) \
60 || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO2) \
61 ) \
62 : \
63 ( ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO1) \
64 || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO2) \
65 || ((__INPUT_PLUS__) == LL_COMP_INPUT_PLUS_IO3) \
66 ) \
67 )
68
69 /* Note: On this STM32 series, comparator input minus parameters are */
70 /* the same on all COMP instances. */
71 /* However, comparator instance kept as macro parameter for */
72 /* compatibility with other STM32 families. */
73 #define IS_LL_COMP_INPUT_MINUS(__COMP_INSTANCE__, __INPUT_MINUS__) \
74 ( ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_1_4VREFINT) \
75 || ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_1_2VREFINT) \
76 || ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_3_4VREFINT) \
77 || ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_VREFINT) \
78 || ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_DAC_CH1) \
79 || ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_IO1) \
80 || ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_IO2) \
81 || ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_IO3) \
82 || ((__INPUT_MINUS__) == LL_COMP_INPUT_MINUS_IO4) \
83 )
84
85 #define IS_LL_COMP_INPUT_HYSTERESIS(__INPUT_HYSTERESIS__) \
86 ( ((__INPUT_HYSTERESIS__) == LL_COMP_HYSTERESIS_NONE) \
87 || ((__INPUT_HYSTERESIS__) == LL_COMP_HYSTERESIS_LOW) \
88 || ((__INPUT_HYSTERESIS__) == LL_COMP_HYSTERESIS_MEDIUM) \
89 || ((__INPUT_HYSTERESIS__) == LL_COMP_HYSTERESIS_HIGH) \
90 )
91
92 #define IS_LL_COMP_OUTPUT_POLARITY(__POLARITY__) \
93 ( ((__POLARITY__) == LL_COMP_OUTPUTPOL_NONINVERTED) \
94 || ((__POLARITY__) == LL_COMP_OUTPUTPOL_INVERTED) \
95 )
96
97 #define IS_LL_COMP_OUTPUT_BLANKING_SOURCE(__OUTPUT_BLANKING_SOURCE__) \
98 ( ((__OUTPUT_BLANKING_SOURCE__) == LL_COMP_BLANKINGSRC_NONE) \
99 || ((__OUTPUT_BLANKING_SOURCE__) == LL_COMP_BLANKINGSRC_TIM1_OC5) \
100 || ((__OUTPUT_BLANKING_SOURCE__) == LL_COMP_BLANKINGSRC_TIM2_OC3) \
101 )
102
103 /**
104 * @}
105 */
106
107
108 /* Private function prototypes -----------------------------------------------*/
109
110 /* Exported functions --------------------------------------------------------*/
111 /** @addtogroup COMP_LL_Exported_Functions
112 * @{
113 */
114
115 /** @addtogroup COMP_LL_EF_Init
116 * @{
117 */
118
119 /**
120 * @brief De-initialize registers of the selected COMP instance
121 * to their default reset values.
122 * @note If comparator is locked, de-initialization by software is
123 * not possible.
124 * The only way to unlock the comparator is a device hardware reset.
125 * @param COMPx COMP instance
126 * @retval An ErrorStatus enumeration value:
127 * - SUCCESS: COMP registers are de-initialized
128 * - ERROR: COMP registers are not de-initialized
129 */
LL_COMP_DeInit(COMP_TypeDef * COMPx)130 ErrorStatus LL_COMP_DeInit(COMP_TypeDef *COMPx)
131 {
132 ErrorStatus status = SUCCESS;
133
134 /* Check the parameters */
135 assert_param(IS_COMP_ALL_INSTANCE(COMPx));
136
137 /* Note: Hardware constraint (refer to description of this function): */
138 /* COMP instance must not be locked. */
139 if (LL_COMP_IsLocked(COMPx) == 0UL)
140 {
141 LL_COMP_WriteReg(COMPx, CSR, 0x00000000UL);
142
143 }
144 else
145 {
146 /* Comparator instance is locked: de-initialization by software is */
147 /* not possible. */
148 /* The only way to unlock the comparator is a device hardware reset. */
149 status = ERROR;
150 }
151
152 return status;
153 }
154
155 /**
156 * @brief Initialize some features of COMP instance.
157 * @note This function configures features of the selected COMP instance.
158 * Some features are also available at scope COMP common instance
159 * (common to several COMP instances).
160 * Refer to functions having argument "COMPxy_COMMON" as parameter.
161 * @param COMPx COMP instance
162 * @param COMP_InitStruct Pointer to a @ref LL_COMP_InitTypeDef structure
163 * @retval An ErrorStatus enumeration value:
164 * - SUCCESS: COMP registers are initialized
165 * - ERROR: COMP registers are not initialized
166 */
LL_COMP_Init(COMP_TypeDef * COMPx,const LL_COMP_InitTypeDef * COMP_InitStruct)167 ErrorStatus LL_COMP_Init(COMP_TypeDef *COMPx, const LL_COMP_InitTypeDef *COMP_InitStruct)
168 {
169 ErrorStatus status = SUCCESS;
170
171 /* Check the parameters */
172 assert_param(IS_COMP_ALL_INSTANCE(COMPx));
173 assert_param(IS_LL_COMP_POWER_MODE(COMP_InitStruct->PowerMode));
174 assert_param(IS_LL_COMP_INPUT_PLUS(COMPx, COMP_InitStruct->InputPlus));
175 assert_param(IS_LL_COMP_INPUT_MINUS(COMPx, COMP_InitStruct->InputMinus));
176 assert_param(IS_LL_COMP_INPUT_HYSTERESIS(COMP_InitStruct->InputHysteresis));
177 assert_param(IS_LL_COMP_OUTPUT_POLARITY(COMP_InitStruct->OutputPolarity));
178 assert_param(IS_LL_COMP_OUTPUT_BLANKING_SOURCE(COMP_InitStruct->OutputBlankingSource));
179
180 /* Note: Hardware constraint (refer to description of this function) */
181 /* COMP instance must not be locked. */
182 if (LL_COMP_IsLocked(COMPx) == 0UL)
183 {
184 /* Configuration of comparator instance : */
185 /* - PowerMode */
186 /* - InputPlus */
187 /* - InputMinus */
188 /* - InputHysteresis */
189 /* - OutputPolarity */
190 /* - OutputBlankingSource */
191 MODIFY_REG(COMPx->CSR,
192 COMP_CSR_PWRMODE
193 | COMP_CSR_INPSEL
194 | COMP_CSR_SCALEN
195 | COMP_CSR_BRGEN
196 | COMP_CSR_INMESEL
197 | COMP_CSR_INMSEL
198 | COMP_CSR_HYST
199 | COMP_CSR_POLARITY
200 | COMP_CSR_BLANKING
201 ,
202 COMP_InitStruct->PowerMode
203 | COMP_InitStruct->InputPlus
204 | COMP_InitStruct->InputMinus
205 | COMP_InitStruct->InputHysteresis
206 | COMP_InitStruct->OutputPolarity
207 | COMP_InitStruct->OutputBlankingSource
208 );
209
210 }
211 else
212 {
213 /* Initialization error: COMP instance is locked. */
214 status = ERROR;
215 }
216
217 return status;
218 }
219
220 /**
221 * @brief Set each @ref LL_COMP_InitTypeDef field to default value.
222 * @param COMP_InitStruct Pointer to a @ref LL_COMP_InitTypeDef structure
223 * whose fields will be set to default values.
224 * @retval None
225 */
LL_COMP_StructInit(LL_COMP_InitTypeDef * COMP_InitStruct)226 void LL_COMP_StructInit(LL_COMP_InitTypeDef *COMP_InitStruct)
227 {
228 /* Set COMP_InitStruct fields to default values */
229 COMP_InitStruct->PowerMode = LL_COMP_POWERMODE_ULTRALOWPOWER;
230 COMP_InitStruct->InputPlus = LL_COMP_INPUT_PLUS_IO1;
231 COMP_InitStruct->InputMinus = LL_COMP_INPUT_MINUS_VREFINT;
232 COMP_InitStruct->InputHysteresis = LL_COMP_HYSTERESIS_NONE;
233 COMP_InitStruct->OutputPolarity = LL_COMP_OUTPUTPOL_NONINVERTED;
234 COMP_InitStruct->OutputBlankingSource = LL_COMP_BLANKINGSRC_NONE;
235 }
236
237 /**
238 * @}
239 */
240
241 /**
242 * @}
243 */
244
245 /**
246 * @}
247 */
248
249
250
251 /**
252 * @}
253 */
254
255 #endif /* USE_FULL_LL_DRIVER */
256