STM32F4xx HAL Driver master
STM32CubeF4 HAL / LL Drivers API Reference
Loading...
Searching...
No Matches
stm32f4xx_hal_dac.c
Go to the documentation of this file.
1
221
222/* Includes ------------------------------------------------------------------*/
223#include "stm32f4xx_hal.h"
224
228
229#ifdef HAL_DAC_MODULE_ENABLED
230#if defined(DAC)
231
236
237/* Private typedef -----------------------------------------------------------*/
238/* Private define ------------------------------------------------------------*/
239/* Private constants ---------------------------------------------------------*/
240/* Private macro -------------------------------------------------------------*/
241/* Private variables ---------------------------------------------------------*/
242/* Private function prototypes -----------------------------------------------*/
243/* Exported functions -------------------------------------------------------*/
244
248
263
271HAL_StatusTypeDef HAL_DAC_Init(DAC_HandleTypeDef *hdac)
272{
273 /* Check the DAC peripheral handle */
274 if (hdac == NULL)
275 {
276 return HAL_ERROR;
277 }
278 /* Check the parameters */
279 assert_param(IS_DAC_ALL_INSTANCE(hdac->Instance));
280
281 if (hdac->State == HAL_DAC_STATE_RESET)
282 {
283#if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
284 /* Init the DAC Callback settings */
285 hdac->ConvCpltCallbackCh1 = HAL_DAC_ConvCpltCallbackCh1;
286 hdac->ConvHalfCpltCallbackCh1 = HAL_DAC_ConvHalfCpltCallbackCh1;
287 hdac->ErrorCallbackCh1 = HAL_DAC_ErrorCallbackCh1;
288 hdac->DMAUnderrunCallbackCh1 = HAL_DAC_DMAUnderrunCallbackCh1;
289#if defined(DAC_CHANNEL2_SUPPORT)
290 hdac->ConvCpltCallbackCh2 = HAL_DACEx_ConvCpltCallbackCh2;
291 hdac->ConvHalfCpltCallbackCh2 = HAL_DACEx_ConvHalfCpltCallbackCh2;
292 hdac->ErrorCallbackCh2 = HAL_DACEx_ErrorCallbackCh2;
293 hdac->DMAUnderrunCallbackCh2 = HAL_DACEx_DMAUnderrunCallbackCh2;
294#endif /* DAC_CHANNEL2_SUPPORT */
295 if (hdac->MspInitCallback == NULL)
296 {
297 hdac->MspInitCallback = HAL_DAC_MspInit;
298 }
299#endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
300
301 /* Allocate lock resource and initialize it */
302 hdac->Lock = HAL_UNLOCKED;
303
304#if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
305 /* Init the low level hardware */
306 hdac->MspInitCallback(hdac);
307#else
308 /* Init the low level hardware */
309 HAL_DAC_MspInit(hdac);
310#endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
311 }
312
313 /* Initialize the DAC state*/
314 hdac->State = HAL_DAC_STATE_BUSY;
315
316 /* Set DAC error code to none */
317 hdac->ErrorCode = HAL_DAC_ERROR_NONE;
318
319 /* Initialize the DAC state*/
320 hdac->State = HAL_DAC_STATE_READY;
321
322 /* Return function status */
323 return HAL_OK;
324}
325
332HAL_StatusTypeDef HAL_DAC_DeInit(DAC_HandleTypeDef *hdac)
333{
334 /* Check the DAC peripheral handle */
335 if (hdac == NULL)
336 {
337 return HAL_ERROR;
338 }
339
340 /* Check the parameters */
341 assert_param(IS_DAC_ALL_INSTANCE(hdac->Instance));
342
343 /* Change DAC state */
344 hdac->State = HAL_DAC_STATE_BUSY;
345
346#if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
347 if (hdac->MspDeInitCallback == NULL)
348 {
349 hdac->MspDeInitCallback = HAL_DAC_MspDeInit;
350 }
351 /* DeInit the low level hardware */
352 hdac->MspDeInitCallback(hdac);
353#else
354 /* DeInit the low level hardware */
355 HAL_DAC_MspDeInit(hdac);
356#endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
357
358 /* Set DAC error code to none */
359 hdac->ErrorCode = HAL_DAC_ERROR_NONE;
360
361 /* Change DAC state */
362 hdac->State = HAL_DAC_STATE_RESET;
363
364 /* Release Lock */
365 __HAL_UNLOCK(hdac);
366
367 /* Return function status */
368 return HAL_OK;
369}
370
377__weak void HAL_DAC_MspInit(DAC_HandleTypeDef *hdac)
378{
379 /* Prevent unused argument(s) compilation warning */
380 UNUSED(hdac);
381
382 /* NOTE : This function should not be modified, when the callback is needed,
383 the HAL_DAC_MspInit could be implemented in the user file
384 */
385}
386
393__weak void HAL_DAC_MspDeInit(DAC_HandleTypeDef *hdac)
394{
395 /* Prevent unused argument(s) compilation warning */
396 UNUSED(hdac);
397
398 /* NOTE : This function should not be modified, when the callback is needed,
399 the HAL_DAC_MspDeInit could be implemented in the user file
400 */
401}
402
406
424
435HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef *hdac, uint32_t Channel)
436{
437 /* Check the DAC peripheral handle */
438 if (hdac == NULL)
439 {
440 return HAL_ERROR;
441 }
442
443 /* Check the parameters */
444 assert_param(IS_DAC_CHANNEL(Channel));
445
446 /* Process locked */
447 __HAL_LOCK(hdac);
448
449 /* Change DAC state */
450 hdac->State = HAL_DAC_STATE_BUSY;
451
452 /* Enable the Peripheral */
453 __HAL_DAC_ENABLE(hdac, Channel);
454
455 if (Channel == DAC_CHANNEL_1)
456 {
457 /* Check if software trigger enabled */
458 if ((hdac->Instance->CR & (DAC_CR_TEN1 | DAC_CR_TSEL1)) == DAC_TRIGGER_SOFTWARE)
459 {
460 /* Enable the selected DAC software conversion */
461 SET_BIT(hdac->Instance->SWTRIGR, DAC_SWTRIGR_SWTRIG1);
462 }
463 }
464#if defined(DAC_CHANNEL2_SUPPORT)
465 else
466 {
467 /* Check if software trigger enabled */
468 if ((hdac->Instance->CR & (DAC_CR_TEN2 | DAC_CR_TSEL2)) == (DAC_TRIGGER_SOFTWARE << (Channel & 0x10UL)))
469 {
470 /* Enable the selected DAC software conversion*/
471 SET_BIT(hdac->Instance->SWTRIGR, DAC_SWTRIGR_SWTRIG2);
472 }
473 }
474#endif /* DAC_CHANNEL2_SUPPORT */
475
476 /* Change DAC state */
477 hdac->State = HAL_DAC_STATE_READY;
478
479 /* Process unlocked */
480 __HAL_UNLOCK(hdac);
481
482 /* Return function status */
483 return HAL_OK;
484}
485
496HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef *hdac, uint32_t Channel)
497{
498 /* Check the DAC peripheral handle */
499 if (hdac == NULL)
500 {
501 return HAL_ERROR;
502 }
503
504 /* Check the parameters */
505 assert_param(IS_DAC_CHANNEL(Channel));
506
507 /* Disable the Peripheral */
508 __HAL_DAC_DISABLE(hdac, Channel);
509
510 /* Change DAC state */
511 hdac->State = HAL_DAC_STATE_READY;
512
513 /* Return function status */
514 return HAL_OK;
515}
516
534HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel, const uint32_t *pData, uint32_t Length,
535 uint32_t Alignment)
536{
537#if defined(DAC_CHANNEL2_SUPPORT)
538 HAL_StatusTypeDef status;
539#else
541#endif /* DAC_CHANNEL2_SUPPORT */
542 uint32_t tmpreg;
543
544 /* Check the DAC peripheral handle */
545 if (hdac == NULL)
546 {
547 return HAL_ERROR;
548 }
549
550 /* Check the parameters */
551 assert_param(IS_DAC_CHANNEL(Channel));
552 assert_param(IS_DAC_ALIGN(Alignment));
553
554 /* Process locked */
555 __HAL_LOCK(hdac);
556
557 /* Change DAC state */
558 hdac->State = HAL_DAC_STATE_BUSY;
559
560 if (Channel == DAC_CHANNEL_1)
561 {
562 /* Set the DMA transfer complete callback for channel1 */
563 hdac->DMA_Handle1->XferCpltCallback = DAC_DMAConvCpltCh1;
564
565 /* Set the DMA half transfer complete callback for channel1 */
566 hdac->DMA_Handle1->XferHalfCpltCallback = DAC_DMAHalfConvCpltCh1;
567
568 /* Set the DMA error callback for channel1 */
569 hdac->DMA_Handle1->XferErrorCallback = DAC_DMAErrorCh1;
570
571 /* Enable the selected DAC channel1 DMA request */
572 SET_BIT(hdac->Instance->CR, DAC_CR_DMAEN1);
573
574 /* Case of use of channel 1 */
575 switch (Alignment)
576 {
577 case DAC_ALIGN_12B_R:
578 /* Get DHR12R1 address */
579 tmpreg = (uint32_t)&hdac->Instance->DHR12R1;
580 break;
581 case DAC_ALIGN_12B_L:
582 /* Get DHR12L1 address */
583 tmpreg = (uint32_t)&hdac->Instance->DHR12L1;
584 break;
585 default: /* case DAC_ALIGN_8B_R */
586 /* Get DHR8R1 address */
587 tmpreg = (uint32_t)&hdac->Instance->DHR8R1;
588 break;
589 }
590 }
591#if defined(DAC_CHANNEL2_SUPPORT)
592 else
593 {
594 /* Set the DMA transfer complete callback for channel2 */
595 hdac->DMA_Handle2->XferCpltCallback = DAC_DMAConvCpltCh2;
596
597 /* Set the DMA half transfer complete callback for channel2 */
598 hdac->DMA_Handle2->XferHalfCpltCallback = DAC_DMAHalfConvCpltCh2;
599
600 /* Set the DMA error callback for channel2 */
601 hdac->DMA_Handle2->XferErrorCallback = DAC_DMAErrorCh2;
602
603 /* Enable the selected DAC channel2 DMA request */
604 SET_BIT(hdac->Instance->CR, DAC_CR_DMAEN2);
605
606 /* Case of use of channel 2 */
607 switch (Alignment)
608 {
609 case DAC_ALIGN_12B_R:
610 /* Get DHR12R2 address */
611 tmpreg = (uint32_t)&hdac->Instance->DHR12R2;
612 break;
613 case DAC_ALIGN_12B_L:
614 /* Get DHR12L2 address */
615 tmpreg = (uint32_t)&hdac->Instance->DHR12L2;
616 break;
617 default: /* case DAC_ALIGN_8B_R */
618 /* Get DHR8R2 address */
619 tmpreg = (uint32_t)&hdac->Instance->DHR8R2;
620 break;
621 }
622 }
623#endif /* DAC_CHANNEL2_SUPPORT */
624 if (Channel == DAC_CHANNEL_1)
625 {
626 /* Enable the DAC DMA underrun interrupt */
627 __HAL_DAC_ENABLE_IT(hdac, DAC_IT_DMAUDR1);
628
629 /* Enable the DMA Stream */
630 status = HAL_DMA_Start_IT(hdac->DMA_Handle1, (uint32_t)pData, tmpreg, Length);
631 }
632#if defined(DAC_CHANNEL2_SUPPORT)
633 else
634 {
635 /* Enable the DAC DMA underrun interrupt */
636 __HAL_DAC_ENABLE_IT(hdac, DAC_IT_DMAUDR2);
637
638 /* Enable the DMA Stream */
639 status = HAL_DMA_Start_IT(hdac->DMA_Handle2, (uint32_t)pData, tmpreg, Length);
640 }
641#endif /* DAC_CHANNEL2_SUPPORT */
642
643 /* Process Unlocked */
644 __HAL_UNLOCK(hdac);
645
646 if (status == HAL_OK)
647 {
648 /* Enable the Peripheral */
649 __HAL_DAC_ENABLE(hdac, Channel);
650 }
651 else
652 {
653 hdac->ErrorCode |= HAL_DAC_ERROR_DMA;
654 }
655
656 /* Return function status */
657 return status;
658}
659
670HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel)
671{
672 /* Check the DAC peripheral handle */
673 if (hdac == NULL)
674 {
675 return HAL_ERROR;
676 }
677
678 /* Check the parameters */
679 assert_param(IS_DAC_CHANNEL(Channel));
680
681 /* Disable the selected DAC channel DMA request */
682 hdac->Instance->CR &= ~(DAC_CR_DMAEN1 << (Channel & 0x10UL));
683
684 /* Disable the Peripheral */
685 __HAL_DAC_DISABLE(hdac, Channel);
686
687 /* Disable the DMA Stream */
688
689 /* Channel1 is used */
690 if (Channel == DAC_CHANNEL_1)
691 {
692 /* Disable the DMA Stream */
693 (void)HAL_DMA_Abort(hdac->DMA_Handle1);
694
695 /* Disable the DAC DMA underrun interrupt */
696 __HAL_DAC_DISABLE_IT(hdac, DAC_IT_DMAUDR1);
697 }
698#if defined(DAC_CHANNEL2_SUPPORT)
699 else /* Channel2 is used for */
700 {
701 /* Disable the DMA Stream */
702 (void)HAL_DMA_Abort(hdac->DMA_Handle2);
703
704 /* Disable the DAC DMA underrun interrupt */
705 __HAL_DAC_DISABLE_IT(hdac, DAC_IT_DMAUDR2);
706 }
707#endif /* DAC_CHANNEL2_SUPPORT */
708
709 /* Change DAC state */
710 hdac->State = HAL_DAC_STATE_READY;
711
712 /* Return function status */
713 return HAL_OK;
714}
715
724void HAL_DAC_IRQHandler(DAC_HandleTypeDef *hdac)
725{
726 uint32_t itsource = hdac->Instance->CR;
727 uint32_t itflag = hdac->Instance->SR;
728
729 if ((itsource & DAC_IT_DMAUDR1) == DAC_IT_DMAUDR1)
730 {
731 /* Check underrun flag of DAC channel 1 */
732 if ((itflag & DAC_FLAG_DMAUDR1) == DAC_FLAG_DMAUDR1)
733 {
734 /* Change DAC state to error state */
735 hdac->State = HAL_DAC_STATE_ERROR;
736
737 /* Set DAC error code to channel1 DMA underrun error */
738 SET_BIT(hdac->ErrorCode, HAL_DAC_ERROR_DMAUNDERRUNCH1);
739
740 /* Clear the underrun flag */
741 __HAL_DAC_CLEAR_FLAG(hdac, DAC_FLAG_DMAUDR1);
742
743 /* Disable the selected DAC channel1 DMA request */
744 __HAL_DAC_DISABLE_IT(hdac, DAC_CR_DMAEN1);
745
746 /* Error callback */
747#if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
748 hdac->DMAUnderrunCallbackCh1(hdac);
749#else
750 HAL_DAC_DMAUnderrunCallbackCh1(hdac);
751#endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
752 }
753 }
754
755#if defined(DAC_CHANNEL2_SUPPORT)
756 if ((itsource & DAC_IT_DMAUDR2) == DAC_IT_DMAUDR2)
757 {
758 /* Check underrun flag of DAC channel 2 */
759 if ((itflag & DAC_FLAG_DMAUDR2) == DAC_FLAG_DMAUDR2)
760 {
761 /* Change DAC state to error state */
762 hdac->State = HAL_DAC_STATE_ERROR;
763
764 /* Set DAC error code to channel2 DMA underrun error */
765 SET_BIT(hdac->ErrorCode, HAL_DAC_ERROR_DMAUNDERRUNCH2);
766
767 /* Clear the underrun flag */
768 __HAL_DAC_CLEAR_FLAG(hdac, DAC_FLAG_DMAUDR2);
769
770 /* Disable the selected DAC channel2 DMA request */
771 __HAL_DAC_DISABLE_IT(hdac, DAC_CR_DMAEN2);
772
773 /* Error callback */
774#if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
775 hdac->DMAUnderrunCallbackCh2(hdac);
776#else
777 HAL_DACEx_DMAUnderrunCallbackCh2(hdac);
778#endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
779 }
780 }
781#endif /* DAC_CHANNEL2_SUPPORT */
782}
783
800HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data)
801{
802 __IO uint32_t tmp = 0UL;
803
804 /* Check the DAC peripheral handle */
805 if (hdac == NULL)
806 {
807 return HAL_ERROR;
808 }
809
810 /* Check the parameters */
811 assert_param(IS_DAC_CHANNEL(Channel));
812 assert_param(IS_DAC_ALIGN(Alignment));
813 assert_param(IS_DAC_DATA(Data));
814
815 tmp = (uint32_t)hdac->Instance;
816 if (Channel == DAC_CHANNEL_1)
817 {
818 tmp += DAC_DHR12R1_ALIGNMENT(Alignment);
819 }
820#if defined(DAC_CHANNEL2_SUPPORT)
821 else
822 {
823 tmp += DAC_DHR12R2_ALIGNMENT(Alignment);
824 }
825#endif /* DAC_CHANNEL2_SUPPORT */
826
827 /* Set the DAC channel selected data holding register */
828 *(__IO uint32_t *) tmp = Data;
829
830 /* Return function status */
831 return HAL_OK;
832}
833
840__weak void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef *hdac)
841{
842 /* Prevent unused argument(s) compilation warning */
843 UNUSED(hdac);
844
845 /* NOTE : This function should not be modified, when the callback is needed,
846 the HAL_DAC_ConvCpltCallbackCh1 could be implemented in the user file
847 */
848}
849
856__weak void HAL_DAC_ConvHalfCpltCallbackCh1(DAC_HandleTypeDef *hdac)
857{
858 /* Prevent unused argument(s) compilation warning */
859 UNUSED(hdac);
860
861 /* NOTE : This function should not be modified, when the callback is needed,
862 the HAL_DAC_ConvHalfCpltCallbackCh1 could be implemented in the user file
863 */
864}
865
872__weak void HAL_DAC_ErrorCallbackCh1(DAC_HandleTypeDef *hdac)
873{
874 /* Prevent unused argument(s) compilation warning */
875 UNUSED(hdac);
876
877 /* NOTE : This function should not be modified, when the callback is needed,
878 the HAL_DAC_ErrorCallbackCh1 could be implemented in the user file
879 */
880}
881
888__weak void HAL_DAC_DMAUnderrunCallbackCh1(DAC_HandleTypeDef *hdac)
889{
890 /* Prevent unused argument(s) compilation warning */
891 UNUSED(hdac);
892
893 /* NOTE : This function should not be modified, when the callback is needed,
894 the HAL_DAC_DMAUnderrunCallbackCh1 could be implemented in the user file
895 */
896}
897
901
916
927uint32_t HAL_DAC_GetValue(const DAC_HandleTypeDef *hdac, uint32_t Channel)
928{
929 uint32_t result = 0;
930
931 /* Check the DAC peripheral handle */
932 assert_param(hdac != NULL);
933
934 /* Check the parameters */
935 assert_param(IS_DAC_CHANNEL(Channel));
936
937 if (Channel == DAC_CHANNEL_1)
938 {
939 result = hdac->Instance->DOR1;
940 }
941#if defined(DAC_CHANNEL2_SUPPORT)
942 else
943 {
944 result = hdac->Instance->DOR2;
945 }
946#endif /* DAC_CHANNEL2_SUPPORT */
947 /* Returns the DAC channel data output register value */
948 return result;
949}
950
962HAL_StatusTypeDef HAL_DAC_ConfigChannel(DAC_HandleTypeDef *hdac,
963 const DAC_ChannelConfTypeDef *sConfig, uint32_t Channel)
964{
965 HAL_StatusTypeDef status = HAL_OK;
966 uint32_t tmpreg1;
967 uint32_t tmpreg2;
968
969 /* Check the DAC peripheral handle and channel configuration struct */
970 if ((hdac == NULL) || (sConfig == NULL))
971 {
972 return HAL_ERROR;
973 }
974
975 /* Check the DAC parameters */
976 assert_param(IS_DAC_TRIGGER(sConfig->DAC_Trigger));
977 assert_param(IS_DAC_OUTPUT_BUFFER_STATE(sConfig->DAC_OutputBuffer));
978 assert_param(IS_DAC_CHANNEL(Channel));
979
980 /* Process locked */
981 __HAL_LOCK(hdac);
982
983 /* Change DAC state */
984 hdac->State = HAL_DAC_STATE_BUSY;
985
986 /* Get the DAC CR value */
987 tmpreg1 = hdac->Instance->CR;
988 /* Clear BOFFx, TENx, TSELx, WAVEx and MAMPx bits */
989 tmpreg1 &= ~(((uint32_t)(DAC_CR_MAMP1 | DAC_CR_WAVE1 | DAC_CR_TSEL1 | DAC_CR_TEN1 | DAC_CR_BOFF1))
990 << (Channel & 0x10UL));
991 /* Configure for the selected DAC channel: buffer output, trigger */
992 /* Set TSELx and TENx bits according to DAC_Trigger value */
993 /* Set BOFFx bit according to DAC_OutputBuffer value */
994 tmpreg2 = (sConfig->DAC_Trigger | sConfig->DAC_OutputBuffer);
995 /* Calculate CR register value depending on DAC_Channel */
996 tmpreg1 |= tmpreg2 << (Channel & 0x10UL);
997 /* Write to DAC CR */
998 hdac->Instance->CR = tmpreg1;
999 /* Disable wave generation */
1000 CLEAR_BIT(hdac->Instance->CR, (DAC_CR_WAVE1 << (Channel & 0x10UL)));
1001
1002 /* Change DAC state */
1003 hdac->State = HAL_DAC_STATE_READY;
1004
1005 /* Process unlocked */
1006 __HAL_UNLOCK(hdac);
1007
1008 /* Return function status */
1009 return status;
1010}
1011
1015
1031
1038HAL_DAC_StateTypeDef HAL_DAC_GetState(const DAC_HandleTypeDef *hdac)
1039{
1040 /* Return DAC handle state */
1041 return hdac->State;
1042}
1043
1044
1051uint32_t HAL_DAC_GetError(const DAC_HandleTypeDef *hdac)
1052{
1053 return hdac->ErrorCode;
1054}
1055
1059
1063
1067
1071#if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
1095HAL_StatusTypeDef HAL_DAC_RegisterCallback(DAC_HandleTypeDef *hdac, HAL_DAC_CallbackIDTypeDef CallbackID,
1096 pDAC_CallbackTypeDef pCallback)
1097{
1098 HAL_StatusTypeDef status = HAL_OK;
1099
1100 /* Check the DAC peripheral handle */
1101 if (hdac == NULL)
1102 {
1103 return HAL_ERROR;
1104 }
1105
1106 if (pCallback == NULL)
1107 {
1108 /* Update the error code */
1109 hdac->ErrorCode |= HAL_DAC_ERROR_INVALID_CALLBACK;
1110 return HAL_ERROR;
1111 }
1112
1113 if (hdac->State == HAL_DAC_STATE_READY)
1114 {
1115 switch (CallbackID)
1116 {
1117 case HAL_DAC_CH1_COMPLETE_CB_ID :
1118 hdac->ConvCpltCallbackCh1 = pCallback;
1119 break;
1120 case HAL_DAC_CH1_HALF_COMPLETE_CB_ID :
1121 hdac->ConvHalfCpltCallbackCh1 = pCallback;
1122 break;
1123 case HAL_DAC_CH1_ERROR_ID :
1124 hdac->ErrorCallbackCh1 = pCallback;
1125 break;
1126 case HAL_DAC_CH1_UNDERRUN_CB_ID :
1127 hdac->DMAUnderrunCallbackCh1 = pCallback;
1128 break;
1129#if defined(DAC_CHANNEL2_SUPPORT)
1130 case HAL_DAC_CH2_COMPLETE_CB_ID :
1131 hdac->ConvCpltCallbackCh2 = pCallback;
1132 break;
1133 case HAL_DAC_CH2_HALF_COMPLETE_CB_ID :
1134 hdac->ConvHalfCpltCallbackCh2 = pCallback;
1135 break;
1136 case HAL_DAC_CH2_ERROR_ID :
1137 hdac->ErrorCallbackCh2 = pCallback;
1138 break;
1139 case HAL_DAC_CH2_UNDERRUN_CB_ID :
1140 hdac->DMAUnderrunCallbackCh2 = pCallback;
1141 break;
1142#endif /* DAC_CHANNEL2_SUPPORT */
1143 case HAL_DAC_MSPINIT_CB_ID :
1144 hdac->MspInitCallback = pCallback;
1145 break;
1146 case HAL_DAC_MSPDEINIT_CB_ID :
1147 hdac->MspDeInitCallback = pCallback;
1148 break;
1149 default :
1150 /* Update the error code */
1151 hdac->ErrorCode |= HAL_DAC_ERROR_INVALID_CALLBACK;
1152 /* update return status */
1153 status = HAL_ERROR;
1154 break;
1155 }
1156 }
1157 else if (hdac->State == HAL_DAC_STATE_RESET)
1158 {
1159 switch (CallbackID)
1160 {
1161 case HAL_DAC_MSPINIT_CB_ID :
1162 hdac->MspInitCallback = pCallback;
1163 break;
1164 case HAL_DAC_MSPDEINIT_CB_ID :
1165 hdac->MspDeInitCallback = pCallback;
1166 break;
1167 default :
1168 /* Update the error code */
1169 hdac->ErrorCode |= HAL_DAC_ERROR_INVALID_CALLBACK;
1170 /* update return status */
1171 status = HAL_ERROR;
1172 break;
1173 }
1174 }
1175 else
1176 {
1177 /* Update the error code */
1178 hdac->ErrorCode |= HAL_DAC_ERROR_INVALID_CALLBACK;
1179 /* update return status */
1180 status = HAL_ERROR;
1181 }
1182
1183 return status;
1184}
1185
1207HAL_StatusTypeDef HAL_DAC_UnRegisterCallback(DAC_HandleTypeDef *hdac, HAL_DAC_CallbackIDTypeDef CallbackID)
1208{
1209 HAL_StatusTypeDef status = HAL_OK;
1210
1211 /* Check the DAC peripheral handle */
1212 if (hdac == NULL)
1213 {
1214 return HAL_ERROR;
1215 }
1216
1217 if (hdac->State == HAL_DAC_STATE_READY)
1218 {
1219 switch (CallbackID)
1220 {
1221 case HAL_DAC_CH1_COMPLETE_CB_ID :
1222 hdac->ConvCpltCallbackCh1 = HAL_DAC_ConvCpltCallbackCh1;
1223 break;
1224 case HAL_DAC_CH1_HALF_COMPLETE_CB_ID :
1225 hdac->ConvHalfCpltCallbackCh1 = HAL_DAC_ConvHalfCpltCallbackCh1;
1226 break;
1227 case HAL_DAC_CH1_ERROR_ID :
1228 hdac->ErrorCallbackCh1 = HAL_DAC_ErrorCallbackCh1;
1229 break;
1230 case HAL_DAC_CH1_UNDERRUN_CB_ID :
1231 hdac->DMAUnderrunCallbackCh1 = HAL_DAC_DMAUnderrunCallbackCh1;
1232 break;
1233#if defined(DAC_CHANNEL2_SUPPORT)
1234 case HAL_DAC_CH2_COMPLETE_CB_ID :
1235 hdac->ConvCpltCallbackCh2 = HAL_DACEx_ConvCpltCallbackCh2;
1236 break;
1237 case HAL_DAC_CH2_HALF_COMPLETE_CB_ID :
1238 hdac->ConvHalfCpltCallbackCh2 = HAL_DACEx_ConvHalfCpltCallbackCh2;
1239 break;
1240 case HAL_DAC_CH2_ERROR_ID :
1241 hdac->ErrorCallbackCh2 = HAL_DACEx_ErrorCallbackCh2;
1242 break;
1243 case HAL_DAC_CH2_UNDERRUN_CB_ID :
1244 hdac->DMAUnderrunCallbackCh2 = HAL_DACEx_DMAUnderrunCallbackCh2;
1245 break;
1246#endif /* DAC_CHANNEL2_SUPPORT */
1247 case HAL_DAC_MSPINIT_CB_ID :
1248 hdac->MspInitCallback = HAL_DAC_MspInit;
1249 break;
1250 case HAL_DAC_MSPDEINIT_CB_ID :
1251 hdac->MspDeInitCallback = HAL_DAC_MspDeInit;
1252 break;
1253 case HAL_DAC_ALL_CB_ID :
1254 hdac->ConvCpltCallbackCh1 = HAL_DAC_ConvCpltCallbackCh1;
1255 hdac->ConvHalfCpltCallbackCh1 = HAL_DAC_ConvHalfCpltCallbackCh1;
1256 hdac->ErrorCallbackCh1 = HAL_DAC_ErrorCallbackCh1;
1257 hdac->DMAUnderrunCallbackCh1 = HAL_DAC_DMAUnderrunCallbackCh1;
1258#if defined(DAC_CHANNEL2_SUPPORT)
1259 hdac->ConvCpltCallbackCh2 = HAL_DACEx_ConvCpltCallbackCh2;
1260 hdac->ConvHalfCpltCallbackCh2 = HAL_DACEx_ConvHalfCpltCallbackCh2;
1261 hdac->ErrorCallbackCh2 = HAL_DACEx_ErrorCallbackCh2;
1262 hdac->DMAUnderrunCallbackCh2 = HAL_DACEx_DMAUnderrunCallbackCh2;
1263#endif /* DAC_CHANNEL2_SUPPORT */
1264 hdac->MspInitCallback = HAL_DAC_MspInit;
1265 hdac->MspDeInitCallback = HAL_DAC_MspDeInit;
1266 break;
1267 default :
1268 /* Update the error code */
1269 hdac->ErrorCode |= HAL_DAC_ERROR_INVALID_CALLBACK;
1270 /* update return status */
1271 status = HAL_ERROR;
1272 break;
1273 }
1274 }
1275 else if (hdac->State == HAL_DAC_STATE_RESET)
1276 {
1277 switch (CallbackID)
1278 {
1279 case HAL_DAC_MSPINIT_CB_ID :
1280 hdac->MspInitCallback = HAL_DAC_MspInit;
1281 break;
1282 case HAL_DAC_MSPDEINIT_CB_ID :
1283 hdac->MspDeInitCallback = HAL_DAC_MspDeInit;
1284 break;
1285 default :
1286 /* Update the error code */
1287 hdac->ErrorCode |= HAL_DAC_ERROR_INVALID_CALLBACK;
1288 /* update return status */
1289 status = HAL_ERROR;
1290 break;
1291 }
1292 }
1293 else
1294 {
1295 /* Update the error code */
1296 hdac->ErrorCode |= HAL_DAC_ERROR_INVALID_CALLBACK;
1297 /* update return status */
1298 status = HAL_ERROR;
1299 }
1300
1301 return status;
1302}
1303#endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
1304
1308
1312
1316
1323void DAC_DMAConvCpltCh1(DMA_HandleTypeDef *hdma)
1324{
1325 DAC_HandleTypeDef *hdac = (DAC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
1326
1327#if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
1328 hdac->ConvCpltCallbackCh1(hdac);
1329#else
1330 HAL_DAC_ConvCpltCallbackCh1(hdac);
1331#endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
1332
1333 hdac->State = HAL_DAC_STATE_READY;
1334}
1335
1342void DAC_DMAHalfConvCpltCh1(DMA_HandleTypeDef *hdma)
1343{
1344 DAC_HandleTypeDef *hdac = (DAC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
1345 /* Conversion complete callback */
1346#if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
1347 hdac->ConvHalfCpltCallbackCh1(hdac);
1348#else
1349 HAL_DAC_ConvHalfCpltCallbackCh1(hdac);
1350#endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
1351}
1352
1359void DAC_DMAErrorCh1(DMA_HandleTypeDef *hdma)
1360{
1361 DAC_HandleTypeDef *hdac = (DAC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
1362
1363 /* Set DAC error code to DMA error */
1364 hdac->ErrorCode |= HAL_DAC_ERROR_DMA;
1365
1366#if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
1367 hdac->ErrorCallbackCh1(hdac);
1368#else
1369 HAL_DAC_ErrorCallbackCh1(hdac);
1370#endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
1371
1372 hdac->State = HAL_DAC_STATE_READY;
1373}
1374
1378
1382
1383#endif /* DAC */
1384
1385#endif /* HAL_DAC_MODULE_ENABLED */
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
struct __DMA_HandleTypeDef DMA_HandleTypeDef
DMA handle Structure definition.
#define assert_param(expr)
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef
HAL Status structures definition.
@ HAL_ERROR
@ HAL_OK
#define __HAL_UNLOCK(__HANDLE__)
@ HAL_UNLOCKED
#define __HAL_LOCK(__HANDLE__)