Subversion Repositories ScreenTimer

Rev

Blame | Last modification | View Log | Download | RSS feed

  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.   @verbatim      
  11.   ==============================================================================
  12.                       ##### How to use this driver #####
  13.   ==============================================================================
  14.     [..]          
  15.       (+) When Dual mode is enabled (i.e. DAC Channel1 and Channel2 are used simultaneously) :
  16.           Use HAL_DACEx_DualGetValue() to get digital data to be converted and use
  17.           HAL_DACEx_DualSetValue() to set digital value to converted simultaneously in Channel 1 and Channel 2.  
  18.       (+) Use HAL_DACEx_TriangleWaveGenerate() to generate Triangle signal.
  19.       (+) Use HAL_DACEx_NoiseWaveGenerate() to generate Noise signal.
  20.    
  21.  @endverbatim    
  22.   ******************************************************************************
  23.   * @attention
  24.   *
  25.   * <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.
  26.   * All rights reserved.</center></h2>
  27.   *
  28.   * This software component is licensed by ST under BSD 3-Clause license,
  29.   * the "License"; You may not use this file except in compliance with the
  30.   * License. You may obtain a copy of the License at:
  31.   *                        opensource.org/licenses/BSD-3-Clause
  32.   *
  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.   */
  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.   */
  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.   */
  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.   */
  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.   */
  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.   */
  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.  
  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.   */
  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.   */
  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.   */
  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.   */
  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.   */
  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.   */
  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.   */
  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.   */
  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.   */
  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.   */
  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.   */
  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.   */
  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.   */
  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.   */
  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.   */
  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.   */
  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.   */
  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.   */
  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. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
  1184.