1 /**
2 ******************************************************************************
3 * @file stm32h7xx_ll_dac.c
4 * @author MCD Application Team
5 * @brief DAC LL module driver
6 ******************************************************************************
7 * @attention
8 *
9 * Copyright (c) 2017 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 "stm32h7xx_ll_dac.h"
22 #include "stm32h7xx_ll_bus.h"
23
24 #ifdef USE_FULL_ASSERT
25 #include "stm32_assert.h"
26 #else
27 #define assert_param(expr) ((void)0U)
28 #endif /* USE_FULL_ASSERT */
29
30 /** @addtogroup STM32H7xx_LL_Driver
31 * @{
32 */
33
34 #if defined(DAC1) || defined(DAC2)
35
36 /** @addtogroup DAC_LL DAC
37 * @{
38 */
39
40 /* Private types -------------------------------------------------------------*/
41 /* Private variables ---------------------------------------------------------*/
42 /* Private constants ---------------------------------------------------------*/
43 /* Private macros ------------------------------------------------------------*/
44
45 /** @addtogroup DAC_LL_Private_Macros
46 * @{
47 */
48 #define IS_LL_DAC_CHANNEL(__DAC_CHANNEL__) \
49 (((__DAC_CHANNEL__) == LL_DAC_CHANNEL_1) \
50 || ((__DAC_CHANNEL__) == LL_DAC_CHANNEL_2) \
51 )
52
53 #if defined (HRTIM1)
54 #define IS_LL_DAC_TRIGGER_SOURCE(__TRIGGER_SOURCE__) \
55 (((__TRIGGER_SOURCE__) == LL_DAC_TRIG_SOFTWARE) \
56 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM1_TRGO) \
57 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM2_TRGO) \
58 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM4_TRGO) \
59 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM5_TRGO) \
60 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM6_TRGO) \
61 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM7_TRGO) \
62 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM8_TRGO) \
63 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM15_TRGO) \
64 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_HRTIM_TRGO1) \
65 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_HRTIM_TRGO2) \
66 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM1_OUT) \
67 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM2_OUT) \
68 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_EXTI_LINE9) \
69 )
70 #elif defined (DAC2)
71 #define IS_LL_DAC_TRIGGER_SOURCE(__TRIGGER_SOURCE__) \
72 (((__TRIGGER_SOURCE__) == LL_DAC_TRIG_SOFTWARE) \
73 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM1_TRGO) \
74 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM2_TRGO) \
75 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM4_TRGO) \
76 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM5_TRGO) \
77 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM6_TRGO) \
78 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM7_TRGO) \
79 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM8_TRGO) \
80 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM15_TRGO) \
81 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM1_OUT) \
82 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM2_OUT) \
83 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_EXTI_LINE9) \
84 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM3_OUT) \
85 )
86 #else
87 #define IS_LL_DAC_TRIGGER_SOURCE(__TRIGGER_SOURCE__) \
88 (((__TRIGGER_SOURCE__) == LL_DAC_TRIG_SOFTWARE) \
89 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM1_TRGO) \
90 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM2_TRGO) \
91 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM4_TRGO) \
92 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM5_TRGO) \
93 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM6_TRGO) \
94 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM7_TRGO) \
95 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM8_TRGO) \
96 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM15_TRGO) \
97 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM1_OUT) \
98 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM2_OUT) \
99 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_EXTI_LINE9) \
100 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM23_TRGO) \
101 || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM24_TRGO) \
102 )
103 #endif /* HRTIM1 */
104
105 #define IS_LL_DAC_WAVE_AUTO_GENER_MODE(__WAVE_AUTO_GENERATION_MODE__) \
106 (((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_NONE) \
107 || ((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_NOISE) \
108 || ((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_TRIANGLE) \
109 )
110
111 #define IS_LL_DAC_WAVE_AUTO_GENER_CONFIG(__WAVE_AUTO_GENERATION_MODE__, __WAVE_AUTO_GENERATION_CONFIG__) \
112 ( (((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_NOISE) \
113 && (((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BIT0) \
114 || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS1_0) \
115 || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS2_0) \
116 || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS3_0) \
117 || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS4_0) \
118 || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS5_0) \
119 || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS6_0) \
120 || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS7_0) \
121 || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS8_0) \
122 || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS9_0) \
123 || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS10_0) \
124 || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS11_0)) \
125 ) \
126 ||(((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_TRIANGLE) \
127 && (((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_1) \
128 || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_3) \
129 || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_7) \
130 || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_15) \
131 || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_31) \
132 || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_63) \
133 || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_127) \
134 || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_255) \
135 || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_511) \
136 || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_1023) \
137 || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_2047) \
138 || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_4095)) \
139 ) \
140 )
141
142 #define IS_LL_DAC_OUTPUT_BUFFER(__OUTPUT_BUFFER__) \
143 (((__OUTPUT_BUFFER__) == LL_DAC_OUTPUT_BUFFER_ENABLE) \
144 || ((__OUTPUT_BUFFER__) == LL_DAC_OUTPUT_BUFFER_DISABLE) \
145 )
146
147 #define IS_LL_DAC_OUTPUT_CONNECTION(__OUTPUT_CONNECTION__) \
148 (((__OUTPUT_CONNECTION__) == LL_DAC_OUTPUT_CONNECT_GPIO) \
149 || ((__OUTPUT_CONNECTION__) == LL_DAC_OUTPUT_CONNECT_INTERNAL) \
150 )
151
152 #define IS_LL_DAC_OUTPUT_MODE(__OUTPUT_MODE__) \
153 (((__OUTPUT_MODE__) == LL_DAC_OUTPUT_MODE_NORMAL) \
154 || ((__OUTPUT_MODE__) == LL_DAC_OUTPUT_MODE_SAMPLE_AND_HOLD) \
155 )
156
157 /**
158 * @}
159 */
160
161
162 /* Private function prototypes -----------------------------------------------*/
163
164 /* Exported functions --------------------------------------------------------*/
165 /** @addtogroup DAC_LL_Exported_Functions
166 * @{
167 */
168
169 /** @addtogroup DAC_LL_EF_Init
170 * @{
171 */
172
173 /**
174 * @brief De-initialize registers of the selected DAC instance
175 * to their default reset values.
176 * @param DACx DAC instance
177 * @retval An ErrorStatus enumeration value:
178 * - SUCCESS: DAC registers are de-initialized
179 * - ERROR: not applicable
180 */
LL_DAC_DeInit(const DAC_TypeDef * DACx)181 ErrorStatus LL_DAC_DeInit(const DAC_TypeDef *DACx)
182 {
183 /* Check the parameters */
184 assert_param(IS_DAC_ALL_INSTANCE(DACx));
185
186 if (DACx == DAC1)
187 {
188 /* Force reset of DAC clock */
189 LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_DAC12);
190
191 /* Release reset of DAC clock */
192 LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_DAC12);
193 }
194 #if defined (DAC2)
195 else
196 {
197 /* Force reset of DAC clock */
198 LL_APB4_GRP1_ForceReset(LL_APB4_GRP1_PERIPH_DAC2);
199
200 /* Release reset of DAC clock */
201 LL_APB4_GRP1_ReleaseReset(LL_APB4_GRP1_PERIPH_DAC2);
202 }
203 #endif /* DAC2 */
204
205 return SUCCESS;
206 }
207
208 /**
209 * @brief Initialize some features of DAC channel.
210 * @note @ref LL_DAC_Init() aims to ease basic configuration of a DAC channel.
211 * Leaving it ready to be enabled and output:
212 * a level by calling one of
213 * @ref LL_DAC_ConvertData12RightAligned
214 * @ref LL_DAC_ConvertData12LeftAligned
215 * @ref LL_DAC_ConvertData8RightAligned
216 * or one of the supported autogenerated wave.
217 * @note This function allows configuration of:
218 * - Output mode
219 * - Trigger
220 * - Wave generation
221 * @note The setting of these parameters by function @ref LL_DAC_Init()
222 * is conditioned to DAC state:
223 * DAC channel must be disabled.
224 * @param DACx DAC instance
225 * @param DAC_Channel This parameter can be one of the following values:
226 * @arg @ref LL_DAC_CHANNEL_1
227 * @arg @ref LL_DAC_CHANNEL_2
228 * @param DAC_InitStruct Pointer to a @ref LL_DAC_InitTypeDef structure
229 * @retval An ErrorStatus enumeration value:
230 * - SUCCESS: DAC registers are initialized
231 * - ERROR: DAC registers are not initialized
232 */
LL_DAC_Init(DAC_TypeDef * DACx,uint32_t DAC_Channel,const LL_DAC_InitTypeDef * DAC_InitStruct)233 ErrorStatus LL_DAC_Init(DAC_TypeDef *DACx, uint32_t DAC_Channel, const LL_DAC_InitTypeDef *DAC_InitStruct)
234 {
235 ErrorStatus status = SUCCESS;
236
237 /* Check the parameters */
238 assert_param(IS_DAC_ALL_INSTANCE(DACx));
239 assert_param(IS_LL_DAC_CHANNEL(DAC_Channel));
240 assert_param(IS_LL_DAC_TRIGGER_SOURCE(DAC_InitStruct->TriggerSource));
241 assert_param(IS_LL_DAC_OUTPUT_BUFFER(DAC_InitStruct->OutputBuffer));
242 assert_param(IS_LL_DAC_OUTPUT_CONNECTION(DAC_InitStruct->OutputConnection));
243 assert_param(IS_LL_DAC_OUTPUT_MODE(DAC_InitStruct->OutputMode));
244 assert_param(IS_LL_DAC_WAVE_AUTO_GENER_MODE(DAC_InitStruct->WaveAutoGeneration));
245 if (DAC_InitStruct->WaveAutoGeneration != LL_DAC_WAVE_AUTO_GENERATION_NONE)
246 {
247 assert_param(IS_LL_DAC_WAVE_AUTO_GENER_CONFIG(DAC_InitStruct->WaveAutoGeneration,
248 DAC_InitStruct->WaveAutoGenerationConfig));
249 }
250
251 /* Note: Hardware constraint (refer to description of this function) */
252 /* DAC instance must be disabled. */
253 if (LL_DAC_IsEnabled(DACx, DAC_Channel) == 0UL)
254 {
255 /* Configuration of DAC channel: */
256 /* - TriggerSource */
257 /* - WaveAutoGeneration */
258 /* - OutputBuffer */
259 /* - OutputConnection */
260 /* - OutputMode */
261 if (DAC_InitStruct->WaveAutoGeneration != LL_DAC_WAVE_AUTO_GENERATION_NONE)
262 {
263 MODIFY_REG(DACx->CR,
264 (DAC_CR_TSEL1
265 | DAC_CR_WAVE1
266 | DAC_CR_MAMP1
267 ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
268 ,
269 (DAC_InitStruct->TriggerSource
270 | DAC_InitStruct->WaveAutoGeneration
271 | DAC_InitStruct->WaveAutoGenerationConfig
272 ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
273 );
274 }
275 else
276 {
277 MODIFY_REG(DACx->CR,
278 (DAC_CR_TSEL1
279 | DAC_CR_WAVE1
280 ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
281 ,
282 (DAC_InitStruct->TriggerSource
283 | LL_DAC_WAVE_AUTO_GENERATION_NONE
284 ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
285 );
286 }
287 MODIFY_REG(DACx->MCR,
288 (DAC_MCR_MODE1_1
289 | DAC_MCR_MODE1_0
290 | DAC_MCR_MODE1_2
291 ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
292 ,
293 (DAC_InitStruct->OutputBuffer
294 | DAC_InitStruct->OutputConnection
295 | DAC_InitStruct->OutputMode
296 ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
297 );
298 }
299 else
300 {
301 /* Initialization error: DAC instance is not disabled. */
302 status = ERROR;
303 }
304 return status;
305 }
306
307 /**
308 * @brief Set each @ref LL_DAC_InitTypeDef field to default value.
309 * @param DAC_InitStruct pointer to a @ref LL_DAC_InitTypeDef structure
310 * whose fields will be set to default values.
311 * @retval None
312 */
LL_DAC_StructInit(LL_DAC_InitTypeDef * DAC_InitStruct)313 void LL_DAC_StructInit(LL_DAC_InitTypeDef *DAC_InitStruct)
314 {
315 /* Set DAC_InitStruct fields to default values */
316 DAC_InitStruct->TriggerSource = LL_DAC_TRIG_SOFTWARE;
317 DAC_InitStruct->WaveAutoGeneration = LL_DAC_WAVE_AUTO_GENERATION_NONE;
318 /* Note: Parameter discarded if wave auto generation is disabled, */
319 /* set anyway to its default value. */
320 DAC_InitStruct->WaveAutoGenerationConfig = LL_DAC_NOISE_LFSR_UNMASK_BIT0;
321 DAC_InitStruct->OutputBuffer = LL_DAC_OUTPUT_BUFFER_ENABLE;
322 DAC_InitStruct->OutputConnection = LL_DAC_OUTPUT_CONNECT_GPIO;
323 DAC_InitStruct->OutputMode = LL_DAC_OUTPUT_MODE_NORMAL;
324 }
325
326 /**
327 * @}
328 */
329
330 /**
331 * @}
332 */
333
334 /**
335 * @}
336 */
337
338 #endif /* DAC1 || DAC2 */
339
340 /**
341 * @}
342 */
343
344 #endif /* USE_FULL_LL_DRIVER */
345