STM32F4xx_HAL_Driver  1.8.3
stm32f4xx_hal_dac.c
Go to the documentation of this file.
1 
222 /* Includes ------------------------------------------------------------------*/
223 #include "stm32f4xx_hal.h"
224 
229 #ifdef HAL_DAC_MODULE_ENABLED
230 #if defined(DAC)
231 
237 /* Private typedef -----------------------------------------------------------*/
238 /* Private define ------------------------------------------------------------*/
239 /* Private constants ---------------------------------------------------------*/
240 /* Private macro -------------------------------------------------------------*/
241 /* Private variables ---------------------------------------------------------*/
242 /* Private function prototypes -----------------------------------------------*/
243 /* Exported functions -------------------------------------------------------*/
244 
271 HAL_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 
332 HAL_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 
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 
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 
435 HAL_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 
496 HAL_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 
534 HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel, const uint32_t *pData, uint32_t Length,
535  uint32_t Alignment)
536 {
537  HAL_StatusTypeDef status = HAL_ERROR;
538  uint32_t tmpreg;
539 
540  /* Check the DAC peripheral handle */
541  if (hdac == NULL)
542  {
543  return HAL_ERROR;
544  }
545 
546  /* Check the parameters */
547  assert_param(IS_DAC_CHANNEL(Channel));
548  assert_param(IS_DAC_ALIGN(Alignment));
549 
550  /* Process locked */
551  __HAL_LOCK(hdac);
552 
553  /* Change DAC state */
554  hdac->State = HAL_DAC_STATE_BUSY;
555 
556  if (Channel == DAC_CHANNEL_1)
557  {
558  /* Set the DMA transfer complete callback for channel1 */
559  hdac->DMA_Handle1->XferCpltCallback = DAC_DMAConvCpltCh1;
560 
561  /* Set the DMA half transfer complete callback for channel1 */
562  hdac->DMA_Handle1->XferHalfCpltCallback = DAC_DMAHalfConvCpltCh1;
563 
564  /* Set the DMA error callback for channel1 */
565  hdac->DMA_Handle1->XferErrorCallback = DAC_DMAErrorCh1;
566 
567  /* Enable the selected DAC channel1 DMA request */
568  SET_BIT(hdac->Instance->CR, DAC_CR_DMAEN1);
569 
570  /* Case of use of channel 1 */
571  switch (Alignment)
572  {
573  case DAC_ALIGN_12B_R:
574  /* Get DHR12R1 address */
575  tmpreg = (uint32_t)&hdac->Instance->DHR12R1;
576  break;
577  case DAC_ALIGN_12B_L:
578  /* Get DHR12L1 address */
579  tmpreg = (uint32_t)&hdac->Instance->DHR12L1;
580  break;
581  default: /* case DAC_ALIGN_8B_R */
582  /* Get DHR8R1 address */
583  tmpreg = (uint32_t)&hdac->Instance->DHR8R1;
584  break;
585  }
586  }
587 #if defined(DAC_CHANNEL2_SUPPORT)
588  else
589  {
590  /* Set the DMA transfer complete callback for channel2 */
591  hdac->DMA_Handle2->XferCpltCallback = DAC_DMAConvCpltCh2;
592 
593  /* Set the DMA half transfer complete callback for channel2 */
594  hdac->DMA_Handle2->XferHalfCpltCallback = DAC_DMAHalfConvCpltCh2;
595 
596  /* Set the DMA error callback for channel2 */
597  hdac->DMA_Handle2->XferErrorCallback = DAC_DMAErrorCh2;
598 
599  /* Enable the selected DAC channel2 DMA request */
600  SET_BIT(hdac->Instance->CR, DAC_CR_DMAEN2);
601 
602  /* Case of use of channel 2 */
603  switch (Alignment)
604  {
605  case DAC_ALIGN_12B_R:
606  /* Get DHR12R2 address */
607  tmpreg = (uint32_t)&hdac->Instance->DHR12R2;
608  break;
609  case DAC_ALIGN_12B_L:
610  /* Get DHR12L2 address */
611  tmpreg = (uint32_t)&hdac->Instance->DHR12L2;
612  break;
613  default: /* case DAC_ALIGN_8B_R */
614  /* Get DHR8R2 address */
615  tmpreg = (uint32_t)&hdac->Instance->DHR8R2;
616  break;
617  }
618  }
619 #endif /* DAC_CHANNEL2_SUPPORT */
620  if (Channel == DAC_CHANNEL_1)
621  {
622  /* Enable the DAC DMA underrun interrupt */
623  __HAL_DAC_ENABLE_IT(hdac, DAC_IT_DMAUDR1);
624 
625  /* Enable the DMA Stream */
626  status = HAL_DMA_Start_IT(hdac->DMA_Handle1, (uint32_t)pData, tmpreg, Length);
627  }
628 #if defined(DAC_CHANNEL2_SUPPORT)
629  else
630  {
631  /* Enable the DAC DMA underrun interrupt */
632  __HAL_DAC_ENABLE_IT(hdac, DAC_IT_DMAUDR2);
633 
634  /* Enable the DMA Stream */
635  status = HAL_DMA_Start_IT(hdac->DMA_Handle2, (uint32_t)pData, tmpreg, Length);
636  }
637 #endif /* DAC_CHANNEL2_SUPPORT */
638 
639  /* Process Unlocked */
640  __HAL_UNLOCK(hdac);
641 
642  if (status == HAL_OK)
643  {
644  /* Enable the Peripheral */
645  __HAL_DAC_ENABLE(hdac, Channel);
646  }
647  else
648  {
649  hdac->ErrorCode |= HAL_DAC_ERROR_DMA;
650  }
651 
652  /* Return function status */
653  return status;
654 }
655 
666 HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel)
667 {
668  /* Check the DAC peripheral handle */
669  if (hdac == NULL)
670  {
671  return HAL_ERROR;
672  }
673 
674  /* Check the parameters */
675  assert_param(IS_DAC_CHANNEL(Channel));
676 
677  /* Disable the selected DAC channel DMA request */
678  hdac->Instance->CR &= ~(DAC_CR_DMAEN1 << (Channel & 0x10UL));
679 
680  /* Disable the Peripheral */
681  __HAL_DAC_DISABLE(hdac, Channel);
682 
683  /* Disable the DMA Stream */
684 
685  /* Channel1 is used */
686  if (Channel == DAC_CHANNEL_1)
687  {
688  /* Disable the DMA Stream */
689  (void)HAL_DMA_Abort(hdac->DMA_Handle1);
690 
691  /* Disable the DAC DMA underrun interrupt */
692  __HAL_DAC_DISABLE_IT(hdac, DAC_IT_DMAUDR1);
693  }
694 #if defined(DAC_CHANNEL2_SUPPORT)
695  else /* Channel2 is used for */
696  {
697  /* Disable the DMA Stream */
698  (void)HAL_DMA_Abort(hdac->DMA_Handle2);
699 
700  /* Disable the DAC DMA underrun interrupt */
701  __HAL_DAC_DISABLE_IT(hdac, DAC_IT_DMAUDR2);
702  }
703 #endif /* DAC_CHANNEL2_SUPPORT */
704 
705  /* Change DAC state */
706  hdac->State = HAL_DAC_STATE_READY;
707 
708  /* Return function status */
709  return HAL_OK;
710 }
711 
721 {
722  uint32_t itsource = hdac->Instance->CR;
723  uint32_t itflag = hdac->Instance->SR;
724 
725  if ((itsource & DAC_IT_DMAUDR1) == DAC_IT_DMAUDR1)
726  {
727  /* Check underrun flag of DAC channel 1 */
728  if ((itflag & DAC_FLAG_DMAUDR1) == DAC_FLAG_DMAUDR1)
729  {
730  /* Change DAC state to error state */
731  hdac->State = HAL_DAC_STATE_ERROR;
732 
733  /* Set DAC error code to channel1 DMA underrun error */
734  SET_BIT(hdac->ErrorCode, HAL_DAC_ERROR_DMAUNDERRUNCH1);
735 
736  /* Clear the underrun flag */
737  __HAL_DAC_CLEAR_FLAG(hdac, DAC_FLAG_DMAUDR1);
738 
739  /* Disable the selected DAC channel1 DMA request */
740  __HAL_DAC_DISABLE_IT(hdac, DAC_CR_DMAEN1);
741 
742  /* Error callback */
743 #if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
744  hdac->DMAUnderrunCallbackCh1(hdac);
745 #else
747 #endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
748  }
749  }
750 
751 #if defined(DAC_CHANNEL2_SUPPORT)
752  if ((itsource & DAC_IT_DMAUDR2) == DAC_IT_DMAUDR2)
753  {
754  /* Check underrun flag of DAC channel 2 */
755  if ((itflag & DAC_FLAG_DMAUDR2) == DAC_FLAG_DMAUDR2)
756  {
757  /* Change DAC state to error state */
758  hdac->State = HAL_DAC_STATE_ERROR;
759 
760  /* Set DAC error code to channel2 DMA underrun error */
761  SET_BIT(hdac->ErrorCode, HAL_DAC_ERROR_DMAUNDERRUNCH2);
762 
763  /* Clear the underrun flag */
764  __HAL_DAC_CLEAR_FLAG(hdac, DAC_FLAG_DMAUDR2);
765 
766  /* Disable the selected DAC channel2 DMA request */
767  __HAL_DAC_DISABLE_IT(hdac, DAC_CR_DMAEN2);
768 
769  /* Error callback */
770 #if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
771  hdac->DMAUnderrunCallbackCh2(hdac);
772 #else
774 #endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
775  }
776  }
777 #endif /* DAC_CHANNEL2_SUPPORT */
778 }
779 
796 HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data)
797 {
798  __IO uint32_t tmp = 0UL;
799 
800  /* Check the DAC peripheral handle */
801  if (hdac == NULL)
802  {
803  return HAL_ERROR;
804  }
805 
806  /* Check the parameters */
807  assert_param(IS_DAC_CHANNEL(Channel));
808  assert_param(IS_DAC_ALIGN(Alignment));
809  assert_param(IS_DAC_DATA(Data));
810 
811  tmp = (uint32_t)hdac->Instance;
812  if (Channel == DAC_CHANNEL_1)
813  {
814  tmp += DAC_DHR12R1_ALIGNMENT(Alignment);
815  }
816 #if defined(DAC_CHANNEL2_SUPPORT)
817  else
818  {
819  tmp += DAC_DHR12R2_ALIGNMENT(Alignment);
820  }
821 #endif /* DAC_CHANNEL2_SUPPORT */
822 
823  /* Set the DAC channel selected data holding register */
824  *(__IO uint32_t *) tmp = Data;
825 
826  /* Return function status */
827  return HAL_OK;
828 }
829 
837 {
838  /* Prevent unused argument(s) compilation warning */
839  UNUSED(hdac);
840 
841  /* NOTE : This function should not be modified, when the callback is needed,
842  the HAL_DAC_ConvCpltCallbackCh1 could be implemented in the user file
843  */
844 }
845 
853 {
854  /* Prevent unused argument(s) compilation warning */
855  UNUSED(hdac);
856 
857  /* NOTE : This function should not be modified, when the callback is needed,
858  the HAL_DAC_ConvHalfCpltCallbackCh1 could be implemented in the user file
859  */
860 }
861 
869 {
870  /* Prevent unused argument(s) compilation warning */
871  UNUSED(hdac);
872 
873  /* NOTE : This function should not be modified, when the callback is needed,
874  the HAL_DAC_ErrorCallbackCh1 could be implemented in the user file
875  */
876 }
877 
885 {
886  /* Prevent unused argument(s) compilation warning */
887  UNUSED(hdac);
888 
889  /* NOTE : This function should not be modified, when the callback is needed,
890  the HAL_DAC_DMAUnderrunCallbackCh1 could be implemented in the user file
891  */
892 }
893 
923 uint32_t HAL_DAC_GetValue(const DAC_HandleTypeDef *hdac, uint32_t Channel)
924 {
925  uint32_t result = 0;
926 
927  /* Check the DAC peripheral handle */
928  assert_param(hdac != NULL);
929 
930  /* Check the parameters */
931  assert_param(IS_DAC_CHANNEL(Channel));
932 
933  if (Channel == DAC_CHANNEL_1)
934  {
935  result = hdac->Instance->DOR1;
936  }
937 #if defined(DAC_CHANNEL2_SUPPORT)
938  else
939  {
940  result = hdac->Instance->DOR2;
941  }
942 #endif /* DAC_CHANNEL2_SUPPORT */
943  /* Returns the DAC channel data output register value */
944  return result;
945 }
946 
958 HAL_StatusTypeDef HAL_DAC_ConfigChannel(DAC_HandleTypeDef *hdac,
959  const DAC_ChannelConfTypeDef *sConfig, uint32_t Channel)
960 {
961  HAL_StatusTypeDef status = HAL_OK;
962  uint32_t tmpreg1;
963  uint32_t tmpreg2;
964 
965  /* Check the DAC peripheral handle and channel configuration struct */
966  if ((hdac == NULL) || (sConfig == NULL))
967  {
968  return HAL_ERROR;
969  }
970 
971  /* Check the DAC parameters */
972  assert_param(IS_DAC_TRIGGER(sConfig->DAC_Trigger));
973  assert_param(IS_DAC_OUTPUT_BUFFER_STATE(sConfig->DAC_OutputBuffer));
974  assert_param(IS_DAC_CHANNEL(Channel));
975 
976  /* Process locked */
977  __HAL_LOCK(hdac);
978 
979  /* Change DAC state */
980  hdac->State = HAL_DAC_STATE_BUSY;
981 
982  /* Get the DAC CR value */
983  tmpreg1 = hdac->Instance->CR;
984  /* Clear BOFFx, TENx, TSELx, WAVEx and MAMPx bits */
985  tmpreg1 &= ~(((uint32_t)(DAC_CR_MAMP1 | DAC_CR_WAVE1 | DAC_CR_TSEL1 | DAC_CR_TEN1 | DAC_CR_BOFF1))
986  << (Channel & 0x10UL));
987  /* Configure for the selected DAC channel: buffer output, trigger */
988  /* Set TSELx and TENx bits according to DAC_Trigger value */
989  /* Set BOFFx bit according to DAC_OutputBuffer value */
990  tmpreg2 = (sConfig->DAC_Trigger | sConfig->DAC_OutputBuffer);
991  /* Calculate CR register value depending on DAC_Channel */
992  tmpreg1 |= tmpreg2 << (Channel & 0x10UL);
993  /* Write to DAC CR */
994  hdac->Instance->CR = tmpreg1;
995  /* Disable wave generation */
996  CLEAR_BIT(hdac->Instance->CR, (DAC_CR_WAVE1 << (Channel & 0x10UL)));
997 
998  /* Change DAC state */
999  hdac->State = HAL_DAC_STATE_READY;
1000 
1001  /* Process unlocked */
1002  __HAL_UNLOCK(hdac);
1003 
1004  /* Return function status */
1005  return status;
1006 }
1007 
1035 {
1036  /* Return DAC handle state */
1037  return hdac->State;
1038 }
1039 
1040 
1048 {
1049  return hdac->ErrorCode;
1050 }
1051 
1067 #if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
1092  pDAC_CallbackTypeDef pCallback)
1093 {
1094  HAL_StatusTypeDef status = HAL_OK;
1095 
1096  /* Check the DAC peripheral handle */
1097  if (hdac == NULL)
1098  {
1099  return HAL_ERROR;
1100  }
1101 
1102  if (pCallback == NULL)
1103  {
1104  /* Update the error code */
1105  hdac->ErrorCode |= HAL_DAC_ERROR_INVALID_CALLBACK;
1106  return HAL_ERROR;
1107  }
1108 
1109  if (hdac->State == HAL_DAC_STATE_READY)
1110  {
1111  switch (CallbackID)
1112  {
1114  hdac->ConvCpltCallbackCh1 = pCallback;
1115  break;
1117  hdac->ConvHalfCpltCallbackCh1 = pCallback;
1118  break;
1119  case HAL_DAC_CH1_ERROR_ID :
1120  hdac->ErrorCallbackCh1 = pCallback;
1121  break;
1123  hdac->DMAUnderrunCallbackCh1 = pCallback;
1124  break;
1125 #if defined(DAC_CHANNEL2_SUPPORT)
1127  hdac->ConvCpltCallbackCh2 = pCallback;
1128  break;
1130  hdac->ConvHalfCpltCallbackCh2 = pCallback;
1131  break;
1132  case HAL_DAC_CH2_ERROR_ID :
1133  hdac->ErrorCallbackCh2 = pCallback;
1134  break;
1136  hdac->DMAUnderrunCallbackCh2 = pCallback;
1137  break;
1138 #endif /* DAC_CHANNEL2_SUPPORT */
1139  case HAL_DAC_MSPINIT_CB_ID :
1140  hdac->MspInitCallback = pCallback;
1141  break;
1143  hdac->MspDeInitCallback = pCallback;
1144  break;
1145  default :
1146  /* Update the error code */
1147  hdac->ErrorCode |= HAL_DAC_ERROR_INVALID_CALLBACK;
1148  /* update return status */
1149  status = HAL_ERROR;
1150  break;
1151  }
1152  }
1153  else if (hdac->State == HAL_DAC_STATE_RESET)
1154  {
1155  switch (CallbackID)
1156  {
1157  case HAL_DAC_MSPINIT_CB_ID :
1158  hdac->MspInitCallback = pCallback;
1159  break;
1161  hdac->MspDeInitCallback = pCallback;
1162  break;
1163  default :
1164  /* Update the error code */
1165  hdac->ErrorCode |= HAL_DAC_ERROR_INVALID_CALLBACK;
1166  /* update return status */
1167  status = HAL_ERROR;
1168  break;
1169  }
1170  }
1171  else
1172  {
1173  /* Update the error code */
1174  hdac->ErrorCode |= HAL_DAC_ERROR_INVALID_CALLBACK;
1175  /* update return status */
1176  status = HAL_ERROR;
1177  }
1178 
1179  return status;
1180 }
1181 
1204 {
1205  HAL_StatusTypeDef status = HAL_OK;
1206 
1207  /* Check the DAC peripheral handle */
1208  if (hdac == NULL)
1209  {
1210  return HAL_ERROR;
1211  }
1212 
1213  if (hdac->State == HAL_DAC_STATE_READY)
1214  {
1215  switch (CallbackID)
1216  {
1218  hdac->ConvCpltCallbackCh1 = HAL_DAC_ConvCpltCallbackCh1;
1219  break;
1221  hdac->ConvHalfCpltCallbackCh1 = HAL_DAC_ConvHalfCpltCallbackCh1;
1222  break;
1223  case HAL_DAC_CH1_ERROR_ID :
1224  hdac->ErrorCallbackCh1 = HAL_DAC_ErrorCallbackCh1;
1225  break;
1227  hdac->DMAUnderrunCallbackCh1 = HAL_DAC_DMAUnderrunCallbackCh1;
1228  break;
1229 #if defined(DAC_CHANNEL2_SUPPORT)
1231  hdac->ConvCpltCallbackCh2 = HAL_DACEx_ConvCpltCallbackCh2;
1232  break;
1234  hdac->ConvHalfCpltCallbackCh2 = HAL_DACEx_ConvHalfCpltCallbackCh2;
1235  break;
1236  case HAL_DAC_CH2_ERROR_ID :
1237  hdac->ErrorCallbackCh2 = HAL_DACEx_ErrorCallbackCh2;
1238  break;
1240  hdac->DMAUnderrunCallbackCh2 = HAL_DACEx_DMAUnderrunCallbackCh2;
1241  break;
1242 #endif /* DAC_CHANNEL2_SUPPORT */
1243  case HAL_DAC_MSPINIT_CB_ID :
1244  hdac->MspInitCallback = HAL_DAC_MspInit;
1245  break;
1247  hdac->MspDeInitCallback = HAL_DAC_MspDeInit;
1248  break;
1249  case HAL_DAC_ALL_CB_ID :
1250  hdac->ConvCpltCallbackCh1 = HAL_DAC_ConvCpltCallbackCh1;
1251  hdac->ConvHalfCpltCallbackCh1 = HAL_DAC_ConvHalfCpltCallbackCh1;
1252  hdac->ErrorCallbackCh1 = HAL_DAC_ErrorCallbackCh1;
1253  hdac->DMAUnderrunCallbackCh1 = HAL_DAC_DMAUnderrunCallbackCh1;
1254 #if defined(DAC_CHANNEL2_SUPPORT)
1255  hdac->ConvCpltCallbackCh2 = HAL_DACEx_ConvCpltCallbackCh2;
1256  hdac->ConvHalfCpltCallbackCh2 = HAL_DACEx_ConvHalfCpltCallbackCh2;
1257  hdac->ErrorCallbackCh2 = HAL_DACEx_ErrorCallbackCh2;
1258  hdac->DMAUnderrunCallbackCh2 = HAL_DACEx_DMAUnderrunCallbackCh2;
1259 #endif /* DAC_CHANNEL2_SUPPORT */
1260  hdac->MspInitCallback = HAL_DAC_MspInit;
1261  hdac->MspDeInitCallback = HAL_DAC_MspDeInit;
1262  break;
1263  default :
1264  /* Update the error code */
1265  hdac->ErrorCode |= HAL_DAC_ERROR_INVALID_CALLBACK;
1266  /* update return status */
1267  status = HAL_ERROR;
1268  break;
1269  }
1270  }
1271  else if (hdac->State == HAL_DAC_STATE_RESET)
1272  {
1273  switch (CallbackID)
1274  {
1275  case HAL_DAC_MSPINIT_CB_ID :
1276  hdac->MspInitCallback = HAL_DAC_MspInit;
1277  break;
1279  hdac->MspDeInitCallback = HAL_DAC_MspDeInit;
1280  break;
1281  default :
1282  /* Update the error code */
1283  hdac->ErrorCode |= HAL_DAC_ERROR_INVALID_CALLBACK;
1284  /* update return status */
1285  status = HAL_ERROR;
1286  break;
1287  }
1288  }
1289  else
1290  {
1291  /* Update the error code */
1292  hdac->ErrorCode |= HAL_DAC_ERROR_INVALID_CALLBACK;
1293  /* update return status */
1294  status = HAL_ERROR;
1295  }
1296 
1297  return status;
1298 }
1299 #endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
1300 
1320 {
1321  DAC_HandleTypeDef *hdac = (DAC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
1322 
1323 #if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
1324  hdac->ConvCpltCallbackCh1(hdac);
1325 #else
1327 #endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
1328 
1329  hdac->State = HAL_DAC_STATE_READY;
1330 }
1331 
1339 {
1340  DAC_HandleTypeDef *hdac = (DAC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
1341  /* Conversion complete callback */
1342 #if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
1343  hdac->ConvHalfCpltCallbackCh1(hdac);
1344 #else
1346 #endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
1347 }
1348 
1356 {
1357  DAC_HandleTypeDef *hdac = (DAC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
1358 
1359  /* Set DAC error code to DMA error */
1360  hdac->ErrorCode |= HAL_DAC_ERROR_DMA;
1361 
1362 #if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
1363  hdac->ErrorCallbackCh1(hdac);
1364 #else
1366 #endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
1367 
1368  hdac->State = HAL_DAC_STATE_READY;
1369 }
1370 
1379 #endif /* DAC */
1380 
1381 #endif /* HAL_DAC_MODULE_ENABLED */
void HAL_DACEx_ErrorCallbackCh2(DAC_HandleTypeDef *hdac)
Error DAC callback for Channel2.
void HAL_DACEx_ConvHalfCpltCallbackCh2(DAC_HandleTypeDef *hdac)
Conversion half DMA transfer callback in non-blocking mode for Channel2.
void HAL_DACEx_ConvCpltCallbackCh2(DAC_HandleTypeDef *hdac)
Conversion complete callback in non-blocking mode for Channel2.
void HAL_DACEx_DMAUnderrunCallbackCh2(DAC_HandleTypeDef *hdac)
DMA underrun DAC callback for Channel2.
void DAC_DMAHalfConvCpltCh2(DMA_HandleTypeDef *hdma)
DMA half transfer complete callback.
void DAC_DMAConvCpltCh2(DMA_HandleTypeDef *hdma)
DMA conversion complete callback.
void DAC_DMAErrorCh2(DMA_HandleTypeDef *hdma)
DMA error callback.
HAL_StatusTypeDef HAL_DAC_RegisterCallback(DAC_HandleTypeDef *hdac, HAL_DAC_CallbackIDTypeDef CallbackID, pDAC_CallbackTypeDef pCallback)
Register a User DAC Callback To be used instead of the weak (overridden) predefined callback.
void HAL_DAC_MspInit(DAC_HandleTypeDef *hdac)
Initialize the DAC MSP.
HAL_StatusTypeDef HAL_DAC_Init(DAC_HandleTypeDef *hdac)
Initialize the DAC peripheral according to the specified parameters in the DAC_InitStruct and initial...
HAL_StatusTypeDef HAL_DAC_DeInit(DAC_HandleTypeDef *hdac)
Deinitialize the DAC peripheral registers to their default reset values.
void HAL_DAC_MspDeInit(DAC_HandleTypeDef *hdac)
DeInitialize the DAC MSP.
HAL_StatusTypeDef HAL_DAC_UnRegisterCallback(DAC_HandleTypeDef *hdac, HAL_DAC_CallbackIDTypeDef CallbackID)
Unregister a User DAC Callback DAC Callback is redirected to the weak (overridden) predefined callbac...
HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef *hdac, uint32_t Channel)
Disables DAC and stop conversion of channel.
HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef *hdac, uint32_t Channel)
Enables DAC and starts conversion of channel.
void HAL_DAC_ConvHalfCpltCallbackCh1(DAC_HandleTypeDef *hdac)
Conversion half DMA transfer callback in non-blocking mode for Channel1.
HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel)
Disables DAC and stop conversion of channel.
HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data)
Set the specified data holding register value for DAC channel.
HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel, const uint32_t *pData, uint32_t Length, uint32_t Alignment)
Enables DAC and starts conversion of channel.
void HAL_DAC_ErrorCallbackCh1(DAC_HandleTypeDef *hdac)
Error DAC callback for Channel1.
void HAL_DAC_IRQHandler(DAC_HandleTypeDef *hdac)
Handles DAC interrupt request This function uses the interruption of DMA underrun.
void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef *hdac)
Conversion complete callback in non-blocking mode for Channel1.
void HAL_DAC_DMAUnderrunCallbackCh1(DAC_HandleTypeDef *hdac)
DMA underrun DAC callback for channel1.
uint32_t HAL_DAC_GetValue(const DAC_HandleTypeDef *hdac, uint32_t Channel)
Returns the last data output value of the selected DAC channel.
HAL_StatusTypeDef HAL_DAC_ConfigChannel(DAC_HandleTypeDef *hdac, const DAC_ChannelConfTypeDef *sConfig, uint32_t Channel)
Configures the selected DAC channel.
HAL_DAC_StateTypeDef HAL_DAC_GetState(const DAC_HandleTypeDef *hdac)
return the DAC handle state
uint32_t HAL_DAC_GetError(const DAC_HandleTypeDef *hdac)
Return the DAC error code.
void(* pDAC_CallbackTypeDef)(DAC_HandleTypeDef *hdac)
HAL DAC Callback pointer definition.
struct __DAC_HandleTypeDef else typedef struct endif DAC_HandleTypeDef
DAC handle Structure definition.
HAL_DAC_CallbackIDTypeDef
HAL DAC Callback ID enumeration definition.
HAL_DAC_StateTypeDef
HAL State structures definition.
@ HAL_DAC_MSPDEINIT_CB_ID
@ HAL_DAC_CH1_HALF_COMPLETE_CB_ID
@ HAL_DAC_CH2_ERROR_ID
@ HAL_DAC_CH2_HALF_COMPLETE_CB_ID
@ HAL_DAC_ALL_CB_ID
@ HAL_DAC_CH2_UNDERRUN_CB_ID
@ HAL_DAC_CH1_UNDERRUN_CB_ID
@ HAL_DAC_CH1_COMPLETE_CB_ID
@ HAL_DAC_MSPINIT_CB_ID
@ HAL_DAC_CH2_COMPLETE_CB_ID
@ HAL_DAC_CH1_ERROR_ID
@ HAL_DAC_STATE_READY
@ HAL_DAC_STATE_RESET
@ HAL_DAC_STATE_ERROR
@ HAL_DAC_STATE_BUSY
DAC Configuration regular Channel structure definition.
void DAC_DMAConvCpltCh1(DMA_HandleTypeDef *hdma)
DMA conversion complete callback.
void DAC_DMAHalfConvCpltCh1(DMA_HandleTypeDef *hdma)
DMA half transfer complete callback.
void DAC_DMAErrorCh1(DMA_HandleTypeDef *hdma)
DMA error callback.
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer.
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
Start the DMA Transfer with interrupt enabled.
This file contains all the functions prototypes for the HAL module driver.
DMA handle Structure definition.