Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:23:09

0001 /**
0002   ******************************************************************************
0003   * @file    stm32h7xx_ll_dac.c
0004   * @author  MCD Application Team
0005   * @brief   DAC LL module driver
0006   ******************************************************************************
0007   * @attention
0008   *
0009   * Copyright (c) 2017 STMicroelectronics.
0010   * All rights reserved.
0011   *
0012   * This software is licensed under terms that can be found in the LICENSE file
0013   * in the root directory of this software component.
0014   * If no LICENSE file comes with this software, it is provided AS-IS.
0015   *
0016   ******************************************************************************
0017   */
0018 #if defined(USE_FULL_LL_DRIVER) || defined(__rtems__)
0019 
0020 /* Includes ------------------------------------------------------------------*/
0021 #include "stm32h7xx_ll_dac.h"
0022 #include "stm32h7xx_ll_bus.h"
0023 
0024 #ifdef USE_FULL_ASSERT
0025 #include "stm32_assert.h"
0026 #else
0027 #define assert_param(expr) ((void)0U)
0028 #endif /* USE_FULL_ASSERT */
0029 
0030 /** @addtogroup STM32H7xx_LL_Driver
0031   * @{
0032   */
0033 
0034 #if defined(DAC1) || defined(DAC2)
0035 
0036 /** @addtogroup DAC_LL DAC
0037   * @{
0038   */
0039 
0040 /* Private types -------------------------------------------------------------*/
0041 /* Private variables ---------------------------------------------------------*/
0042 /* Private constants ---------------------------------------------------------*/
0043 /* Private macros ------------------------------------------------------------*/
0044 
0045 /** @addtogroup DAC_LL_Private_Macros
0046   * @{
0047   */
0048 #define IS_LL_DAC_CHANNEL(__DAC_CHANNEL__)        \
0049   (((__DAC_CHANNEL__) == LL_DAC_CHANNEL_1)      \
0050    || ((__DAC_CHANNEL__) == LL_DAC_CHANNEL_2)   \
0051   )
0052 
0053 #if defined (HRTIM1)
0054 #define IS_LL_DAC_TRIGGER_SOURCE(__TRIGGER_SOURCE__)                           \
0055   (((__TRIGGER_SOURCE__) == LL_DAC_TRIG_SOFTWARE)                              \
0056    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM1_TRGO)                      \
0057    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM2_TRGO)                      \
0058    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM4_TRGO)                      \
0059    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM5_TRGO)                      \
0060    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM6_TRGO)                      \
0061    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM7_TRGO)                      \
0062    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM8_TRGO)                      \
0063    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM15_TRGO)                     \
0064    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_HRTIM_TRGO1)                    \
0065    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_HRTIM_TRGO2)                    \
0066    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM1_OUT)                     \
0067    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM2_OUT)                     \
0068    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_EXTI_LINE9)                     \
0069   )
0070 #elif defined (DAC2)
0071 #define IS_LL_DAC_TRIGGER_SOURCE(__TRIGGER_SOURCE__)                           \
0072   (((__TRIGGER_SOURCE__) == LL_DAC_TRIG_SOFTWARE)                              \
0073    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM1_TRGO)                      \
0074    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM2_TRGO)                      \
0075    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM4_TRGO)                      \
0076    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM5_TRGO)                      \
0077    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM6_TRGO)                      \
0078    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM7_TRGO)                      \
0079    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM8_TRGO)                      \
0080    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM15_TRGO)                     \
0081    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM1_OUT)                     \
0082    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM2_OUT)                     \
0083    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_EXTI_LINE9)                     \
0084    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM3_OUT)                     \
0085   )
0086 #else
0087 #define IS_LL_DAC_TRIGGER_SOURCE(__TRIGGER_SOURCE__)                           \
0088   (((__TRIGGER_SOURCE__) == LL_DAC_TRIG_SOFTWARE)                              \
0089    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM1_TRGO)                      \
0090    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM2_TRGO)                      \
0091    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM4_TRGO)                      \
0092    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM5_TRGO)                      \
0093    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM6_TRGO)                      \
0094    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM7_TRGO)                      \
0095    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM8_TRGO)                      \
0096    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM15_TRGO)                     \
0097    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM1_OUT)                     \
0098    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_LPTIM2_OUT)                     \
0099    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_EXTI_LINE9)                     \
0100    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM23_TRGO)                     \
0101    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM24_TRGO)                     \
0102   )
0103 #endif /* HRTIM1 */
0104 
0105 #define IS_LL_DAC_WAVE_AUTO_GENER_MODE(__WAVE_AUTO_GENERATION_MODE__)              \
0106   (((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_NONE)           \
0107    || ((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_NOISE)       \
0108    || ((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_TRIANGLE)    \
0109   )
0110 
0111 #define IS_LL_DAC_WAVE_AUTO_GENER_CONFIG(__WAVE_AUTO_GENERATION_MODE__, __WAVE_AUTO_GENERATION_CONFIG__)  \
0112   ( (((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_NOISE)                               \
0113      && (((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BIT0)                             \
0114          || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS1_0)                       \
0115          || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS2_0)                       \
0116          || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS3_0)                       \
0117          || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS4_0)                       \
0118          || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS5_0)                       \
0119          || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS6_0)                       \
0120          || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS7_0)                       \
0121          || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS8_0)                       \
0122          || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS9_0)                       \
0123          || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS10_0)                      \
0124          || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS11_0))                     \
0125     )                                                                                                     \
0126     ||(((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_TRIANGLE)                          \
0127        && (((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_1)                             \
0128            || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_3)                          \
0129            || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_7)                          \
0130            || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_15)                         \
0131            || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_31)                         \
0132            || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_63)                         \
0133            || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_127)                        \
0134            || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_255)                        \
0135            || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_511)                        \
0136            || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_1023)                       \
0137            || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_2047)                       \
0138            || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_4095))                      \
0139       )                                                                                                   \
0140   )
0141 
0142 #define IS_LL_DAC_OUTPUT_BUFFER(__OUTPUT_BUFFER__)                             \
0143   (((__OUTPUT_BUFFER__) == LL_DAC_OUTPUT_BUFFER_ENABLE)                        \
0144    || ((__OUTPUT_BUFFER__) == LL_DAC_OUTPUT_BUFFER_DISABLE)                    \
0145   )
0146 
0147 #define IS_LL_DAC_OUTPUT_CONNECTION(__OUTPUT_CONNECTION__)                     \
0148   (((__OUTPUT_CONNECTION__) == LL_DAC_OUTPUT_CONNECT_GPIO)                     \
0149    || ((__OUTPUT_CONNECTION__) == LL_DAC_OUTPUT_CONNECT_INTERNAL)              \
0150   )
0151 
0152 #define IS_LL_DAC_OUTPUT_MODE(__OUTPUT_MODE__)                                 \
0153   (((__OUTPUT_MODE__) == LL_DAC_OUTPUT_MODE_NORMAL)                            \
0154    || ((__OUTPUT_MODE__) == LL_DAC_OUTPUT_MODE_SAMPLE_AND_HOLD)                \
0155   )
0156 
0157 /**
0158   * @}
0159   */
0160 
0161 
0162 /* Private function prototypes -----------------------------------------------*/
0163 
0164 /* Exported functions --------------------------------------------------------*/
0165 /** @addtogroup DAC_LL_Exported_Functions
0166   * @{
0167   */
0168 
0169 /** @addtogroup DAC_LL_EF_Init
0170   * @{
0171   */
0172 
0173 /**
0174   * @brief  De-initialize registers of the selected DAC instance
0175   *         to their default reset values.
0176   * @param  DACx DAC instance
0177   * @retval An ErrorStatus enumeration value:
0178   *          - SUCCESS: DAC registers are de-initialized
0179   *          - ERROR: not applicable
0180   */
0181 ErrorStatus LL_DAC_DeInit(const DAC_TypeDef *DACx)
0182 {
0183   /* Check the parameters */
0184   assert_param(IS_DAC_ALL_INSTANCE(DACx));
0185 
0186   if (DACx == DAC1)
0187   {
0188     /* Force reset of DAC clock */
0189     LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_DAC12);
0190 
0191     /* Release reset of DAC clock */
0192     LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_DAC12);
0193   }
0194 #if defined (DAC2)
0195   else
0196   {
0197     /* Force reset of DAC clock */
0198     LL_APB4_GRP1_ForceReset(LL_APB4_GRP1_PERIPH_DAC2);
0199 
0200     /* Release reset of DAC clock */
0201     LL_APB4_GRP1_ReleaseReset(LL_APB4_GRP1_PERIPH_DAC2);
0202   }
0203 #endif /* DAC2 */
0204 
0205   return SUCCESS;
0206 }
0207 
0208 /**
0209   * @brief  Initialize some features of DAC channel.
0210   * @note   @ref LL_DAC_Init() aims to ease basic configuration of a DAC channel.
0211   *         Leaving it ready to be enabled and output:
0212   *         a level by calling one of
0213   *           @ref LL_DAC_ConvertData12RightAligned
0214   *           @ref LL_DAC_ConvertData12LeftAligned
0215   *           @ref LL_DAC_ConvertData8RightAligned
0216   *         or one of the supported autogenerated wave.
0217   * @note   This function allows configuration of:
0218   *          - Output mode
0219   *          - Trigger
0220   *          - Wave generation
0221   * @note   The setting of these parameters by function @ref LL_DAC_Init()
0222   *         is conditioned to DAC state:
0223   *         DAC channel must be disabled.
0224   * @param  DACx DAC instance
0225   * @param  DAC_Channel This parameter can be one of the following values:
0226   *         @arg @ref LL_DAC_CHANNEL_1
0227   *         @arg @ref LL_DAC_CHANNEL_2
0228   * @param  DAC_InitStruct Pointer to a @ref LL_DAC_InitTypeDef structure
0229   * @retval An ErrorStatus enumeration value:
0230   *          - SUCCESS: DAC registers are initialized
0231   *          - ERROR: DAC registers are not initialized
0232   */
0233 ErrorStatus LL_DAC_Init(DAC_TypeDef *DACx, uint32_t DAC_Channel, const LL_DAC_InitTypeDef *DAC_InitStruct)
0234 {
0235   ErrorStatus status = SUCCESS;
0236 
0237   /* Check the parameters */
0238   assert_param(IS_DAC_ALL_INSTANCE(DACx));
0239   assert_param(IS_LL_DAC_CHANNEL(DAC_Channel));
0240   assert_param(IS_LL_DAC_TRIGGER_SOURCE(DAC_InitStruct->TriggerSource));
0241   assert_param(IS_LL_DAC_OUTPUT_BUFFER(DAC_InitStruct->OutputBuffer));
0242   assert_param(IS_LL_DAC_OUTPUT_CONNECTION(DAC_InitStruct->OutputConnection));
0243   assert_param(IS_LL_DAC_OUTPUT_MODE(DAC_InitStruct->OutputMode));
0244   assert_param(IS_LL_DAC_WAVE_AUTO_GENER_MODE(DAC_InitStruct->WaveAutoGeneration));
0245   if (DAC_InitStruct->WaveAutoGeneration != LL_DAC_WAVE_AUTO_GENERATION_NONE)
0246   {
0247     assert_param(IS_LL_DAC_WAVE_AUTO_GENER_CONFIG(DAC_InitStruct->WaveAutoGeneration,
0248                                                   DAC_InitStruct->WaveAutoGenerationConfig));
0249   }
0250 
0251   /* Note: Hardware constraint (refer to description of this function)        */
0252   /*       DAC instance must be disabled.                                     */
0253   if (LL_DAC_IsEnabled(DACx, DAC_Channel) == 0UL)
0254   {
0255     /* Configuration of DAC channel:                                          */
0256     /*  - TriggerSource                                                       */
0257     /*  - WaveAutoGeneration                                                  */
0258     /*  - OutputBuffer                                                        */
0259     /*  - OutputConnection                                                    */
0260     /*  - OutputMode                                                          */
0261     if (DAC_InitStruct->WaveAutoGeneration != LL_DAC_WAVE_AUTO_GENERATION_NONE)
0262     {
0263       MODIFY_REG(DACx->CR,
0264                  (DAC_CR_TSEL1
0265                   | DAC_CR_WAVE1
0266                   | DAC_CR_MAMP1
0267                  ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
0268                  ,
0269                  (DAC_InitStruct->TriggerSource
0270                   | DAC_InitStruct->WaveAutoGeneration
0271                   | DAC_InitStruct->WaveAutoGenerationConfig
0272                  ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
0273                 );
0274     }
0275     else
0276     {
0277       MODIFY_REG(DACx->CR,
0278                  (DAC_CR_TSEL1
0279                   | DAC_CR_WAVE1
0280                  ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
0281                  ,
0282                  (DAC_InitStruct->TriggerSource
0283                   | LL_DAC_WAVE_AUTO_GENERATION_NONE
0284                  ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
0285                 );
0286     }
0287     MODIFY_REG(DACx->MCR,
0288                (DAC_MCR_MODE1_1
0289                 | DAC_MCR_MODE1_0
0290                 | DAC_MCR_MODE1_2
0291                ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
0292                ,
0293                (DAC_InitStruct->OutputBuffer
0294                 | DAC_InitStruct->OutputConnection
0295                 | DAC_InitStruct->OutputMode
0296                ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
0297               );
0298   }
0299   else
0300   {
0301     /* Initialization error: DAC instance is not disabled.                    */
0302     status = ERROR;
0303   }
0304   return status;
0305 }
0306 
0307 /**
0308   * @brief Set each @ref LL_DAC_InitTypeDef field to default value.
0309   * @param DAC_InitStruct pointer to a @ref LL_DAC_InitTypeDef structure
0310   *                       whose fields will be set to default values.
0311   * @retval None
0312   */
0313 void LL_DAC_StructInit(LL_DAC_InitTypeDef *DAC_InitStruct)
0314 {
0315   /* Set DAC_InitStruct fields to default values */
0316   DAC_InitStruct->TriggerSource            = LL_DAC_TRIG_SOFTWARE;
0317   DAC_InitStruct->WaveAutoGeneration       = LL_DAC_WAVE_AUTO_GENERATION_NONE;
0318   /* Note: Parameter discarded if wave auto generation is disabled,           */
0319   /*       set anyway to its default value.                                   */
0320   DAC_InitStruct->WaveAutoGenerationConfig = LL_DAC_NOISE_LFSR_UNMASK_BIT0;
0321   DAC_InitStruct->OutputBuffer             = LL_DAC_OUTPUT_BUFFER_ENABLE;
0322   DAC_InitStruct->OutputConnection         = LL_DAC_OUTPUT_CONNECT_GPIO;
0323   DAC_InitStruct->OutputMode               = LL_DAC_OUTPUT_MODE_NORMAL;
0324 }
0325 
0326 /**
0327   * @}
0328   */
0329 
0330 /**
0331   * @}
0332   */
0333 
0334 /**
0335   * @}
0336   */
0337 
0338 #endif /* DAC1 || DAC2 */
0339 
0340 /**
0341   * @}
0342   */
0343 
0344 #endif /* USE_FULL_LL_DRIVER */