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