1 /**
2 ******************************************************************************
3 * @file stm32f0xx_hal_dac_ex.c
4 * @author MCD Application Team
5 * @brief DAC HAL module driver.
6 * This file provides firmware functions to manage the extended
7 * functionalities of the DAC peripheral.
8 *
9 *
10 ******************************************************************************
11 * @attention
12 *
13 * Copyright (c) 2016 STMicroelectronics.
14 * All rights reserved.
15 *
16 * This software is licensed under terms that can be found in the LICENSE file
17 * in the root directory of this software component.
18 * If no LICENSE file comes with this software, it is provided AS-IS.
19 *
20 ******************************************************************************
21 @verbatim
22 ==============================================================================
23 ##### How to use this driver #####
24 ==============================================================================
25 [..]
26 (+) When Dual mode is enabled (i.e. DAC Channel1 and Channel2 are used simultaneously) :
27 Use HAL_DACEx_DualGetValue() to get digital data to be converted and use
28 HAL_DACEx_DualSetValue() to set digital value to converted simultaneously in Channel 1 and Channel 2.
29 (+) Use HAL_DACEx_TriangleWaveGenerate() to generate Triangle signal.
30 (+) Use HAL_DACEx_NoiseWaveGenerate() to generate Noise signal.
31
32 @endverbatim
33 ******************************************************************************
34 */
35
36
37 /* Includes ------------------------------------------------------------------*/
38 #include "stm32f0xx_hal.h"
39
40 /** @addtogroup STM32F0xx_HAL_Driver
41 * @{
42 */
43
44 #ifdef HAL_DAC_MODULE_ENABLED
45
46 /** @addtogroup DAC
47 * @{
48 */
49
50 #if defined(STM32F051x8) || defined(STM32F058xx) || \
51 defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || \
52 defined(STM32F091xC) || defined(STM32F098xx)
53
54 /** @addtogroup DAC_Private_Functions
55 * @{
56 */
57 static void DAC_DMAConvCpltCh1(DMA_HandleTypeDef *hdma);
58 static void DAC_DMAErrorCh1(DMA_HandleTypeDef *hdma);
59 static void DAC_DMAHalfConvCpltCh1(DMA_HandleTypeDef *hdma);
60 /**
61 * @}
62 */
63
64 #endif /* STM32F051x8 STM32F058xx */
65 /* STM32F071xB STM32F072xB STM32F078xx */
66 /* STM32F091xC STM32F098xx */
67
68 #if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || \
69 defined(STM32F091xC) || defined(STM32F098xx)
70
71 /** @addtogroup DAC_Private_Functions
72 * @{
73 */
74
75 /* DAC_DMAConvCpltCh2 / DAC_DMAErrorCh2 / DAC_DMAHalfConvCpltCh2 */
76 /* are set by HAL_DAC_Start_DMA */
77
78 void DAC_DMAConvCpltCh2(DMA_HandleTypeDef *hdma);
79 void DAC_DMAErrorCh2(DMA_HandleTypeDef *hdma);
80 void DAC_DMAHalfConvCpltCh2(DMA_HandleTypeDef *hdma);
81 /**
82 * @}
83 */
84
85 #endif /* STM32F071xB STM32F072xB STM32F078xx */
86 /* STM32F091xC STM32F098xx */
87
88 /** @addtogroup DAC_Exported_Functions
89 * @{
90 */
91
92 /** @addtogroup DAC_Exported_Functions_Group3
93 * @{
94 */
95
96 #if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || \
97 defined(STM32F091xC) || defined(STM32F098xx)
98
99 /**
100 * @brief Configures the selected DAC channel.
101 * @param hdac pointer to a DAC_HandleTypeDef structure that contains
102 * the configuration information for the specified DAC.
103 * @param sConfig DAC configuration structure.
104 * @param Channel The selected DAC channel.
105 * This parameter can be one of the following values:
106 * @arg DAC_CHANNEL_1: DAC Channel1 selected
107 * @arg DAC_CHANNEL_2: DAC Channel2 selected
108 * @retval HAL status
109 */
HAL_DAC_ConfigChannel(DAC_HandleTypeDef * hdac,DAC_ChannelConfTypeDef * sConfig,uint32_t Channel)110 HAL_StatusTypeDef HAL_DAC_ConfigChannel(DAC_HandleTypeDef* hdac, DAC_ChannelConfTypeDef* sConfig, uint32_t Channel)
111 {
112 uint32_t tmpreg1 = 0U, tmpreg2 = 0U;
113
114 /* Check the DAC parameters */
115 assert_param(IS_DAC_TRIGGER(sConfig->DAC_Trigger));
116 assert_param(IS_DAC_OUTPUT_BUFFER_STATE(sConfig->DAC_OutputBuffer));
117 assert_param(IS_DAC_TRIGGER(sConfig->DAC_Trigger));
118 assert_param(IS_DAC_CHANNEL(Channel));
119
120 /* Process locked */
121 __HAL_LOCK(hdac);
122
123 /* Change DAC state */
124 hdac->State = HAL_DAC_STATE_BUSY;
125
126 /* Get the DAC CR value */
127 tmpreg1 = hdac->Instance->CR;
128 /* Clear BOFFx, TENx, TSELx, WAVEx and MAMPx bits */
129 tmpreg1 &= ~(((uint32_t)(DAC_CR_MAMP1 | DAC_CR_WAVE1 | DAC_CR_TSEL1 | DAC_CR_TEN1 | DAC_CR_BOFF1)) << Channel);
130 /* Configure for the selected DAC channel: buffer output, trigger */
131 /* Set TSELx and TENx bits according to DAC_Trigger value */
132 /* Set BOFFx bit according to DAC_OutputBuffer value */
133 tmpreg2 = (sConfig->DAC_Trigger | sConfig->DAC_OutputBuffer);
134 /* Calculate CR register value depending on DAC_Channel */
135 tmpreg1 |= tmpreg2 << Channel;
136 /* Write to DAC CR */
137 hdac->Instance->CR = tmpreg1;
138
139 /* Change DAC state */
140 hdac->State = HAL_DAC_STATE_READY;
141
142 /* Process unlocked */
143 __HAL_UNLOCK(hdac);
144
145 /* Return function status */
146 return HAL_OK;
147 }
148
149 #endif /* STM32F071xB STM32F072xB STM32F078xx */
150 /* STM32F091xC STM32F098xx */
151
152 #if defined (STM32F051x8) || defined (STM32F058xx)
153
154 /**
155 * @brief Configures the selected DAC channel.
156 * @param hdac pointer to a DAC_HandleTypeDef structure that contains
157 * the configuration information for the specified DAC.
158 * @param sConfig DAC configuration structure.
159 * @param Channel The selected DAC channel.
160 * This parameter can be one of the following values:
161 * @arg DAC_CHANNEL_1: DAC Channel1 selected
162 * @retval HAL status
163 */
HAL_DAC_ConfigChannel(DAC_HandleTypeDef * hdac,DAC_ChannelConfTypeDef * sConfig,uint32_t Channel)164 HAL_StatusTypeDef HAL_DAC_ConfigChannel(DAC_HandleTypeDef* hdac, DAC_ChannelConfTypeDef* sConfig, uint32_t Channel)
165 {
166 uint32_t tmpreg1 = 0U, tmpreg2 = 0U;
167
168 /* Check the DAC parameters */
169 assert_param(IS_DAC_TRIGGER(sConfig->DAC_Trigger));
170 assert_param(IS_DAC_OUTPUT_BUFFER_STATE(sConfig->DAC_OutputBuffer));
171 assert_param(IS_DAC_TRIGGER(sConfig->DAC_Trigger));
172 assert_param(IS_DAC_CHANNEL(Channel));
173
174 /* Process locked */
175 __HAL_LOCK(hdac);
176
177 /* Change DAC state */
178 hdac->State = HAL_DAC_STATE_BUSY;
179
180 /* Get the DAC CR value */
181 tmpreg1 = hdac->Instance->CR;
182 /* Clear BOFFx, TENx, TSELx, WAVEx and MAMPx bits */
183 tmpreg1 &= ~(((uint32_t)(DAC_CR_TSEL1 | DAC_CR_TEN1 | DAC_CR_BOFF1)) << Channel);
184 /* Configure for the selected DAC channel: buffer output, trigger */
185 /* Set TSELx and TENx bits according to DAC_Trigger value */
186 /* Set BOFFx bit according to DAC_OutputBuffer value */
187 tmpreg2 = (sConfig->DAC_Trigger | sConfig->DAC_OutputBuffer);
188 /* Calculate CR register value depending on DAC_Channel */
189 tmpreg1 |= tmpreg2 << Channel;
190 /* Write to DAC CR */
191 hdac->Instance->CR = tmpreg1;
192
193 /* Change DAC state */
194 hdac->State = HAL_DAC_STATE_READY;
195
196 /* Process unlocked */
197 __HAL_UNLOCK(hdac);
198
199 /* Return function status */
200 return HAL_OK;
201 }
202
203 #endif /* STM32F051x8 STM32F058xx */
204
205 #if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || \
206 defined(STM32F091xC) || defined(STM32F098xx)
207 /* DAC 1 has 2 channels 1 & 2 */
208
209 /**
210 * @brief Returns the last data output value of the selected DAC channel.
211 * @param hdac pointer to a DAC_HandleTypeDef structure that contains
212 * the configuration information for the specified DAC.
213 * @param Channel The selected DAC channel.
214 * This parameter can be one of the following values:
215 * @arg DAC_CHANNEL_1: DAC Channel1 selected
216 * @arg DAC_CHANNEL_2: DAC Channel2 selected
217 * @retval The selected DAC channel data output value.
218 */
HAL_DAC_GetValue(DAC_HandleTypeDef * hdac,uint32_t Channel)219 uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef* hdac, uint32_t Channel)
220 {
221 /* Check the parameters */
222 assert_param(IS_DAC_CHANNEL(Channel));
223
224 /* Returns the DAC channel data output register value */
225 if(Channel == DAC_CHANNEL_1)
226 {
227 return hdac->Instance->DOR1;
228 }
229 else
230 {
231 return hdac->Instance->DOR2;
232 }
233 }
234
235 #endif /* STM32F071xB STM32F072xB STM32F078xx */
236 /* STM32F091xC STM32F098xx */
237
238 #if defined (STM32F051x8) || defined (STM32F058xx)
239
240 /* DAC 1 has 1 channels */
241
242 /**
243 * @brief Returns the last data output value of the selected DAC channel.
244 * @param hdac pointer to a DAC_HandleTypeDef structure that contains
245 * the configuration information for the specified DAC.
246 * @param Channel The selected DAC channel.
247 * This parameter can be one of the following values:
248 * @arg DAC_CHANNEL_1: DAC Channel1 selected
249 * @retval The selected DAC channel data output value.
250 */
HAL_DAC_GetValue(DAC_HandleTypeDef * hdac,uint32_t Channel)251 uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef* hdac, uint32_t Channel)
252 {
253 /* Check the parameters */
254 assert_param(IS_DAC_CHANNEL(Channel));
255
256 /* Returns the DAC channel data output register value */
257 return hdac->Instance->DOR1;
258 }
259
260
261
262 #endif /* STM32F051x8 STM32F058xx */
263
264 /**
265 * @}
266 */
267
268 /** @addtogroup DAC_Exported_Functions_Group2
269 * @{
270 */
271
272 #if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || \
273 defined(STM32F091xC) || defined(STM32F098xx)
274
275 /**
276 * @brief Enables DAC and starts conversion of channel.
277 * @param hdac pointer to a DAC_HandleTypeDef structure that contains
278 * the configuration information for the specified DAC.
279 * @param Channel The selected DAC channel.
280 * This parameter can be one of the following values:
281 * @arg DAC_CHANNEL_1: DAC Channel1 selected
282 * @arg DAC_CHANNEL_2: DAC Channel2 selected
283 * @retval HAL status
284 */
HAL_DAC_Start(DAC_HandleTypeDef * hdac,uint32_t Channel)285 HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef* hdac, uint32_t Channel)
286 {
287 /* Check the parameters */
288 assert_param(IS_DAC_CHANNEL(Channel));
289
290 /* Process locked */
291 __HAL_LOCK(hdac);
292
293 /* Change DAC state */
294 hdac->State = HAL_DAC_STATE_BUSY;
295
296 /* Enable the Peripharal */
297 __HAL_DAC_ENABLE(hdac, Channel);
298
299 if(Channel == DAC_CHANNEL_1)
300 {
301 /* Check if software trigger enabled */
302 if((hdac->Instance->CR & (DAC_CR_TEN1 | DAC_CR_TSEL1)) == (DAC_CR_TEN1 | DAC_CR_TSEL1))
303 {
304 /* Enable the selected DAC software conversion */
305 SET_BIT(hdac->Instance->SWTRIGR, DAC_SWTRIGR_SWTRIG1);
306 }
307 }
308 else
309 {
310 /* Check if software trigger enabled */
311 if((hdac->Instance->CR & (DAC_CR_TEN2 | DAC_CR_TSEL2)) == (DAC_CR_TEN2 | DAC_CR_TSEL2))
312 {
313 /* Enable the selected DAC software conversion*/
314 SET_BIT(hdac->Instance->SWTRIGR, DAC_SWTRIGR_SWTRIG2);
315 }
316 }
317
318 /* Change DAC state */
319 hdac->State = HAL_DAC_STATE_READY;
320
321 /* Process unlocked */
322 __HAL_UNLOCK(hdac);
323
324 /* Return function status */
325 return HAL_OK;
326 }
327
328 /**
329 * @brief Enables DAC and starts conversion of channel.
330 * @param hdac pointer to a DAC_HandleTypeDef structure that contains
331 * the configuration information for the specified DAC.
332 * @param Channel The selected DAC channel.
333 * This parameter can be one of the following values:
334 * @arg DAC_CHANNEL_1: DAC Channel1 selected
335 * @arg DAC_CHANNEL_2: DAC Channel2 selected
336 * @param pData The destination peripheral Buffer address.
337 * @param Length The length of data to be transferred from memory to DAC peripheral
338 * @param Alignment Specifies the data alignment for DAC channel.
339 * This parameter can be one of the following values:
340 * @arg DAC_ALIGN_8B_R: 8bit right data alignment selected
341 * @arg DAC_ALIGN_12B_L: 12bit left data alignment selected
342 * @arg DAC_ALIGN_12B_R: 12bit right data alignment selected
343 * @retval HAL status
344 */
HAL_DAC_Start_DMA(DAC_HandleTypeDef * hdac,uint32_t Channel,uint32_t * pData,uint32_t Length,uint32_t Alignment)345 HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t* pData, uint32_t Length, uint32_t Alignment)
346 {
347 uint32_t tmpreg = 0U;
348
349 /* Check the parameters */
350 assert_param(IS_DAC_CHANNEL(Channel));
351 assert_param(IS_DAC_ALIGN(Alignment));
352
353 /* Process locked */
354 __HAL_LOCK(hdac);
355
356 /* Change DAC state */
357 hdac->State = HAL_DAC_STATE_BUSY;
358
359 if(Channel == DAC_CHANNEL_1)
360 {
361 /* Set the DMA transfer complete callback for channel1 */
362 hdac->DMA_Handle1->XferCpltCallback = DAC_DMAConvCpltCh1;
363
364 /* Set the DMA half transfer complete callback for channel1 */
365 hdac->DMA_Handle1->XferHalfCpltCallback = DAC_DMAHalfConvCpltCh1;
366
367 /* Set the DMA error callback for channel1 */
368 hdac->DMA_Handle1->XferErrorCallback = DAC_DMAErrorCh1;
369
370 /* Enable the selected DAC channel1 DMA request */
371 SET_BIT(hdac->Instance->CR, DAC_CR_DMAEN1);
372
373 /* Case of use of channel 1 */
374 switch(Alignment)
375 {
376 case DAC_ALIGN_12B_R:
377 /* Get DHR12R1 address */
378 tmpreg = (uint32_t)&hdac->Instance->DHR12R1;
379 break;
380 case DAC_ALIGN_12B_L:
381 /* Get DHR12L1 address */
382 tmpreg = (uint32_t)&hdac->Instance->DHR12L1;
383 break;
384 case DAC_ALIGN_8B_R:
385 /* Get DHR8R1 address */
386 tmpreg = (uint32_t)&hdac->Instance->DHR8R1;
387 break;
388 default:
389 break;
390 }
391 }
392 else
393 {
394 /* Set the DMA transfer complete callback for channel2 */
395 hdac->DMA_Handle2->XferCpltCallback = DAC_DMAConvCpltCh2;
396
397 /* Set the DMA half transfer complete callback for channel2 */
398 hdac->DMA_Handle2->XferHalfCpltCallback = DAC_DMAHalfConvCpltCh2;
399
400 /* Set the DMA error callback for channel2 */
401 hdac->DMA_Handle2->XferErrorCallback = DAC_DMAErrorCh2;
402
403 /* Enable the selected DAC channel2 DMA request */
404 SET_BIT(hdac->Instance->CR, DAC_CR_DMAEN2);
405
406 /* Case of use of channel 2 */
407 switch(Alignment)
408 {
409 case DAC_ALIGN_12B_R:
410 /* Get DHR12R2 address */
411 tmpreg = (uint32_t)&hdac->Instance->DHR12R2;
412 break;
413 case DAC_ALIGN_12B_L:
414 /* Get DHR12L2 address */
415 tmpreg = (uint32_t)&hdac->Instance->DHR12L2;
416 break;
417 case DAC_ALIGN_8B_R:
418 /* Get DHR8R2 address */
419 tmpreg = (uint32_t)&hdac->Instance->DHR8R2;
420 break;
421 default:
422 break;
423 }
424 }
425
426 /* Enable the DMA channel */
427 if(Channel == DAC_CHANNEL_1)
428 {
429 /* Enable the DAC DMA underrun interrupt */
430 __HAL_DAC_ENABLE_IT(hdac, DAC_IT_DMAUDR1);
431
432 /* Enable the DMA channel */
433 HAL_DMA_Start_IT(hdac->DMA_Handle1, (uint32_t)pData, tmpreg, Length);
434 }
435 else
436 {
437 /* Enable the DAC DMA underrun interrupt */
438 __HAL_DAC_ENABLE_IT(hdac, DAC_IT_DMAUDR2);
439
440 /* Enable the DMA channel */
441 HAL_DMA_Start_IT(hdac->DMA_Handle2, (uint32_t)pData, tmpreg, Length);
442 }
443
444 /* Enable the Peripharal */
445 __HAL_DAC_ENABLE(hdac, Channel);
446
447 /* Process Unlocked */
448 __HAL_UNLOCK(hdac);
449
450 /* Return function status */
451 return HAL_OK;
452 }
453
454
455
456 #endif /* STM32F071xB STM32F072xB STM32F078xx */
457 /* STM32F091xC STM32F098xx */
458
459 #if defined (STM32F051x8) || defined (STM32F058xx)
460
HAL_DAC_Start(DAC_HandleTypeDef * hdac,uint32_t Channel)461 HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef* hdac, uint32_t Channel)
462 {
463 /* Check the parameters */
464 assert_param(IS_DAC_CHANNEL(Channel));
465
466 /* Process locked */
467 __HAL_LOCK(hdac);
468
469 /* Change DAC state */
470 hdac->State = HAL_DAC_STATE_BUSY;
471
472 /* Enable the Peripharal */
473 __HAL_DAC_ENABLE(hdac, Channel);
474
475 if(Channel == DAC_CHANNEL_1)
476 {
477 /* Check if software trigger enabled */
478 if((hdac->Instance->CR & (DAC_CR_TEN1 | DAC_CR_TSEL1)) == (DAC_CR_TEN1 | DAC_CR_TSEL1))
479 {
480 /* Enable the selected DAC software conversion */
481 SET_BIT(hdac->Instance->SWTRIGR, DAC_SWTRIGR_SWTRIG1);
482 }
483 }
484
485 /* Change DAC state */
486 hdac->State = HAL_DAC_STATE_READY;
487
488 /* Process unlocked */
489 __HAL_UNLOCK(hdac);
490
491 /* Return function status */
492 return HAL_OK;
493 }
494
495 /**
496 * @brief Enables DAC and starts conversion of channel.
497 * @param hdac pointer to a DAC_HandleTypeDef structure that contains
498 * the configuration information for the specified DAC.
499 * @param Channel The selected DAC channel.
500 * This parameter can be one of the following values:
501 * @arg DAC_CHANNEL_1: DAC Channel1 selected
502 * @param pData The destination peripheral Buffer address.
503 * @param Length The length of data to be transferred from memory to DAC peripheral
504 * @param Alignment Specifies the data alignment for DAC channel.
505 * This parameter can be one of the following values:
506 * @arg DAC_ALIGN_8B_R: 8bit right data alignment selected
507 * @arg DAC_ALIGN_12B_L: 12bit left data alignment selected
508 * @arg DAC_ALIGN_12B_R: 12bit right data alignment selected
509 * @retval HAL status
510 */
HAL_DAC_Start_DMA(DAC_HandleTypeDef * hdac,uint32_t Channel,uint32_t * pData,uint32_t Length,uint32_t Alignment)511 HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t* pData, uint32_t Length, uint32_t Alignment)
512 {
513 uint32_t tmpreg = 0U;
514
515 /* Check the parameters */
516 assert_param(IS_DAC_CHANNEL(Channel));
517 assert_param(IS_DAC_ALIGN(Alignment));
518
519 /* Process locked */
520 __HAL_LOCK(hdac);
521
522 /* Change DAC state */
523 hdac->State = HAL_DAC_STATE_BUSY;
524
525 /* Set the DMA transfer complete callback for channel1 */
526 hdac->DMA_Handle1->XferCpltCallback = DAC_DMAConvCpltCh1;
527
528 /* Set the DMA half transfer complete callback for channel1 */
529 hdac->DMA_Handle1->XferHalfCpltCallback = DAC_DMAHalfConvCpltCh1;
530
531 /* Set the DMA error callback for channel1 */
532 hdac->DMA_Handle1->XferErrorCallback = DAC_DMAErrorCh1;
533
534 /* Enable the selected DAC channel1 DMA request */
535 SET_BIT(hdac->Instance->CR, DAC_CR_DMAEN1);
536
537 /* Case of use of channel 1 */
538 switch(Alignment)
539 {
540 case DAC_ALIGN_12B_R:
541 /* Get DHR12R1 address */
542 tmpreg = (uint32_t)&hdac->Instance->DHR12R1;
543 break;
544 case DAC_ALIGN_12B_L:
545 /* Get DHR12L1 address */
546 tmpreg = (uint32_t)&hdac->Instance->DHR12L1;
547 break;
548 case DAC_ALIGN_8B_R:
549 /* Get DHR8R1 address */
550 tmpreg = (uint32_t)&hdac->Instance->DHR8R1;
551 break;
552 default:
553 break;
554 }
555
556 /* Enable the DMA channel */
557 /* Enable the DAC DMA underrun interrupt */
558 __HAL_DAC_ENABLE_IT(hdac, DAC_IT_DMAUDR1);
559
560 /* Enable the DMA channel */
561 HAL_DMA_Start_IT(hdac->DMA_Handle1, (uint32_t)pData, tmpreg, Length);
562
563 /* Enable the DAC DMA underrun interrupt */
564 __HAL_DAC_ENABLE_IT(hdac, DAC_IT_DMAUDR1);
565
566 /* Enable the DMA channel */
567 HAL_DMA_Start_IT(hdac->DMA_Handle1, (uint32_t)pData, tmpreg, Length);
568
569 /* Enable the Peripharal */
570 __HAL_DAC_ENABLE(hdac, Channel);
571
572 /* Process Unlocked */
573 __HAL_UNLOCK(hdac);
574
575 /* Return function status */
576 return HAL_OK;
577 }
578
579 #endif /* STM32F051x8 STM32F058xx */
580
581 #if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || \
582 defined(STM32F091xC) || defined(STM32F098xx)
583 /* DAC channel 2 is available on top of DAC channel 1 */
584
585 /**
586 * @brief Handles DAC interrupt request
587 * @param hdac pointer to a DAC_HandleTypeDef structure that contains
588 * the configuration information for the specified DAC.
589 * @retval None
590 */
HAL_DAC_IRQHandler(DAC_HandleTypeDef * hdac)591 void HAL_DAC_IRQHandler(DAC_HandleTypeDef* hdac)
592 {
593 if(__HAL_DAC_GET_IT_SOURCE(hdac, DAC_IT_DMAUDR1))
594 {
595 /* Check underrun channel 1 flag */
596 if(__HAL_DAC_GET_FLAG(hdac, DAC_FLAG_DMAUDR1))
597 {
598 /* Change DAC state to error state */
599 hdac->State = HAL_DAC_STATE_ERROR;
600
601 /* Set DAC error code to channel1 DMA underrun error */
602 hdac->ErrorCode |= HAL_DAC_ERROR_DMAUNDERRUNCH1;
603
604 /* Clear the underrun flag */
605 __HAL_DAC_CLEAR_FLAG(hdac,DAC_FLAG_DMAUDR1);
606
607 /* Disable the selected DAC channel1 DMA request */
608 hdac->Instance->CR &= ~DAC_CR_DMAEN1;
609
610 /* Error callback */
611 HAL_DAC_DMAUnderrunCallbackCh1(hdac);
612 }
613 }
614 if(__HAL_DAC_GET_IT_SOURCE(hdac, DAC_IT_DMAUDR2))
615 {
616 /* Check underrun channel 2 flag */
617 if(__HAL_DAC_GET_FLAG(hdac, DAC_FLAG_DMAUDR2))
618 {
619 /* Change DAC state to error state */
620 hdac->State = HAL_DAC_STATE_ERROR;
621
622 /* Set DAC error code to channel2 DMA underrun error */
623 hdac->ErrorCode |= HAL_DAC_ERROR_DMAUNDERRUNCH2;
624
625 /* Clear the underrun flag */
626 __HAL_DAC_CLEAR_FLAG(hdac,DAC_FLAG_DMAUDR2);
627
628 /* Disable the selected DAC channel1 DMA request */
629 hdac->Instance->CR &= ~DAC_CR_DMAEN2;
630
631 /* Error callback */
632 HAL_DACEx_DMAUnderrunCallbackCh2(hdac);
633 }
634 }
635 }
636
637 #endif /* STM32F071xB STM32F072xB STM32F078xx */
638 /* STM32F091xC STM32F098xx */
639
640 #if defined (STM32F051x8) || defined (STM32F058xx)
641 /* DAC channel 2 is NOT available. Only DAC channel 1 is available */
642
643 /**
644 * @brief Handles DAC interrupt request
645 * @param hdac pointer to a DAC_HandleTypeDef structure that contains
646 * the configuration information for the specified DAC.
647 * @retval None
648 */
HAL_DAC_IRQHandler(DAC_HandleTypeDef * hdac)649 void HAL_DAC_IRQHandler(DAC_HandleTypeDef* hdac)
650 {
651 if(__HAL_DAC_GET_IT_SOURCE(hdac, DAC_IT_DMAUDR1))
652 {
653 /* Check Overrun flag */
654 if(__HAL_DAC_GET_FLAG(hdac, DAC_FLAG_DMAUDR1))
655 {
656 /* Change DAC state to error state */
657 hdac->State = HAL_DAC_STATE_ERROR;
658
659 /* Set DAC error code to chanel1 DMA underrun error */
660 hdac->ErrorCode |= HAL_DAC_ERROR_DMAUNDERRUNCH1;
661
662 /* Clear the underrun flag */
663 __HAL_DAC_CLEAR_FLAG(hdac,DAC_FLAG_DMAUDR1);
664
665 /* Disable the selected DAC channel1 DMA request */
666 hdac->Instance->CR &= ~DAC_CR_DMAEN1;
667
668 /* Error callback */
669 HAL_DAC_DMAUnderrunCallbackCh1(hdac);
670 }
671 }
672 }
673
674 #endif /* STM32F051x8 STM32F058xx */
675
676 /**
677 * @}
678 */
679
680 /**
681 * @}
682 */
683
684 #if defined(STM32F051x8) || defined(STM32F058xx) || \
685 defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || \
686 defined(STM32F091xC) || defined(STM32F098xx)
687
688 /** @addtogroup DAC_Private_Functions
689 * @{
690 */
691
692 /**
693 * @brief DMA conversion complete callback.
694 * @param hdma pointer to a DMA_HandleTypeDef structure that contains
695 * the configuration information for the specified DMA module.
696 * @retval None
697 */
DAC_DMAConvCpltCh1(DMA_HandleTypeDef * hdma)698 static void DAC_DMAConvCpltCh1(DMA_HandleTypeDef *hdma)
699 {
700 DAC_HandleTypeDef* hdac = ( DAC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
701
702 HAL_DAC_ConvCpltCallbackCh1(hdac);
703
704 hdac->State= HAL_DAC_STATE_READY;
705 }
706
707 /**
708 * @brief DMA half transfer complete callback.
709 * @param hdma pointer to a DMA_HandleTypeDef structure that contains
710 * the configuration information for the specified DMA module.
711 * @retval None
712 */
DAC_DMAHalfConvCpltCh1(DMA_HandleTypeDef * hdma)713 static void DAC_DMAHalfConvCpltCh1(DMA_HandleTypeDef *hdma)
714 {
715 DAC_HandleTypeDef* hdac = ( DAC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
716 /* Conversion complete callback */
717 HAL_DAC_ConvHalfCpltCallbackCh1(hdac);
718 }
719
720 /**
721 * @brief DMA error callback
722 * @param hdma pointer to a DMA_HandleTypeDef structure that contains
723 * the configuration information for the specified DMA module.
724 * @retval None
725 */
DAC_DMAErrorCh1(DMA_HandleTypeDef * hdma)726 static void DAC_DMAErrorCh1(DMA_HandleTypeDef *hdma)
727 {
728 DAC_HandleTypeDef* hdac = ( DAC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
729
730 /* Set DAC error code to DMA error */
731 hdac->ErrorCode |= HAL_DAC_ERROR_DMA;
732
733 HAL_DAC_ErrorCallbackCh1(hdac);
734
735 hdac->State= HAL_DAC_STATE_READY;
736 }
737 /**
738 * @}
739 */
740 #endif /* STM32F051x8 STM32F058xx */
741 /* STM32F071xB STM32F072xB STM32F078xx */
742 /* STM32F091xC STM32F098xx */
743
744 #if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || \
745 defined(STM32F091xC) || defined(STM32F098xx)
746
747 /** @addtogroup DAC_Private_Functions
748 * @{
749 */
750
751 /**
752 * @brief DMA conversion complete callback.
753 * @param hdma pointer to a DMA_HandleTypeDef structure that contains
754 * the configuration information for the specified DMA module.
755 * @retval None
756 */
DAC_DMAConvCpltCh2(DMA_HandleTypeDef * hdma)757 void DAC_DMAConvCpltCh2(DMA_HandleTypeDef *hdma)
758 {
759 DAC_HandleTypeDef* hdac = ( DAC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
760
761 #if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
762 hdac->ConvCpltCallbackCh2(hdac);
763 #else
764 HAL_DACEx_ConvCpltCallbackCh2(hdac);
765 #endif
766
767 hdac->State= HAL_DAC_STATE_READY;
768 }
769
770 /**
771 * @brief DMA half transfer complete callback.
772 * @param hdma pointer to a DMA_HandleTypeDef structure that contains
773 * the configuration information for the specified DMA module.
774 * @retval None
775 */
DAC_DMAHalfConvCpltCh2(DMA_HandleTypeDef * hdma)776 void DAC_DMAHalfConvCpltCh2(DMA_HandleTypeDef *hdma)
777 {
778 DAC_HandleTypeDef* hdac = ( DAC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
779
780 /* Conversion complete callback */
781 #if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
782 hdac->ConvHalfCpltCallbackCh2(hdac);
783 #else
784 HAL_DACEx_ConvHalfCpltCallbackCh2(hdac);
785 #endif
786 }
787
788 /**
789 * @brief DMA error callback
790 * @param hdma pointer to a DMA_HandleTypeDef structure that contains
791 * the configuration information for the specified DMA module.
792 * @retval None
793 */
DAC_DMAErrorCh2(DMA_HandleTypeDef * hdma)794 void DAC_DMAErrorCh2(DMA_HandleTypeDef *hdma)
795 {
796 DAC_HandleTypeDef* hdac = ( DAC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
797
798 /* Set DAC error code to DMA error */
799 hdac->ErrorCode |= HAL_DAC_ERROR_DMA;
800
801 #if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
802 hdac->ErrorCallbackCh2(hdac);
803 #else
804 HAL_DACEx_ErrorCallbackCh2(hdac);
805 #endif
806 hdac->State= HAL_DAC_STATE_READY;
807 }
808
809 /**
810 * @}
811 */
812
813 #endif /* STM32F071xB STM32F072xB STM32F078xx */
814 /* STM32F091xC STM32F098xx */
815
816 /**
817 * @}
818 */
819
820 /** @defgroup DACEx DACEx
821 * @brief DACEx driver module
822 * @{
823 */
824
825 /* Private typedef -----------------------------------------------------------*/
826 /* Private define ------------------------------------------------------------*/
827 /* Private macro -------------------------------------------------------------*/
828 /** @defgroup DACEx_Private_Macros DACEx Private Macros
829 * @{
830 */
831 /**
832 * @}
833 */
834
835 /* Private variables ---------------------------------------------------------*/
836 /* Private function prototypes -----------------------------------------------*/
837 /* Private functions ---------------------------------------------------------*/
838
839 /** @defgroup DACEx_Exported_Functions DACEx Exported Functions
840 * @{
841 */
842
843 /** @defgroup DACEx_Exported_Functions_Group1 Extended features functions
844 * @brief Extended features functions
845 *
846 @verbatim
847 ==============================================================================
848 ##### Extended features functions #####
849 ==============================================================================
850 [..] This section provides functions allowing to:
851 (+) Start conversion.
852 (+) Stop conversion.
853 (+) Start conversion and enable DMA transfer.
854 (+) Stop conversion and disable DMA transfer.
855 (+) Get result of conversion.
856 (+) Get result of dual mode conversion.
857
858 @endverbatim
859 * @{
860 */
861
862 #if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || \
863 defined(STM32F091xC) || defined(STM32F098xx)
864
865 /**
866 * @brief Returns the last data output value of the selected DAC channel.
867 * @param hdac pointer to a DAC_HandleTypeDef structure that contains
868 * the configuration information for the specified DAC.
869 * @retval The selected DAC channel data output value.
870 */
HAL_DACEx_DualGetValue(DAC_HandleTypeDef * hdac)871 uint32_t HAL_DACEx_DualGetValue(DAC_HandleTypeDef* hdac)
872 {
873 uint32_t tmp = 0U;
874
875 tmp |= hdac->Instance->DOR1;
876
877 /* DAC channel 2 is present in DAC 1 */
878 tmp |= hdac->Instance->DOR2 << 16U;
879
880 /* Returns the DAC channel data output register value */
881 return tmp;
882 }
883
884 #endif /* STM32F071xB STM32F072xB STM32F078xx */
885 /* STM32F091xC STM32F098xx */
886
887 #if defined (STM32F051x8) || defined (STM32F058xx)
888
889 /**
890 * @brief Returns the last data output value of the selected DAC channel.
891 * @param hdac pointer to a DAC_HandleTypeDef structure that contains
892 * the configuration information for the specified DAC.
893 * @retval The selected DAC channel data output value.
894 */
HAL_DACEx_DualGetValue(DAC_HandleTypeDef * hdac)895 uint32_t HAL_DACEx_DualGetValue(DAC_HandleTypeDef* hdac)
896 {
897 uint32_t tmp = 0U;
898
899 tmp |= hdac->Instance->DOR1;
900
901 /* Returns the DAC channel data output register value */
902 return tmp;
903 }
904
905 #endif /* STM32F051x8 STM32F058xx */
906
907 #if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || \
908 defined(STM32F091xC) || defined(STM32F098xx)
909
910 /**
911 * @brief Enables or disables the selected DAC channel wave generation.
912 * @param hdac pointer to a DAC_HandleTypeDef structure that contains
913 * the configuration information for the specified DAC.
914 * @param Channel The selected DAC channel.
915 * This parameter can be one of the following values:
916 * DAC_CHANNEL_1 / DAC_CHANNEL_2
917 * @param Amplitude Select max triangle amplitude.
918 * This parameter can be one of the following values:
919 * @arg DAC_TRIANGLEAMPLITUDE_1: Select max triangle amplitude of 1
920 * @arg DAC_TRIANGLEAMPLITUDE_3: Select max triangle amplitude of 3
921 * @arg DAC_TRIANGLEAMPLITUDE_7: Select max triangle amplitude of 7
922 * @arg DAC_TRIANGLEAMPLITUDE_15: Select max triangle amplitude of 15
923 * @arg DAC_TRIANGLEAMPLITUDE_31: Select max triangle amplitude of 31
924 * @arg DAC_TRIANGLEAMPLITUDE_63: Select max triangle amplitude of 63
925 * @arg DAC_TRIANGLEAMPLITUDE_127: Select max triangle amplitude of 127
926 * @arg DAC_TRIANGLEAMPLITUDE_255: Select max triangle amplitude of 255
927 * @arg DAC_TRIANGLEAMPLITUDE_511: Select max triangle amplitude of 511
928 * @arg DAC_TRIANGLEAMPLITUDE_1023: Select max triangle amplitude of 1023
929 * @arg DAC_TRIANGLEAMPLITUDE_2047: Select max triangle amplitude of 2047
930 * @arg DAC_TRIANGLEAMPLITUDE_4095: Select max triangle amplitude of 4095
931 * @retval HAL status
932 */
HAL_DACEx_TriangleWaveGenerate(DAC_HandleTypeDef * hdac,uint32_t Channel,uint32_t Amplitude)933 HAL_StatusTypeDef HAL_DACEx_TriangleWaveGenerate(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Amplitude)
934 {
935 /* Check the parameters */
936 assert_param(IS_DAC_CHANNEL(Channel));
937 assert_param(IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(Amplitude));
938
939 /* Process locked */
940 __HAL_LOCK(hdac);
941
942 /* Change DAC state */
943 hdac->State = HAL_DAC_STATE_BUSY;
944
945 /* Enable the selected wave generation for the selected DAC channel */
946 MODIFY_REG(hdac->Instance->CR, ((DAC_CR_WAVE1)|(DAC_CR_MAMP1))<<Channel, (DAC_CR_WAVE1_1 | Amplitude) << Channel);
947
948 /* Change DAC state */
949 hdac->State = HAL_DAC_STATE_READY;
950
951 /* Process unlocked */
952 __HAL_UNLOCK(hdac);
953
954 /* Return function status */
955 return HAL_OK;
956 }
957
958 /**
959 * @brief Enables or disables the selected DAC channel wave generation.
960 * @param hdac pointer to a DAC_HandleTypeDef structure that contains
961 * the configuration information for the specified DAC.
962 * @param Channel The selected DAC channel.
963 * This parameter can be one of the following values:
964 * DAC_CHANNEL_1 / DAC_CHANNEL_2
965 * @param Amplitude Unmask DAC channel LFSR for noise wave generation.
966 * This parameter can be one of the following values:
967 * @arg DAC_LFSRUNMASK_BIT0: Unmask DAC channel LFSR bit0 for noise wave generation
968 * @arg DAC_LFSRUNMASK_BITS1_0: Unmask DAC channel LFSR bit[1:0] for noise wave generation
969 * @arg DAC_LFSRUNMASK_BITS2_0: Unmask DAC channel LFSR bit[2:0] for noise wave generation
970 * @arg DAC_LFSRUNMASK_BITS3_0: Unmask DAC channel LFSR bit[3:0] for noise wave generation
971 * @arg DAC_LFSRUNMASK_BITS4_0: Unmask DAC channel LFSR bit[4:0] for noise wave generation
972 * @arg DAC_LFSRUNMASK_BITS5_0: Unmask DAC channel LFSR bit[5:0] for noise wave generation
973 * @arg DAC_LFSRUNMASK_BITS6_0: Unmask DAC channel LFSR bit[6:0] for noise wave generation
974 * @arg DAC_LFSRUNMASK_BITS7_0: Unmask DAC channel LFSR bit[7:0] for noise wave generation
975 * @arg DAC_LFSRUNMASK_BITS8_0: Unmask DAC channel LFSR bit[8:0] for noise wave generation
976 * @arg DAC_LFSRUNMASK_BITS9_0: Unmask DAC channel LFSR bit[9:0] for noise wave generation
977 * @arg DAC_LFSRUNMASK_BITS10_0: Unmask DAC channel LFSR bit[10:0] for noise wave generation
978 * @arg DAC_LFSRUNMASK_BITS11_0: Unmask DAC channel LFSR bit[11:0] for noise wave generation
979 * @retval HAL status
980 */
HAL_DACEx_NoiseWaveGenerate(DAC_HandleTypeDef * hdac,uint32_t Channel,uint32_t Amplitude)981 HAL_StatusTypeDef HAL_DACEx_NoiseWaveGenerate(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Amplitude)
982 {
983 /* Check the parameters */
984 assert_param(IS_DAC_CHANNEL(Channel));
985 assert_param(IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(Amplitude));
986
987 /* Process locked */
988 __HAL_LOCK(hdac);
989
990 /* Change DAC state */
991 hdac->State = HAL_DAC_STATE_BUSY;
992
993 /* Enable the selected wave generation for the selected DAC channel */
994 MODIFY_REG(hdac->Instance->CR, ((DAC_CR_WAVE1)|(DAC_CR_MAMP1))<<Channel, (DAC_CR_WAVE1_0 | Amplitude) << Channel);
995
996 /* Change DAC state */
997 hdac->State = HAL_DAC_STATE_READY;
998
999 /* Process unlocked */
1000 __HAL_UNLOCK(hdac);
1001
1002 /* Return function status */
1003 return HAL_OK;
1004 }
1005
1006 #endif /* STM32F071xB STM32F072xB STM32F078xx */
1007 /* STM32F091xC STM32F098xx */
1008
1009 /**
1010 * @}
1011 */
1012
1013 /**
1014 * @}
1015 */
1016
1017 #if defined(STM32F051x8) || defined(STM32F058xx) || \
1018 defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || \
1019 defined(STM32F091xC) || defined(STM32F098xx)
1020
1021 /** @addtogroup DACEx_Exported_Functions
1022 * @{
1023 */
1024
1025 /** @addtogroup DACEx_Exported_Functions_Group1
1026 * @brief Extended features functions
1027 * @{
1028 */
1029
1030 /**
1031 * @brief Set the specified data holding register value for dual DAC channel.
1032 * @param hdac pointer to a DAC_HandleTypeDef structure that contains
1033 * the configuration information for the specified DAC.
1034 * @param Alignment Specifies the data alignment for dual channel DAC.
1035 * This parameter can be one of the following values:
1036 * DAC_ALIGN_8B_R: 8bit right data alignment selected
1037 * DAC_ALIGN_12B_L: 12bit left data alignment selected
1038 * DAC_ALIGN_12B_R: 12bit right data alignment selected
1039 * @param Data1 Data for DAC Channel2 to be loaded in the selected data holding register.
1040 * @param Data2 Data for DAC Channel1 to be loaded in the selected data holding register.
1041 * @note In dual mode, a unique register access is required to write in both
1042 * DAC channels at the same time.
1043 * @retval HAL status
1044 */
HAL_DACEx_DualSetValue(DAC_HandleTypeDef * hdac,uint32_t Alignment,uint32_t Data1,uint32_t Data2)1045 HAL_StatusTypeDef HAL_DACEx_DualSetValue(DAC_HandleTypeDef* hdac, uint32_t Alignment, uint32_t Data1, uint32_t Data2)
1046 {
1047 uint32_t data = 0U, tmp = 0U;
1048
1049 /* Check the parameters */
1050 assert_param(IS_DAC_ALIGN(Alignment));
1051 assert_param(IS_DAC_DATA(Data1));
1052 assert_param(IS_DAC_DATA(Data2));
1053
1054 /* Calculate and set dual DAC data holding register value */
1055 if (Alignment == DAC_ALIGN_8B_R)
1056 {
1057 data = ((uint32_t)Data2 << 8U) | Data1;
1058 }
1059 else
1060 {
1061 data = ((uint32_t)Data2 << 16U) | Data1;
1062 }
1063
1064 tmp = (uint32_t)hdac->Instance;
1065 tmp += DAC_DHR12RD_ALIGNMENT(Alignment);
1066
1067 /* Set the dual DAC selected data holding register */
1068 *(__IO uint32_t *)tmp = data;
1069
1070 /* Return function status */
1071 return HAL_OK;
1072 }
1073
1074 /**
1075 * @}
1076 */
1077
1078 /**
1079 * @}
1080 */
1081
1082 #endif /* STM32F051x8 STM32F058xx */
1083 /* STM32F071xB STM32F072xB STM32F078xx */
1084 /* STM32F091xC STM32F098xx */
1085
1086 #if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || \
1087 defined(STM32F091xC) || defined(STM32F098xx)
1088
1089 /** @addtogroup DACEx_Exported_Functions
1090 * @{
1091 */
1092
1093 /** @addtogroup DACEx_Exported_Functions_Group1
1094 * @brief Extended features functions
1095 * @{
1096 */
1097
1098 /**
1099 * @brief Conversion complete callback in non blocking mode for Channel2
1100 * @param hdac pointer to a DAC_HandleTypeDef structure that contains
1101 * the configuration information for the specified DAC.
1102 * @retval None
1103 */
HAL_DACEx_ConvCpltCallbackCh2(DAC_HandleTypeDef * hdac)1104 __weak void HAL_DACEx_ConvCpltCallbackCh2(DAC_HandleTypeDef* hdac)
1105 {
1106 /* Prevent unused argument(s) compilation warning */
1107 UNUSED(hdac);
1108
1109 /* NOTE : This function Should not be modified, when the callback is needed,
1110 the HAL_DAC_ConvCpltCallback could be implemented in the user file
1111 */
1112 }
1113
1114 /**
1115 * @brief Conversion half DMA transfer callback in non blocking mode for Channel2
1116 * @param hdac pointer to a DAC_HandleTypeDef structure that contains
1117 * the configuration information for the specified DAC.
1118 * @retval None
1119 */
HAL_DACEx_ConvHalfCpltCallbackCh2(DAC_HandleTypeDef * hdac)1120 __weak void HAL_DACEx_ConvHalfCpltCallbackCh2(DAC_HandleTypeDef* hdac)
1121 {
1122 /* Prevent unused argument(s) compilation warning */
1123 UNUSED(hdac);
1124
1125 /* NOTE : This function Should not be modified, when the callback is needed,
1126 the HAL_DAC_ConvHalfCpltCallbackCh2 could be implemented in the user file
1127 */
1128 }
1129
1130 /**
1131 * @brief Error DAC callback for Channel2.
1132 * @param hdac pointer to a DAC_HandleTypeDef structure that contains
1133 * the configuration information for the specified DAC.
1134 * @retval None
1135 */
HAL_DACEx_ErrorCallbackCh2(DAC_HandleTypeDef * hdac)1136 __weak void HAL_DACEx_ErrorCallbackCh2(DAC_HandleTypeDef *hdac)
1137 {
1138 /* Prevent unused argument(s) compilation warning */
1139 UNUSED(hdac);
1140
1141 /* NOTE : This function Should not be modified, when the callback is needed,
1142 the HAL_DAC_ErrorCallback could be implemented in the user file
1143 */
1144 }
1145
1146 /**
1147 * @brief DMA underrun DAC callback for channel2.
1148 * @param hdac pointer to a DAC_HandleTypeDef structure that contains
1149 * the configuration information for the specified DAC.
1150 * @retval None
1151 */
HAL_DACEx_DMAUnderrunCallbackCh2(DAC_HandleTypeDef * hdac)1152 __weak void HAL_DACEx_DMAUnderrunCallbackCh2(DAC_HandleTypeDef *hdac)
1153 {
1154 /* Prevent unused argument(s) compilation warning */
1155 UNUSED(hdac);
1156
1157 /* NOTE : This function Should not be modified, when the callback is needed,
1158 the HAL_DAC_DMAUnderrunCallbackCh2 could be implemented in the user file
1159 */
1160 }
1161
1162 /**
1163 * @}
1164 */
1165
1166 /**
1167 * @}
1168 */
1169
1170 #endif /* STM32F071xB STM32F072xB STM32F078xx */
1171 /* STM32F091xC STM32F098xx */
1172
1173 /**
1174 * @}
1175 */
1176
1177 #endif /* HAL_DAC_MODULE_ENABLED */
1178
1179 /**
1180 * @}
1181 */
1182
1183