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