Restructure libs source to support multi platform
[fw/stlink] / example / libs_stm / src / stm32l1xx / stm32l1xx_dac.c
diff --git a/example/libs_stm/src/stm32l1xx/stm32l1xx_dac.c b/example/libs_stm/src/stm32l1xx/stm32l1xx_dac.c
new file mode 100644 (file)
index 0000000..dcc59c9
--- /dev/null
@@ -0,0 +1,690 @@
+/**\r
+  ******************************************************************************\r
+  * @file    stm32l1xx_dac.c\r
+  * @author  MCD Application Team\r
+  * @version V1.0.0\r
+  * @date    31-December-2010\r
+  * @brief   This file provides firmware functions to manage the following \r
+  *          functionalities of the Digital-to-Analog Converter (DAC) peripheral: \r
+  *           - DAC channels configuration: trigger, output buffer, data format\r
+  *           - DMA management      \r
+  *           - Interrupts and flags management\r
+  *\r
+  *  @verbatim\r
+  *    \r
+  *          ===================================================================\r
+  *                             DAC Peripheral features\r
+  *          ===================================================================\r
+  *          The device integrates two 12-bit Digital Analog Converters that can \r
+  *          be used independently or simultaneously (dual mode):\r
+  *            1- DAC channel1 with DAC_OUT1 (PA4) as output\r
+  *            1- DAC channel2 with DAC_OUT2 (PA5) as output\r
+  *\r
+  *          Digital to Analog conversion can be non-triggered using DAC_Trigger_None\r
+  *          and DAC_OUT1/DAC_OUT2 is available once writing to DHRx register using \r
+  *          DAC_SetChannel1Data()/DAC_SetChannel2Data.\r
+  *   \r
+  *         Digital to Analog conversion can be triggered by:\r
+  *             1- External event: EXTI Line 9 (any GPIOx_Pin9) using DAC_Trigger_Ext_IT9.\r
+  *                The used pin (GPIOx_Pin9) must be configured in input mode.\r
+  *\r
+  *             2- Timers TRGO: TIM2, TIM4, TIM6, TIM7 and TIM9 \r
+  *                (DAC_Trigger_T2_TRGO, DAC_Trigger_T4_TRGO...)\r
+  *                The timer TRGO event should be selected using TIM_SelectOutputTrigger()\r
+  *\r
+  *             3- Software using DAC_Trigger_Software\r
+  *\r
+  *          Each DAC channel integrates an output buffer that can be used to \r
+  *          reduce the output impedance, and to drive external loads directly\r
+  *          without having to add an external operational amplifier.\r
+  *          To enable, the output buffer use  \r
+  *              DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;\r
+  *          \r
+  *          Refer to the device datasheet for more details about output impedance\r
+  *          value with and without output buffer.\r
+  *\r
+  *          Both DAC channels can be used to generate\r
+  *             1- Noise wave using DAC_WaveGeneration_Noise\r
+  *             2- Triangle wave using DAC_WaveGeneration_Triangle\r
+  *        \r
+  *          Wave generation can be disabled using DAC_WaveGeneration_None\r
+  *\r
+  *          The DAC data format can be:\r
+  *             1- 8-bit right alignment using DAC_Align_8b_R\r
+  *             2- 12-bit left alignment using DAC_Align_12b_L\r
+  *             3- 12-bit right alignment using DAC_Align_12b_R\r
+  *\r
+  *          The analog output voltage on each DAC channel pin is determined\r
+  *          by the following equation: DAC_OUTx = VREF+ * DOR / 4095\r
+  *             with  DOR is the Data Output Register\r
+  *                   VEF+ is the input voltage reference (refer to the device datasheet)\r
+  *          e.g. To set DAC_OUT1 to 0.7V, use\r
+  *            DAC_SetChannel1Data(DAC_Align_12b_R, 868);\r
+  *          Assuming that VREF+ = 3.3, DAC_OUT1 = (3.3 * 868) / 4095 = 0.7V\r
+  *\r
+  *          A DMA1 request can be generated when an external trigger (but not\r
+  *          a software trigger) occurs if DMA1 requests are enabled using\r
+  *          DAC_DMACmd()\r
+  *          DMA1 requests are mapped as following:\r
+  *             1- DAC channel1 is mapped on DMA1 channel3 which must be already \r
+  *                configured\r
+  *             2- DAC channel2 is mapped on DMA1 channel4 which must be already \r
+  *                configured\r
+  *\r
+  *          ===================================================================      \r
+  *                              How to use this driver \r
+  *          ===================================================================          \r
+  *            - DAC APB clock must be enabled to get write access to DAC\r
+  *              registers using\r
+  *              RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE)\r
+  *            - Configure DAC_OUTx (DAC_OUT1: PA4, DAC_OUT2: PA5) in analog mode.\r
+  *            - Configure the DAC channel using DAC_Init()\r
+  *            - Enable the DAC channel using DAC_Cmd()\r
+  * \r
+  *  @endverbatim\r
+  *    \r
+  ******************************************************************************\r
+  * @attention\r
+  *\r
+  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS\r
+  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE\r
+  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY\r
+  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING\r
+  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE\r
+  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.\r
+  *\r
+  * <h2><center>&copy; COPYRIGHT 2010 STMicroelectronics</center></h2>\r
+  ******************************************************************************  \r
+  */ \r
+\r
+/* Includes ------------------------------------------------------------------*/\r
+#include "stm32l1xx_dac.h"\r
+#include "stm32l1xx_rcc.h"\r
+\r
+/** @addtogroup STM32L1xx_StdPeriph_Driver\r
+  * @{\r
+  */\r
+\r
+/** @defgroup DAC \r
+  * @brief DAC driver modules\r
+  * @{\r
+  */ \r
+\r
+/* Private typedef -----------------------------------------------------------*/\r
+/* Private define ------------------------------------------------------------*/\r
+/* CR register Mask */\r
+#define CR_CLEAR_MASK              ((uint32_t)0x00000FFE)\r
+\r
+/* DAC Dual Channels SWTRIG masks */\r
+#define DUAL_SWTRIG_SET            ((uint32_t)0x00000003)\r
+#define DUAL_SWTRIG_RESET          ((uint32_t)0xFFFFFFFC)\r
+\r
+/* DHR registers offsets */\r
+#define DHR12R1_OFFSET             ((uint32_t)0x00000008)\r
+#define DHR12R2_OFFSET             ((uint32_t)0x00000014)\r
+#define DHR12RD_OFFSET             ((uint32_t)0x00000020)\r
+\r
+/* DOR register offset */\r
+#define DOR_OFFSET                 ((uint32_t)0x0000002C)\r
+\r
+/* Private macro -------------------------------------------------------------*/\r
+/* Private variables ---------------------------------------------------------*/\r
+/* Private function prototypes -----------------------------------------------*/\r
+/* Private functions ---------------------------------------------------------*/\r
+\r
+/** @defgroup DAC_Private_Functions\r
+  * @{\r
+  */ \r
+\r
+/** @defgroup DAC_Group1 DAC channels configuration\r
+ *  @brief   DAC channels configuration: trigger, output buffer, data format \r
+ *\r
+@verbatim   \r
+ ===============================================================================\r
+          DAC channels configuration: trigger, output buffer, data format\r
+ ===============================================================================  \r
+\r
+@endverbatim\r
+  * @{\r
+  */\r
+\r
+/**\r
+  * @brief  Deinitializes the DAC peripheral registers to their default reset values.\r
+  * @param  None\r
+  * @retval None\r
+  */\r
+void DAC_DeInit(void)\r
+{\r
+  /* Enable DAC reset state */\r
+  RCC_APB1PeriphResetCmd(RCC_APB1Periph_DAC, ENABLE);\r
+  /* Release DAC from reset state */\r
+  RCC_APB1PeriphResetCmd(RCC_APB1Periph_DAC, DISABLE);\r
+}\r
+\r
+/**\r
+  * @brief  Initializes the DAC peripheral according to the specified \r
+  *         parameters in the DAC_InitStruct.\r
+  * @param  DAC_Channel: the selected DAC channel. \r
+  *   This parameter can be one of the following values:\r
+  *     @arg DAC_Channel_1: DAC Channel1 selected\r
+  *     @arg DAC_Channel_2: DAC Channel2 selected\r
+  * @param  DAC_InitStruct: pointer to a DAC_InitTypeDef structure that\r
+  *         contains the configuration information for the specified DAC channel.\r
+  *         DAC_Trigger selects the trigger source: EXTI Line 9, TIM2, TIM4....\r
+  *         DAC_WaveGeneration selects the waveform to be generated: noise, triangle\r
+  *         DAC_LFSRUnmask_TriangleAmplitude \r
+  *             defines the LFSR when noise waveform is selected by DAC_WaveGeneration\r
+  *             or defines the amplitude of the triangle waveform when it is \r
+  *             selected by DAC_WaveGeneration\r
+  *         DAC_OutputBuffer enables/disables the output buffer on DAC_OUTx\r
+  * @retval None\r
+  */\r
+void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct)\r
+{\r
+  uint32_t tmpreg1 = 0, tmpreg2 = 0;\r
+\r
+  /* Check the DAC parameters */\r
+  assert_param(IS_DAC_TRIGGER(DAC_InitStruct->DAC_Trigger));\r
+  assert_param(IS_DAC_GENERATE_WAVE(DAC_InitStruct->DAC_WaveGeneration));\r
+  assert_param(IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude));\r
+  assert_param(IS_DAC_OUTPUT_BUFFER_STATE(DAC_InitStruct->DAC_OutputBuffer));\r
+\r
+/*---------------------------- DAC CR Configuration --------------------------*/\r
+  /* Get the DAC CR value */\r
+  tmpreg1 = DAC->CR;\r
+  /* Clear BOFFx, TENx, TSELx, WAVEx and MAMPx bits */\r
+  tmpreg1 &= ~(CR_CLEAR_MASK << DAC_Channel);\r
+  /* Configure for the selected DAC channel: buffer output, trigger, wave generation,\r
+     mask/amplitude for wave generation */\r
+  /* Set TSELx and TENx bits according to DAC_Trigger value */\r
+  /* Set WAVEx bits according to DAC_WaveGeneration value */\r
+  /* Set MAMPx bits according to DAC_LFSRUnmask_TriangleAmplitude value */ \r
+  /* Set BOFFx bit according to DAC_OutputBuffer value */   \r
+  tmpreg2 = (DAC_InitStruct->DAC_Trigger | DAC_InitStruct->DAC_WaveGeneration |\r
+             DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude | DAC_InitStruct->DAC_OutputBuffer);\r
+  /* Calculate CR register value depending on DAC_Channel */\r
+  tmpreg1 |= tmpreg2 << DAC_Channel;\r
+  /* Write to DAC CR */\r
+  DAC->CR = tmpreg1;\r
+}\r
+\r
+/**\r
+  * @brief  Fills each DAC_InitStruct member with its default value.\r
+  * @param  DAC_InitStruct : pointer to a DAC_InitTypeDef structure which will \r
+  *         be initialized.\r
+  * @retval None\r
+  */\r
+void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct)\r
+{\r
+/*--------------- Reset DAC init structure parameters values -----------------*/\r
+  /* Initialize the DAC_Trigger member */\r
+  DAC_InitStruct->DAC_Trigger = DAC_Trigger_None;\r
+  /* Initialize the DAC_WaveGeneration member */\r
+  DAC_InitStruct->DAC_WaveGeneration = DAC_WaveGeneration_None;\r
+  /* Initialize the DAC_LFSRUnmask_TriangleAmplitude member */\r
+  DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;\r
+  /* Initialize the DAC_OutputBuffer member */\r
+  DAC_InitStruct->DAC_OutputBuffer = DAC_OutputBuffer_Enable;\r
+}\r
+\r
+/**\r
+  * @brief  Enables or disables the specified DAC channel.\r
+  * @param  DAC_Channel: The selected DAC channel. \r
+  *   This parameter can be one of the following values:\r
+  *     @arg DAC_Channel_1: DAC Channel1 selected\r
+  *     @arg DAC_Channel_2: DAC Channel2 selected\r
+  * @param  NewState: new state of the DAC channel. \r
+  *      This parameter can be: ENABLE or DISABLE.\r
+  * @note When the DAC channel is enabled the trigger source can no more\r
+  *       be modified.\r
+  * @retval None\r
+  */\r
+void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState)\r
+{\r
+  /* Check the parameters */\r
+  assert_param(IS_DAC_CHANNEL(DAC_Channel));\r
+  assert_param(IS_FUNCTIONAL_STATE(NewState));\r
+\r
+  if (NewState != DISABLE)\r
+  {\r
+    /* Enable the selected DAC channel */\r
+    DAC->CR |= (DAC_CR_EN1 << DAC_Channel);\r
+  }\r
+  else\r
+  {\r
+    /* Disable the selected DAC channel */\r
+    DAC->CR &= (~(DAC_CR_EN1 << DAC_Channel));\r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Enables or disables the selected DAC channel software trigger.\r
+  * @param  DAC_Channel: the selected DAC channel. \r
+  *   This parameter can be one of the following values:\r
+  *     @arg DAC_Channel_1: DAC Channel1 selected\r
+  *     @arg DAC_Channel_2: DAC Channel2 selected\r
+  * @param  NewState: new state of the selected DAC channel software trigger.\r
+  *   This parameter can be: ENABLE or DISABLE.\r
+  * @retval None\r
+  */\r
+void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState)\r
+{\r
+  /* Check the parameters */\r
+  assert_param(IS_DAC_CHANNEL(DAC_Channel));\r
+  assert_param(IS_FUNCTIONAL_STATE(NewState));\r
+\r
+  if (NewState != DISABLE)\r
+  {\r
+    /* Enable software trigger for the selected DAC channel */\r
+    DAC->SWTRIGR |= (uint32_t)DAC_SWTRIGR_SWTRIG1 << (DAC_Channel >> 4);\r
+  }\r
+  else\r
+  {\r
+    /* Disable software trigger for the selected DAC channel */\r
+    DAC->SWTRIGR &= ~((uint32_t)DAC_SWTRIGR_SWTRIG1 << (DAC_Channel >> 4));\r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Enables or disables simultaneously the two DAC channels software\r
+  *         triggers.\r
+  * @param  NewState: new state of the DAC channels software triggers.\r
+  *   This parameter can be: ENABLE or DISABLE.\r
+  * @retval None\r
+  */\r
+void DAC_DualSoftwareTriggerCmd(FunctionalState NewState)\r
+{\r
+  /* Check the parameters */\r
+  assert_param(IS_FUNCTIONAL_STATE(NewState));\r
+\r
+  if (NewState != DISABLE)\r
+  {\r
+    /* Enable software trigger for both DAC channels */\r
+    DAC->SWTRIGR |= DUAL_SWTRIG_SET;\r
+  }\r
+  else\r
+  {\r
+    /* Disable software trigger for both DAC channels */\r
+    DAC->SWTRIGR &= DUAL_SWTRIG_RESET;\r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Enables or disables the selected DAC channel wave generation.\r
+  * @param  DAC_Channel: the selected DAC channel. \r
+  *   This parameter can be one of the following values:\r
+  *     @arg DAC_Channel_1: DAC Channel1 selected\r
+  *     @arg DAC_Channel_2: DAC Channel2 selected\r
+  * @param  DAC_Wave: Specifies the wave type to enable or disable.\r
+  *   This parameter can be one of the following values:\r
+  *     @arg DAC_Wave_Noise: noise wave generation\r
+  *     @arg DAC_Wave_Triangle: triangle wave generation\r
+  * @param  NewState: new state of the selected DAC channel wave generation.\r
+  *   This parameter can be: ENABLE or DISABLE.\r
+  * @note   \r
+  * @retval None\r
+  */\r
+void DAC_WaveGenerationCmd(uint32_t DAC_Channel, uint32_t DAC_Wave, FunctionalState NewState)\r
+{\r
+  /* Check the parameters */\r
+  assert_param(IS_DAC_CHANNEL(DAC_Channel));\r
+  assert_param(IS_DAC_WAVE(DAC_Wave)); \r
+  assert_param(IS_FUNCTIONAL_STATE(NewState));\r
+\r
+  if (NewState != DISABLE)\r
+  {\r
+    /* Enable the selected wave generation for the selected DAC channel */\r
+    DAC->CR |= DAC_Wave << DAC_Channel;\r
+  }\r
+  else\r
+  {\r
+    /* Disable the selected wave generation for the selected DAC channel */\r
+    DAC->CR &= ~(DAC_Wave << DAC_Channel);\r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Set the specified data holding register value for DAC channel1.\r
+  * @param  DAC_Align: Specifies the data alignment for DAC channel1.\r
+  *   This parameter can be one of the following values:\r
+  *     @arg DAC_Align_8b_R: 8bit right data alignment selected\r
+  *     @arg DAC_Align_12b_L: 12bit left data alignment selected\r
+  *     @arg DAC_Align_12b_R: 12bit right data alignment selected\r
+  * @param  Data : Data to be loaded in the selected data holding register.\r
+  * @retval None\r
+  */\r
+void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data)\r
+{  \r
+  __IO uint32_t tmp = 0;\r
+  \r
+  /* Check the parameters */\r
+  assert_param(IS_DAC_ALIGN(DAC_Align));\r
+  assert_param(IS_DAC_DATA(Data));\r
+  \r
+  tmp = (uint32_t)DAC_BASE; \r
+  tmp += DHR12R1_OFFSET + DAC_Align;\r
+\r
+  /* Set the DAC channel1 selected data holding register */\r
+  *(__IO uint32_t *) tmp = Data;\r
+}\r
+\r
+/**\r
+  * @brief  Set the specified data holding register value for DAC channel2.\r
+  * @param  DAC_Align: Specifies the data alignment for DAC channel2.\r
+  *   This parameter can be one of the following values:\r
+  *     @arg DAC_Align_8b_R: 8bit right data alignment selected\r
+  *     @arg DAC_Align_12b_L: 12bit left data alignment selected\r
+  *     @arg DAC_Align_12b_R: 12bit right data alignment selected\r
+  * @param  Data : Data to be loaded in the selected data holding register.\r
+  * @retval None\r
+  */\r
+void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data)\r
+{\r
+  __IO uint32_t tmp = 0;\r
+\r
+  /* Check the parameters */\r
+  assert_param(IS_DAC_ALIGN(DAC_Align));\r
+  assert_param(IS_DAC_DATA(Data));\r
+  \r
+  tmp = (uint32_t)DAC_BASE;\r
+  tmp += DHR12R2_OFFSET + DAC_Align;\r
+\r
+  /* Set the DAC channel2 selected data holding register */\r
+  *(__IO uint32_t *)tmp = Data;\r
+}\r
+\r
+/**\r
+  * @brief  Set the specified data holding register value for dual channel DAC.\r
+  * @param  DAC_Align: Specifies the data alignment for dual channel DAC.\r
+  *   This parameter can be one of the following values:\r
+  *     @arg DAC_Align_8b_R: 8bit right data alignment selected\r
+  *     @arg DAC_Align_12b_L: 12bit left data alignment selected\r
+  *     @arg DAC_Align_12b_R: 12bit right data alignment selected\r
+  * @param  Data2: Data for DAC Channel2 to be loaded in the selected data \r
+  *         holding register.\r
+  * @param  Data1: Data for DAC Channel1 to be loaded in the selected data \r
+  *         holding register.\r
+  * @note In dual mode, a unique register access is required to write in both\r
+  *       DAC channels at the same time.\r
+  * @retval None\r
+  */\r
+void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1)\r
+{\r
+  uint32_t data = 0, tmp = 0;\r
+  \r
+  /* Check the parameters */\r
+  assert_param(IS_DAC_ALIGN(DAC_Align));\r
+  assert_param(IS_DAC_DATA(Data1));\r
+  assert_param(IS_DAC_DATA(Data2));\r
+  \r
+  /* Calculate and set dual DAC data holding register value */\r
+  if (DAC_Align == DAC_Align_8b_R)\r
+  {\r
+    data = ((uint32_t)Data2 << 8) | Data1; \r
+  }\r
+  else\r
+  {\r
+    data = ((uint32_t)Data2 << 16) | Data1;\r
+  }\r
+  \r
+  tmp = (uint32_t)DAC_BASE;\r
+  tmp += DHR12RD_OFFSET + DAC_Align;\r
+\r
+  /* Set the dual DAC selected data holding register */\r
+  *(__IO uint32_t *)tmp = data;\r
+}\r
+\r
+/**\r
+  * @brief  Returns the last data output value of the selected DAC channel.\r
+  * @param  DAC_Channel: the selected DAC channel. \r
+  *   This parameter can be one of the following values:\r
+  *     @arg DAC_Channel_1: DAC Channel1 selected\r
+  *     @arg DAC_Channel_2: DAC Channel2 selected\r
+  * @retval The selected DAC channel data output value.\r
+  */\r
+uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel)\r
+{\r
+  __IO uint32_t tmp = 0;\r
+  \r
+  /* Check the parameters */\r
+  assert_param(IS_DAC_CHANNEL(DAC_Channel));\r
+  \r
+  tmp = (uint32_t) DAC_BASE ;\r
+  tmp += DOR_OFFSET + ((uint32_t)DAC_Channel >> 2);\r
+  \r
+  /* Returns the DAC channel data output register value */\r
+  return (uint16_t) (*(__IO uint32_t*) tmp);\r
+}\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup DAC_Group2 DMA management functions\r
+ *  @brief   DMA management functions\r
+ *\r
+@verbatim   \r
+ ===============================================================================\r
+                          DMA management functions\r
+ ===============================================================================  \r
+\r
+@endverbatim\r
+  * @{\r
+  */\r
+\r
+/**\r
+  * @brief  Enables or disables the specified DAC channel DMA request.\r
+  *         When enabled DMA1 is generated when an external trigger (EXTI Line9,\r
+  *         TIM2, TIM4, TIM6, TIM7 or TIM9  but not a software trigger) occurs\r
+  * @param  DAC_Channel: the selected DAC channel.\r
+  *   This parameter can be one of the following values:\r
+  *     @arg DAC_Channel_1: DAC Channel1 selected\r
+  *     @arg DAC_Channel_2: DAC Channel2 selected\r
+  * @param  NewState: new state of the selected DAC channel DMA request.\r
+  *   This parameter can be: ENABLE or DISABLE.\r
+  *  The DAC channel1 (channel2) is mapped on DMA1 channel3 (channel4) which \r
+  *  must be already configured. \r
+  * @retval None\r
+  */\r
+void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState)\r
+{\r
+  /* Check the parameters */\r
+  assert_param(IS_DAC_CHANNEL(DAC_Channel));\r
+  assert_param(IS_FUNCTIONAL_STATE(NewState));\r
+\r
+  if (NewState != DISABLE)\r
+  {\r
+    /* Enable the selected DAC channel DMA request */\r
+    DAC->CR |= (DAC_CR_DMAEN1 << DAC_Channel);\r
+  }\r
+  else\r
+  {\r
+    /* Disable the selected DAC channel DMA request */\r
+    DAC->CR &= (~(DAC_CR_DMAEN1 << DAC_Channel));\r
+  }\r
+}\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup DAC_Group3 Interrupts and flags management functions\r
+ *  @brief   Interrupts and flags management functions\r
+ *\r
+@verbatim   \r
+ ===============================================================================\r
+                   Interrupts and flags management functions\r
+ ===============================================================================  \r
+\r
+@endverbatim\r
+  * @{\r
+  */\r
+\r
+/**\r
+  * @brief  Enables or disables the specified DAC interrupts.\r
+  * @param  DAC_Channel: the selected DAC channel. \r
+  *   This parameter can be one of the following values:\r
+  *     @arg DAC_Channel_1: DAC Channel1 selected\r
+  *     @arg DAC_Channel_2: DAC Channel2 selected\r
+  * @param  DAC_IT: specifies the DAC interrupt sources to be enabled or disabled. \r
+  *   This parameter can be the following values:\r
+  *     @arg DAC_IT_DMAUDR: DMA underrun interrupt mask\r
+  * @note The DMA underrun occurs when a second external trigger arrives before\r
+  *       the acknowledgement for the first external trigger is received (first request).\r
+  * @param  NewState: new state of the specified DAC interrupts.\r
+  *   This parameter can be: ENABLE or DISABLE.\r
+  * @retval None\r
+  */ \r
+void DAC_ITConfig(uint32_t DAC_Channel, uint32_t DAC_IT, FunctionalState NewState)  \r
+{\r
+  /* Check the parameters */\r
+  assert_param(IS_DAC_CHANNEL(DAC_Channel));\r
+  assert_param(IS_FUNCTIONAL_STATE(NewState));\r
+  assert_param(IS_DAC_IT(DAC_IT)); \r
+\r
+  if (NewState != DISABLE)\r
+  {\r
+    /* Enable the selected DAC interrupts */\r
+    DAC->CR |=  (DAC_IT << DAC_Channel);\r
+  }\r
+  else\r
+  {\r
+    /* Disable the selected DAC interrupts */\r
+    DAC->CR &= (~(uint32_t)(DAC_IT << DAC_Channel));\r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Checks whether the specified DAC flag is set or not.\r
+  * @param  DAC_Channel: thee selected DAC channel. \r
+  *   This parameter can be one of the following values:\r
+  *     @arg DAC_Channel_1: DAC Channel1 selected\r
+  *     @arg DAC_Channel_2: DAC Channel2 selected\r
+  * @param  DAC_FLAG: specifies the flag to check. \r
+  *   This parameter can be only of the following value:\r
+  *     @arg DAC_FLAG_DMAUDR: DMA underrun flag\r
+  * @note The DMA underrun occurs when a second external trigger arrives before\r
+  *       the acknowledgement for the first external trigger is received (first request).\r
+  * @retval The new state of DAC_FLAG (SET or RESET).\r
+  */\r
+FlagStatus DAC_GetFlagStatus(uint32_t DAC_Channel, uint32_t DAC_FLAG)\r
+{\r
+  FlagStatus bitstatus = RESET;\r
+  /* Check the parameters */\r
+  assert_param(IS_DAC_CHANNEL(DAC_Channel));\r
+  assert_param(IS_DAC_FLAG(DAC_FLAG));\r
+\r
+  /* Check the status of the specified DAC flag */\r
+  if ((DAC->SR & (DAC_FLAG << DAC_Channel)) != (uint8_t)RESET)\r
+  {\r
+    /* DAC_FLAG is set */\r
+    bitstatus = SET;\r
+  }\r
+  else\r
+  {\r
+    /* DAC_FLAG is reset */\r
+    bitstatus = RESET;\r
+  }\r
+  /* Return the DAC_FLAG status */\r
+  return  bitstatus;\r
+}\r
+\r
+/**\r
+  * @brief  Clears the DAC channel's pending flags.\r
+  * @param  DAC_Channel: the selected DAC channel. \r
+  *   This parameter can be one of the following values:\r
+  *     @arg DAC_Channel_1: DAC Channel1 selected\r
+  *     @arg DAC_Channel_2: DAC Channel2 selected\r
+  * @param  DAC_FLAG: specifies the flag to clear. \r
+  *   This parameter can be of the following value:\r
+  *     @arg DAC_FLAG_DMAUDR: DMA underrun flag                          \r
+  * @retval None\r
+  */\r
+void DAC_ClearFlag(uint32_t DAC_Channel, uint32_t DAC_FLAG)\r
+{\r
+  /* Check the parameters */\r
+  assert_param(IS_DAC_CHANNEL(DAC_Channel));\r
+  assert_param(IS_DAC_FLAG(DAC_FLAG));\r
+\r
+  /* Clear the selected DAC flags */\r
+  DAC->SR = (DAC_FLAG << DAC_Channel);\r
+}\r
+\r
+/**\r
+  * @brief  Checks whether the specified DAC interrupt has occurred or not.\r
+  * @param  DAC_Channel: the selected DAC channel. \r
+  *   This parameter can be one of the following values:\r
+  *     @arg DAC_Channel_1: DAC Channel1 selected\r
+  *     @arg DAC_Channel_2: DAC Channel2 selected\r
+  * @param  DAC_IT: specifies the DAC interrupt source to check. \r
+  *   This parameter can be the following values:\r
+  *     @arg DAC_IT_DMAUDR: DMA underrun interrupt mask\r
+  * @note The DMA underrun occurs when a second external trigger arrives before\r
+  *       the acknowledgement for the first external trigger is received (first request).\r
+  * @retval The new state of DAC_IT (SET or RESET).\r
+  */\r
+ITStatus DAC_GetITStatus(uint32_t DAC_Channel, uint32_t DAC_IT)\r
+{\r
+  ITStatus bitstatus = RESET;\r
+  uint32_t enablestatus = 0;\r
+  \r
+  /* Check the parameters */\r
+  assert_param(IS_DAC_CHANNEL(DAC_Channel));\r
+  assert_param(IS_DAC_IT(DAC_IT));\r
+\r
+  /* Get the DAC_IT enable bit status */\r
+  enablestatus = (DAC->CR & (DAC_IT << DAC_Channel)) ;\r
+  \r
+  /* Check the status of the specified DAC interrupt */\r
+  if (((DAC->SR & (DAC_IT << DAC_Channel)) != (uint32_t)RESET) && enablestatus)\r
+  {\r
+    /* DAC_IT is set */\r
+    bitstatus = SET;\r
+  }\r
+  else\r
+  {\r
+    /* DAC_IT is reset */\r
+    bitstatus = RESET;\r
+  }\r
+  /* Return the DAC_IT status */\r
+  return  bitstatus;\r
+}\r
+\r
+/**\r
+  * @brief  Clears the DAC channel\92s interrupt pending bits.\r
+  * @param  DAC_Channel: the selected DAC channel. \r
+  *   This parameter can be one of the following values:\r
+  *     @arg DAC_Channel_1: DAC Channel1 selected\r
+  *     @arg DAC_Channel_2: DAC Channel2 selected\r
+  * @param  DAC_IT: specifies the DAC interrupt pending bit to clear.\r
+  *   This parameter can be the following values:\r
+  *     @arg DAC_IT_DMAUDR: DMA underrun interrupt mask                         \r
+  * @retval None\r
+  */\r
+void DAC_ClearITPendingBit(uint32_t DAC_Channel, uint32_t DAC_IT)\r
+{\r
+  /* Check the parameters */\r
+  assert_param(IS_DAC_CHANNEL(DAC_Channel));\r
+  assert_param(IS_DAC_IT(DAC_IT)); \r
+\r
+  /* Clear the selected DAC interrupt pending bits */\r
+  DAC->SR = (DAC_IT << DAC_Channel);\r
+}\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/\r