STM32H735xx HAL User Manual
stm32h7xx_ll_dac.c
Go to the documentation of this file.
00001 /**
00002   ******************************************************************************
00003   * @file    stm32h7xx_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 "stm32h7xx_ll_dac.h"
00022 #include "stm32h7xx_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 /* USE_FULL_ASSERT */
00029 
00030 /** @addtogroup STM32H7xx_LL_Driver
00031   * @{
00032   */
00033 
00034 #if defined(DAC1) || defined(DAC2)
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 #define IS_LL_DAC_CHANNEL(__DAC_CHANNEL__)        \
00049   (  ((__DAC_CHANNEL__) == LL_DAC_CHANNEL_1)      \
00050      || ((__DAC_CHANNEL__) == LL_DAC_CHANNEL_2)   \
00051   )
00052 
00053 #if defined (HRTIM1)
00054 #define IS_LL_DAC_TRIGGER_SOURCE(__TRIGGER_SOURCE__)                           \
00055   (   ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_SOFTWARE)                           \
00056    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM1_TRGO)                      \
00057    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM2_TRGO)                      \
00058    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM4_TRGO)                      \
00059    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM5_TRGO)                      \
00060    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM6_TRGO)                      \
00061    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM7_TRGO)                      \
00062    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM8_TRGO)                      \
00063    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM15_TRGO)                     \
00064    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_HRTIM_TRGO1)                    \
00065    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_HRTIM_TRGO2)                    \
00066    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM1_OUT)                     \
00067    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM2_OUT)                     \
00068    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_EXTI_LINE9)                     \
00069   )
00070 #elif defined (DAC2)
00071 #define IS_LL_DAC_TRIGGER_SOURCE(__TRIGGER_SOURCE__)                           \
00072   (   ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_SOFTWARE)                           \
00073    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM1_TRGO)                      \
00074    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM2_TRGO)                      \
00075    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM4_TRGO)                      \
00076    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM5_TRGO)                      \
00077    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM6_TRGO)                      \
00078    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM7_TRGO)                      \
00079    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM8_TRGO)                      \
00080    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM15_TRGO)                     \
00081    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM1_OUT)                     \
00082    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM2_OUT)                     \
00083    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_EXTI_LINE9)                     \
00084    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM3_OUT)                     \
00085   )
00086 #else
00087 #define IS_LL_DAC_TRIGGER_SOURCE(__TRIGGER_SOURCE__)                           \
00088   (   ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_SOFTWARE)                           \
00089    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM1_TRGO)                      \
00090    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM2_TRGO)                      \
00091    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM4_TRGO)                      \
00092    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM5_TRGO)                      \
00093    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM6_TRGO)                      \
00094    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM7_TRGO)                      \
00095    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM8_TRGO)                      \
00096    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM15_TRGO)                     \
00097    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM1_OUT)                     \
00098    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM2_OUT)                     \
00099    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_EXTI_LINE9)                     \
00100    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM23_TRGO)                     \
00101    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM24_TRGO)                     \
00102   )
00103 #endif
00104 
00105 #define IS_LL_DAC_WAVE_AUTO_GENER_MODE(__WAVE_AUTO_GENERATION_MODE__)              \
00106   (   ((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_NONE)        \
00107       || ((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_NOISE)    \
00108       || ((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_TRIANGLE) \
00109   )
00110 
00111 #define IS_LL_DAC_WAVE_AUTO_GENER_CONFIG(__WAVE_AUTO_GENERATION_MODE__, __WAVE_AUTO_GENERATION_CONFIG__)  \
00112   ( (((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_NOISE)                               \
00113      && (  ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BIT0)                           \
00114            || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS1_0)                     \
00115            || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS2_0)                     \
00116            || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS3_0)                     \
00117            || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS4_0)                     \
00118            || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS5_0)                     \
00119            || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS6_0)                     \
00120            || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS7_0)                     \
00121            || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS8_0)                     \
00122            || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS9_0)                     \
00123            || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS10_0)                    \
00124            || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS11_0))                   \
00125     )                                                                                                     \
00126     ||(((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_TRIANGLE)                          \
00127        && (  ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_1)                           \
00128              || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_3)                        \
00129              || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_7)                        \
00130              || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_15)                       \
00131              || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_31)                       \
00132              || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_63)                       \
00133              || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_127)                      \
00134              || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_255)                      \
00135              || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_511)                      \
00136              || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_1023)                     \
00137              || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_2047)                     \
00138              || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_4095))                    \
00139       )                                                                                                   \
00140   )
00141 
00142 #define IS_LL_DAC_OUTPUT_BUFFER(__OUTPUT_BUFFER__)                             \
00143   (   ((__OUTPUT_BUFFER__) == LL_DAC_OUTPUT_BUFFER_ENABLE)                     \
00144       || ((__OUTPUT_BUFFER__) == LL_DAC_OUTPUT_BUFFER_DISABLE)                 \
00145   )
00146 
00147 #define IS_LL_DAC_OUTPUT_CONNECTION(__OUTPUT_CONNECTION__)                     \
00148   (   ((__OUTPUT_CONNECTION__) == LL_DAC_OUTPUT_CONNECT_GPIO)                  \
00149       || ((__OUTPUT_CONNECTION__) == LL_DAC_OUTPUT_CONNECT_INTERNAL)           \
00150   )
00151 
00152 #define IS_LL_DAC_OUTPUT_MODE(__OUTPUT_MODE__)                                 \
00153   (   ((__OUTPUT_MODE__) == LL_DAC_OUTPUT_MODE_NORMAL)                         \
00154       || ((__OUTPUT_MODE__) == LL_DAC_OUTPUT_MODE_SAMPLE_AND_HOLD)             \
00155   )
00156 
00157 /**
00158   * @}
00159   */
00160 
00161 
00162 /* Private function prototypes -----------------------------------------------*/
00163 
00164 /* Exported functions --------------------------------------------------------*/
00165 /** @addtogroup DAC_LL_Exported_Functions
00166   * @{
00167   */
00168 
00169 /** @addtogroup DAC_LL_EF_Init
00170   * @{
00171   */
00172 
00173 /**
00174   * @brief  De-initialize registers of the selected DAC instance
00175   *         to their default reset values.
00176   * @param  DACx DAC instance
00177   * @retval An ErrorStatus enumeration value:
00178   *          - SUCCESS: DAC registers are de-initialized
00179   *          - ERROR: not applicable
00180   */
00181 ErrorStatus LL_DAC_DeInit(DAC_TypeDef *DACx)
00182 {
00183   /* Check the parameters */
00184   assert_param(IS_DAC_ALL_INSTANCE(DACx));
00185 
00186   if(DACx == DAC1)
00187   {
00188     /* Force reset of DAC clock */
00189     LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_DAC12);
00190 
00191     /* Release reset of DAC clock */
00192     LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_DAC12);
00193  }
00194 #if defined (DAC2)
00195   else
00196   {
00197     /* Force reset of DAC clock */
00198     LL_APB4_GRP1_ForceReset(LL_APB4_GRP1_PERIPH_DAC2);
00199 
00200     /* Release reset of DAC clock */
00201     LL_APB4_GRP1_ReleaseReset(LL_APB4_GRP1_PERIPH_DAC2);
00202   }
00203 #endif
00204 
00205 
00206   return SUCCESS;
00207 }
00208 
00209 /**
00210   * @brief  Initialize some features of DAC channel.
00211   * @note   @ref LL_DAC_Init() aims to ease basic configuration of a DAC channel.
00212   *         Leaving it ready to be enabled and output:
00213   *         a level by calling one of
00214   *           @ref LL_DAC_ConvertData12RightAligned
00215   *           @ref LL_DAC_ConvertData12LeftAligned
00216   *           @ref LL_DAC_ConvertData8RightAligned
00217   *         or one of the supported autogenerated wave.
00218   * @note   This function allows configuration of:
00219   *          - Output mode
00220   *          - Trigger
00221   *          - Wave generation
00222   * @note   The setting of these parameters by function @ref LL_DAC_Init()
00223   *         is conditioned to DAC state:
00224   *         DAC channel must be disabled.
00225   * @param  DACx DAC instance
00226   * @param  DAC_Channel This parameter can be one of the following values:
00227   *         @arg @ref LL_DAC_CHANNEL_1
00228   *         @arg @ref LL_DAC_CHANNEL_2
00229   * @param  DAC_InitStruct Pointer to a @ref LL_DAC_InitTypeDef structure
00230   * @retval An ErrorStatus enumeration value:
00231   *          - SUCCESS: DAC registers are initialized
00232   *          - ERROR: DAC registers are not initialized
00233   */
00234 ErrorStatus LL_DAC_Init(DAC_TypeDef *DACx, uint32_t DAC_Channel, LL_DAC_InitTypeDef *DAC_InitStruct)
00235 {
00236   ErrorStatus status = SUCCESS;
00237 
00238   /* Check the parameters */
00239   assert_param(IS_DAC_ALL_INSTANCE(DACx));
00240   assert_param(IS_LL_DAC_CHANNEL(DAC_Channel));
00241   assert_param(IS_LL_DAC_TRIGGER_SOURCE(DAC_InitStruct->TriggerSource));
00242   assert_param(IS_LL_DAC_OUTPUT_BUFFER(DAC_InitStruct->OutputBuffer));
00243   assert_param(IS_LL_DAC_OUTPUT_CONNECTION(DAC_InitStruct->OutputConnection));
00244   assert_param(IS_LL_DAC_OUTPUT_MODE(DAC_InitStruct->OutputMode));
00245   assert_param(IS_LL_DAC_WAVE_AUTO_GENER_MODE(DAC_InitStruct->WaveAutoGeneration));
00246   if (DAC_InitStruct->WaveAutoGeneration != LL_DAC_WAVE_AUTO_GENERATION_NONE)
00247   {
00248     assert_param(IS_LL_DAC_WAVE_AUTO_GENER_CONFIG(DAC_InitStruct->WaveAutoGeneration,
00249                                                   DAC_InitStruct->WaveAutoGenerationConfig));
00250   }
00251 
00252   /* Note: Hardware constraint (refer to description of this function)        */
00253   /*       DAC instance must be disabled.                                     */
00254   if (LL_DAC_IsEnabled(DACx, DAC_Channel) == 0UL)
00255   {
00256     /* Configuration of DAC channel:                                          */
00257     /*  - TriggerSource                                                       */
00258     /*  - WaveAutoGeneration                                                  */
00259     /*  - OutputBuffer                                                        */
00260     /*  - OutputConnection                                                    */
00261     /*  - OutputMode                                                          */
00262     if (DAC_InitStruct->WaveAutoGeneration != LL_DAC_WAVE_AUTO_GENERATION_NONE)
00263     {
00264       MODIFY_REG(DACx->CR,
00265                  (DAC_CR_TSEL1
00266                   | DAC_CR_WAVE1
00267                   | DAC_CR_MAMP1
00268                  ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
00269                  ,
00270                  (DAC_InitStruct->TriggerSource
00271                   | DAC_InitStruct->WaveAutoGeneration
00272                   | DAC_InitStruct->WaveAutoGenerationConfig
00273                  ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
00274                 );
00275     }
00276     else
00277     {
00278       MODIFY_REG(DACx->CR,
00279                  (DAC_CR_TSEL1
00280                   | DAC_CR_WAVE1
00281                  ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
00282                  ,
00283                  (DAC_InitStruct->TriggerSource
00284                   | LL_DAC_WAVE_AUTO_GENERATION_NONE
00285                  ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
00286                 );
00287     }
00288     MODIFY_REG(DACx->MCR,
00289                (DAC_MCR_MODE1_1
00290                 | DAC_MCR_MODE1_0
00291                 | DAC_MCR_MODE1_2
00292                ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
00293                ,
00294                (DAC_InitStruct->OutputBuffer
00295                 | DAC_InitStruct->OutputConnection
00296                 | DAC_InitStruct->OutputMode
00297                ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
00298               );
00299   }
00300   else
00301   {
00302     /* Initialization error: DAC instance is not disabled.                    */
00303     status = ERROR;
00304   }
00305   return status;
00306 }
00307 
00308 /**
00309   * @brief Set each @ref LL_DAC_InitTypeDef field to default value.
00310   * @param DAC_InitStruct pointer to a @ref LL_DAC_InitTypeDef structure
00311   *                       whose fields will be set to default values.
00312   * @retval None
00313   */
00314 void LL_DAC_StructInit(LL_DAC_InitTypeDef *DAC_InitStruct)
00315 {
00316   /* Set DAC_InitStruct fields to default values */
00317   DAC_InitStruct->TriggerSource            = LL_DAC_TRIG_SOFTWARE;
00318   DAC_InitStruct->WaveAutoGeneration       = LL_DAC_WAVE_AUTO_GENERATION_NONE;
00319   /* Note: Parameter discarded if wave auto generation is disabled,           */
00320   /*       set anyway to its default value.                                   */
00321   DAC_InitStruct->WaveAutoGenerationConfig = LL_DAC_NOISE_LFSR_UNMASK_BIT0;
00322   DAC_InitStruct->OutputBuffer             = LL_DAC_OUTPUT_BUFFER_ENABLE;
00323   DAC_InitStruct->OutputConnection         = LL_DAC_OUTPUT_CONNECT_GPIO;
00324   DAC_InitStruct->OutputMode               = LL_DAC_OUTPUT_MODE_NORMAL;
00325 }
00326 
00327 /**
00328   * @}
00329   */
00330 
00331 /**
00332   * @}
00333   */
00334 
00335 /**
00336   * @}
00337   */
00338 
00339 #endif /* DAC1 || DAC2 */
00340 
00341 /**
00342   * @}
00343   */
00344 
00345 #endif /* USE_FULL_LL_DRIVER */
00346