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