STM32L443xx HAL User Manual
stm32l4xx_ll_dac.c
Go to the documentation of this file.
00001 /**
00002   ******************************************************************************
00003   * @file    stm32l4xx_ll_dac.c
00004   * @author  MCD Application Team
00005   * @brief   DAC LL module driver
00006   ******************************************************************************
00007   * @attention
00008   *
00009   * Copyright (c) 2017 STMicroelectronics.
00010   * All rights reserved.
00011   *
00012   * This software is licensed under terms that can be found in the LICENSE file
00013   * in the root directory of this software component.
00014   * If no LICENSE file comes with this software, it is provided AS-IS.
00015   *
00016   ******************************************************************************
00017   */
00018 #if defined(USE_FULL_LL_DRIVER)
00019 
00020 /* Includes ------------------------------------------------------------------*/
00021 #include "stm32l4xx_ll_dac.h"
00022 #include "stm32l4xx_ll_bus.h"
00023 
00024 #ifdef USE_FULL_ASSERT
00025   #include "stm32_assert.h"
00026 #else
00027   #define assert_param(expr) ((void)0U)
00028 #endif
00029 
00030 /** @addtogroup STM32L4xx_LL_Driver
00031   * @{
00032   */
00033 
00034 #if defined (DAC1)
00035 
00036 /** @addtogroup DAC_LL DAC
00037   * @{
00038   */
00039 
00040 /* Private types -------------------------------------------------------------*/
00041 /* Private variables ---------------------------------------------------------*/
00042 /* Private constants ---------------------------------------------------------*/
00043 /* Private macros ------------------------------------------------------------*/
00044 
00045 /** @addtogroup DAC_LL_Private_Macros
00046   * @{
00047   */
00048 
00049 #if defined(DAC_CHANNEL2_SUPPORT)
00050 #define IS_LL_DAC_CHANNEL(__DAC_CHANNEL__)                                     \
00051   (                                                                            \
00052       ((__DAC_CHANNEL__) == LL_DAC_CHANNEL_1)                                  \
00053    || ((__DAC_CHANNEL__) == LL_DAC_CHANNEL_2)                                  \
00054   )
00055 #else
00056 #define IS_LL_DAC_CHANNEL(__DAC_CHANNEL__)                                     \
00057   (                                                                            \
00058    ((__DAC_CHANNEL__) == LL_DAC_CHANNEL_1)                                     \
00059   )
00060 #endif /* DAC_CHANNEL2_SUPPORT */
00061 
00062 #if defined (DAC_CR_TSEL1_3)
00063 #define IS_LL_DAC_TRIGGER_SOURCE(__TRIGGER_SOURCE__)                           \
00064   (   ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM1_TRGO)                      \
00065    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM2_TRGO)                      \
00066    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM4_TRGO)                      \
00067    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM5_TRGO)                      \
00068    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM6_TRGO)                      \
00069    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM7_TRGO)                      \
00070    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM8_TRGO)                      \
00071    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM15_TRGO)                     \
00072    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM1_OUT)                     \
00073    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM2_OUT)                     \
00074    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_EXTI_LINE9)                     \
00075    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_SOFTWARE)                           \
00076   )
00077 #else
00078 #define IS_LL_DAC_TRIGGER_SOURCE(__TRIGGER_SOURCE__)                           \
00079   (   ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_SOFTWARE)                           \
00080    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM2_TRGO)                      \
00081    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM4_TRGO)                      \
00082    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM5_TRGO)                      \
00083    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM6_TRGO)                      \
00084    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM7_TRGO)                      \
00085    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM8_TRGO)                      \
00086    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_EXTI_LINE9)                     \
00087   )
00088 #endif /* DAC_CR_TSEL1_3 */
00089 
00090 #define IS_LL_DAC_WAVE_AUTO_GENER_MODE(__WAVE_AUTO_GENERATION_MODE__)           \
00091   (   ((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_NONE)     \
00092    || ((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_NOISE)    \
00093    || ((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_TRIANGLE) \
00094   )
00095 
00096 #define IS_LL_DAC_WAVE_AUTO_GENER_CONFIG(__WAVE_AUTO_GENERATION_MODE__, __WAVE_AUTO_GENERATION_CONFIG__)  \
00097   ( (((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_NOISE)                               \
00098     && (  ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BIT0)                            \
00099        || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS1_0)                         \
00100        || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS2_0)                         \
00101        || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS3_0)                         \
00102        || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS4_0)                         \
00103        || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS5_0)                         \
00104        || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS6_0)                         \
00105        || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS7_0)                         \
00106        || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS8_0)                         \
00107        || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS9_0)                         \
00108        || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS10_0)                        \
00109        || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS11_0))                       \
00110     )                                                                                                     \
00111   ||(((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_TRIANGLE)                            \
00112     && (  ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_1)                              \
00113        || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_3)                              \
00114        || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_7)                              \
00115        || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_15)                             \
00116        || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_31)                             \
00117        || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_63)                             \
00118        || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_127)                            \
00119        || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_255)                            \
00120        || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_511)                            \
00121        || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_1023)                           \
00122        || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_2047)                           \
00123        || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_4095))                          \
00124     )                                                                                                     \
00125   )
00126 
00127 #define IS_LL_DAC_OUTPUT_BUFFER(__OUTPUT_BUFFER__)                             \
00128   (   ((__OUTPUT_BUFFER__) == LL_DAC_OUTPUT_BUFFER_ENABLE)                     \
00129    || ((__OUTPUT_BUFFER__) == LL_DAC_OUTPUT_BUFFER_DISABLE)                    \
00130   )
00131 
00132 #define IS_LL_DAC_OUTPUT_CONNECTION(__OUTPUT_CONNECTION__)                     \
00133   (   ((__OUTPUT_CONNECTION__) == LL_DAC_OUTPUT_CONNECT_GPIO)                  \
00134    || ((__OUTPUT_CONNECTION__) == LL_DAC_OUTPUT_CONNECT_INTERNAL)              \
00135   )
00136 
00137 #define IS_LL_DAC_OUTPUT_MODE(__OUTPUT_MODE__)                                 \
00138   (   ((__OUTPUT_MODE__) == LL_DAC_OUTPUT_MODE_NORMAL)                         \
00139    || ((__OUTPUT_MODE__) == LL_DAC_OUTPUT_MODE_SAMPLE_AND_HOLD)                \
00140   )
00141 
00142 /**
00143   * @}
00144   */
00145 
00146 
00147 /* Private function prototypes -----------------------------------------------*/
00148 
00149 /* Exported functions --------------------------------------------------------*/
00150 /** @addtogroup DAC_LL_Exported_Functions
00151   * @{
00152   */
00153 
00154 /** @addtogroup DAC_LL_EF_Init
00155   * @{
00156   */
00157 
00158 /**
00159   * @brief  De-initialize registers of the selected DAC instance
00160   *         to their default reset values.
00161   * @param  DACx DAC instance
00162   * @retval An ErrorStatus enumeration value:
00163   *          - SUCCESS: DAC registers are de-initialized
00164   *          - ERROR: not applicable
00165   */
00166 ErrorStatus LL_DAC_DeInit(DAC_TypeDef *DACx)
00167 {
00168   /* Check the parameters */
00169   assert_param(IS_DAC_ALL_INSTANCE(DACx));
00170 
00171   /* Force reset of DAC clock */
00172   LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_DAC1);
00173 
00174   /* Release reset of DAC clock */
00175   LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_DAC1);
00176 
00177   return SUCCESS;
00178 }
00179 
00180 /**
00181   * @brief  Initialize some features of DAC channel.
00182   * @note   @ref LL_DAC_Init() aims to ease basic configuration of a DAC channel.
00183   *         Leaving it ready to be enabled and output:
00184   *         a level by calling one of
00185   *           @ref LL_DAC_ConvertData12RightAligned
00186   *           @ref LL_DAC_ConvertData12LeftAligned
00187   *           @ref LL_DAC_ConvertData8RightAligned
00188   *         or one of the supported autogenerated wave.
00189   * @note   This function allows configuration of:
00190   *          - Output mode
00191   *          - Trigger
00192   *          - Wave generation
00193   * @note   The setting of these parameters by function @ref LL_DAC_Init()
00194   *         is conditioned to DAC state:
00195   *         DAC channel must be disabled.
00196   * @param  DACx DAC instance
00197   * @param  DAC_Channel This parameter can be one of the following values:
00198   *         @arg @ref LL_DAC_CHANNEL_1
00199   *         @arg @ref LL_DAC_CHANNEL_2 (1)
00200   *
00201   *         (1) On this STM32 serie, parameter not available on all devices.
00202   *             Refer to device datasheet for channels availability.
00203   * @param  DAC_InitStruct Pointer to a @ref LL_DAC_InitTypeDef structure
00204   * @retval An ErrorStatus enumeration value:
00205   *          - SUCCESS: DAC registers are initialized
00206   *          - ERROR: DAC registers are not initialized
00207   */
00208 ErrorStatus LL_DAC_Init(DAC_TypeDef *DACx, uint32_t DAC_Channel, LL_DAC_InitTypeDef *DAC_InitStruct)
00209 {
00210   ErrorStatus status = SUCCESS;
00211 
00212   /* Check the parameters */
00213   assert_param(IS_DAC_ALL_INSTANCE(DACx));
00214   assert_param(IS_LL_DAC_CHANNEL(DAC_Channel));
00215   assert_param(IS_LL_DAC_TRIGGER_SOURCE(DAC_InitStruct->TriggerSource));
00216   assert_param(IS_LL_DAC_OUTPUT_BUFFER(DAC_InitStruct->OutputBuffer));
00217   assert_param(IS_LL_DAC_OUTPUT_CONNECTION(DAC_InitStruct->OutputConnection));
00218   assert_param(IS_LL_DAC_OUTPUT_MODE(DAC_InitStruct->OutputMode));
00219   assert_param(IS_LL_DAC_WAVE_AUTO_GENER_MODE(DAC_InitStruct->WaveAutoGeneration));
00220   if (DAC_InitStruct->WaveAutoGeneration != LL_DAC_WAVE_AUTO_GENERATION_NONE)
00221   {
00222     assert_param(IS_LL_DAC_WAVE_AUTO_GENER_CONFIG(DAC_InitStruct->WaveAutoGeneration,
00223                                                   DAC_InitStruct->WaveAutoGenerationConfig));
00224   }
00225 
00226   /* Note: Hardware constraint (refer to description of this function)        */
00227   /*       DAC instance must be disabled.                                     */
00228   if (LL_DAC_IsEnabled(DACx, DAC_Channel) == 0U)
00229   {
00230     /* Configuration of DAC channel:                                          */
00231     /*  - TriggerSource                                                       */
00232     /*  - WaveAutoGeneration                                                  */
00233     /*  - OutputBuffer                                                        */
00234     /*  - OutputConnection                                                    */
00235     /*  - OutputMode                                                          */
00236     if (DAC_InitStruct->WaveAutoGeneration != LL_DAC_WAVE_AUTO_GENERATION_NONE)
00237     {
00238       MODIFY_REG(DACx->CR,
00239                  (DAC_CR_TSEL1
00240                   | DAC_CR_WAVE1
00241                   | DAC_CR_MAMP1
00242                  ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
00243                 ,
00244                  (DAC_InitStruct->TriggerSource
00245                   | DAC_InitStruct->WaveAutoGeneration
00246                   | DAC_InitStruct->WaveAutoGenerationConfig
00247                  ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
00248                 );
00249     }
00250     else
00251     {
00252       MODIFY_REG(DACx->CR,
00253                  (DAC_CR_TSEL1
00254                   | DAC_CR_WAVE1
00255                  ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
00256                 ,
00257                  (DAC_InitStruct->TriggerSource
00258                   | LL_DAC_WAVE_AUTO_GENERATION_NONE
00259                  ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
00260                 );
00261     }
00262     MODIFY_REG(DACx->MCR,
00263                (DAC_MCR_MODE1_1
00264                 | DAC_MCR_MODE1_0
00265                 | DAC_MCR_MODE1_2
00266                ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
00267               ,
00268                (DAC_InitStruct->OutputBuffer
00269                 | DAC_InitStruct->OutputConnection
00270                 | DAC_InitStruct->OutputMode
00271                ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
00272               );
00273   }
00274   else
00275   {
00276     /* Initialization error: DAC instance is not disabled.                    */
00277     status = ERROR;
00278   }
00279   return status;
00280 }
00281 
00282 /**
00283   * @brief Set each @ref LL_DAC_InitTypeDef field to default value.
00284   * @param DAC_InitStruct pointer to a @ref LL_DAC_InitTypeDef structure
00285   *                       whose fields will be set to default values.
00286   * @retval None
00287   */
00288 void LL_DAC_StructInit(LL_DAC_InitTypeDef *DAC_InitStruct)
00289 {
00290   /* Set DAC_InitStruct fields to default values */
00291   DAC_InitStruct->TriggerSource            = LL_DAC_TRIG_SOFTWARE;
00292   DAC_InitStruct->WaveAutoGeneration       = LL_DAC_WAVE_AUTO_GENERATION_NONE;
00293   /* Note: Parameter discarded if wave auto generation is disabled,           */
00294   /*       set anyway to its default value.                                   */
00295   DAC_InitStruct->WaveAutoGenerationConfig = LL_DAC_NOISE_LFSR_UNMASK_BIT0;
00296   DAC_InitStruct->OutputBuffer             = LL_DAC_OUTPUT_BUFFER_ENABLE;
00297   DAC_InitStruct->OutputConnection         = LL_DAC_OUTPUT_CONNECT_GPIO;
00298   DAC_InitStruct->OutputMode               = LL_DAC_OUTPUT_MODE_NORMAL;
00299 }
00300 
00301 /**
00302   * @}
00303   */
00304 
00305 /**
00306   * @}
00307   */
00308 
00309 /**
00310   * @}
00311   */
00312 
00313 #endif /* DAC1 */
00314 
00315 /**
00316   * @}
00317   */
00318 
00319 #endif /* USE_FULL_LL_DRIVER */
00320