STM32F439xx HAL User Manual
stm32f4xx_ll_dac.c
Go to the documentation of this file.
00001 /**
00002   ******************************************************************************
00003   * @file    stm32f4xx_ll_dac.c
00004   * @author  MCD Application Team
00005   * @brief   DAC LL module driver
00006   ******************************************************************************
00007   * @attention
00008   *
00009   * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
00010   *
00011   * Redistribution and use in source and binary forms, with or without modification,
00012   * are permitted provided that the following conditions are met:
00013   *   1. Redistributions of source code must retain the above copyright notice,
00014   *      this list of conditions and the following disclaimer.
00015   *   2. Redistributions in binary form must reproduce the above copyright notice,
00016   *      this list of conditions and the following disclaimer in the documentation
00017   *      and/or other materials provided with the distribution.
00018   *   3. Neither the name of STMicroelectronics nor the names of its contributors
00019   *      may be used to endorse or promote products derived from this software
00020   *      without specific prior written permission.
00021   *
00022   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00023   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00024   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00025   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
00026   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00027   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
00028   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00029   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
00030   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00031   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00032   *
00033   ******************************************************************************
00034   */
00035 #if defined(USE_FULL_LL_DRIVER)
00036 
00037 /* Includes ------------------------------------------------------------------*/
00038 #include "stm32f4xx_ll_dac.h"
00039 #include "stm32f4xx_ll_bus.h"
00040 
00041 #ifdef USE_FULL_ASSERT
00042   #include "stm32_assert.h"
00043 #else
00044   #define assert_param(expr) ((void)0U)
00045 #endif
00046 
00047 /** @addtogroup STM32F4xx_LL_Driver
00048   * @{
00049   */
00050 
00051 #if defined(DAC)
00052 
00053 /** @addtogroup DAC_LL DAC
00054   * @{
00055   */
00056 
00057 /* Private types -------------------------------------------------------------*/
00058 /* Private variables ---------------------------------------------------------*/
00059 /* Private constants ---------------------------------------------------------*/
00060 /* Private macros ------------------------------------------------------------*/
00061 
00062 /** @addtogroup DAC_LL_Private_Macros
00063   * @{
00064   */
00065 
00066 #if defined(DAC_CHANNEL2_SUPPORT)
00067 #define IS_LL_DAC_CHANNEL(__DACX__, __DAC_CHANNEL__)                           \
00068   (                                                                            \
00069       ((__DAC_CHANNEL__) == LL_DAC_CHANNEL_1)                                  \
00070    || ((__DAC_CHANNEL__) == LL_DAC_CHANNEL_2)                                  \
00071   )
00072 #else
00073 #define IS_LL_DAC_CHANNEL(__DACX__, __DAC_CHANNEL__)                           \
00074   (                                                                            \
00075    ((__DAC_CHANNEL__) == LL_DAC_CHANNEL_1)                                     \
00076   )
00077 #endif /* DAC_CHANNEL2_SUPPORT */
00078 
00079 #define IS_LL_DAC_TRIGGER_SOURCE(__TRIGGER_SOURCE__)                           \
00080   (   ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_SOFTWARE)                           \
00081    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM2_TRGO)                      \
00082    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM4_TRGO)                      \
00083    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM5_TRGO)                      \
00084    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM6_TRGO)                      \
00085    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM7_TRGO)                      \
00086    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM8_TRGO)                      \
00087    || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_EXTI_LINE9)                     \
00088   )
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_CONFIG__)      \
00097   (   ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BIT0)     \
00098    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS1_0)  \
00099    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS2_0)  \
00100    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS3_0)  \
00101    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS4_0)  \
00102    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS5_0)  \
00103    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS6_0)  \
00104    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS7_0)  \
00105    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS8_0)  \
00106    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS9_0)  \
00107    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS10_0) \
00108    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS11_0) \
00109    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_1)       \
00110    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_3)       \
00111    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_7)       \
00112    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_15)      \
00113    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_31)      \
00114    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_63)      \
00115    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_127)     \
00116    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_255)     \
00117    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_511)     \
00118    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_1023)    \
00119    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_2047)    \
00120    || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_4095)    \
00121   )
00122 
00123 #define IS_LL_DAC_OUTPUT_BUFFER(__OUTPUT_BUFFER__)                             \
00124   (   ((__OUTPUT_BUFFER__) == LL_DAC_OUTPUT_BUFFER_ENABLE)                     \
00125    || ((__OUTPUT_BUFFER__) == LL_DAC_OUTPUT_BUFFER_DISABLE)                    \
00126   )
00127 
00128 /**
00129   * @}
00130   */
00131 
00132 
00133 /* Private function prototypes -----------------------------------------------*/
00134 
00135 /* Exported functions --------------------------------------------------------*/
00136 /** @addtogroup DAC_LL_Exported_Functions
00137   * @{
00138   */
00139 
00140 /** @addtogroup DAC_LL_EF_Init
00141   * @{
00142   */
00143 
00144 /**
00145   * @brief  De-initialize registers of the selected DAC instance
00146   *         to their default reset values.
00147   * @param  DACx DAC instance
00148   * @retval An ErrorStatus enumeration value:
00149   *          - SUCCESS: DAC registers are de-initialized
00150   *          - ERROR: not applicable
00151   */
00152 ErrorStatus LL_DAC_DeInit(DAC_TypeDef *DACx)
00153 {
00154   /* Check the parameters */
00155   assert_param(IS_DAC_ALL_INSTANCE(DACx));
00156   
00157   /* Force reset of DAC1 clock */
00158   LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_DAC1);
00159   
00160   /* Release reset of DAC1 clock */
00161   LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_DAC1);
00162   return SUCCESS;
00163 }
00164 
00165 /**
00166   * @brief  Initialize some features of DAC instance.
00167   * @note   The setting of these parameters by function @ref LL_DAC_Init()
00168   *         is conditioned to DAC state:
00169   *         DAC instance must be disabled.
00170   * @param  DACx DAC instance
00171   * @param  DAC_Channel This parameter can be one of the following values:
00172   *         @arg @ref LL_DAC_CHANNEL_1
00173   *         @arg @ref LL_DAC_CHANNEL_2 (1)
00174   *         
00175   *         (1) On this STM32 serie, parameter not available on all devices.
00176   *             Refer to device datasheet for channels availability.
00177   * @param  DAC_InitStruct Pointer to a @ref LL_DAC_InitTypeDef structure
00178   * @retval An ErrorStatus enumeration value:
00179   *          - SUCCESS: DAC registers are initialized
00180   *          - ERROR: DAC registers are not initialized
00181   */
00182 ErrorStatus LL_DAC_Init(DAC_TypeDef *DACx, uint32_t DAC_Channel, LL_DAC_InitTypeDef *DAC_InitStruct)
00183 {
00184   ErrorStatus status = SUCCESS;
00185   
00186   /* Check the parameters */
00187   assert_param(IS_DAC_ALL_INSTANCE(DACx));
00188   assert_param(IS_LL_DAC_CHANNEL(DACx, DAC_Channel));
00189   assert_param(IS_LL_DAC_TRIGGER_SOURCE(DAC_InitStruct->TriggerSource));
00190   assert_param(IS_LL_DAC_OUTPUT_BUFFER(DAC_InitStruct->OutputBuffer));
00191   assert_param(IS_LL_DAC_WAVE_AUTO_GENER_MODE(DAC_InitStruct->WaveAutoGeneration));
00192   if (DAC_InitStruct->WaveAutoGeneration != LL_DAC_WAVE_AUTO_GENERATION_NONE)
00193   {
00194     assert_param(IS_LL_DAC_WAVE_AUTO_GENER_CONFIG(DAC_InitStruct->WaveAutoGenerationConfig));
00195   }
00196   
00197   /* Note: Hardware constraint (refer to description of this function)        */
00198   /*       DAC instance must be disabled.                                     */
00199   if(LL_DAC_IsEnabled(DACx, DAC_Channel) == 0U)
00200   {
00201     /* Configuration of DAC channel:                                          */
00202     /*  - TriggerSource                                                       */
00203     /*  - WaveAutoGeneration                                                  */
00204     /*  - OutputBuffer                                                        */
00205     if (DAC_InitStruct->WaveAutoGeneration != LL_DAC_WAVE_AUTO_GENERATION_NONE)
00206     {
00207       MODIFY_REG(DACx->CR,
00208                  (  DAC_CR_TSEL1
00209                   | DAC_CR_WAVE1
00210                   | DAC_CR_MAMP1
00211                   | DAC_CR_BOFF1
00212                  ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
00213                 ,
00214                  (  DAC_InitStruct->TriggerSource
00215                   | DAC_InitStruct->WaveAutoGeneration
00216                   | DAC_InitStruct->WaveAutoGenerationConfig
00217                   | DAC_InitStruct->OutputBuffer
00218                  ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
00219                 );
00220     }
00221     else
00222     {
00223       MODIFY_REG(DACx->CR,
00224                  (  DAC_CR_TSEL1
00225                   | DAC_CR_WAVE1
00226                   | DAC_CR_BOFF1
00227                  ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
00228                 ,
00229                  (  DAC_InitStruct->TriggerSource
00230                   | LL_DAC_WAVE_AUTO_GENERATION_NONE
00231                   | DAC_InitStruct->OutputBuffer
00232                  ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)
00233                 );
00234     }
00235   }
00236   else
00237   {
00238     /* Initialization error: DAC instance is not disabled.                    */
00239     status = ERROR;
00240   }
00241   return status;
00242 }
00243 
00244 /**
00245   * @brief Set each @ref LL_DAC_InitTypeDef field to default value.
00246   * @param DAC_InitStruct pointer to a @ref LL_DAC_InitTypeDef structure
00247   *                       whose fields will be set to default values.
00248   * @retval None
00249   */
00250 void LL_DAC_StructInit(LL_DAC_InitTypeDef *DAC_InitStruct)
00251 {
00252   /* Set DAC_InitStruct fields to default values */
00253   DAC_InitStruct->TriggerSource            = LL_DAC_TRIG_SOFTWARE;
00254   DAC_InitStruct->WaveAutoGeneration       = LL_DAC_WAVE_AUTO_GENERATION_NONE;
00255   /* Note: Parameter discarded if wave auto generation is disabled,           */
00256   /*       set anyway to its default value.                                   */
00257   DAC_InitStruct->WaveAutoGenerationConfig = LL_DAC_NOISE_LFSR_UNMASK_BIT0;
00258   DAC_InitStruct->OutputBuffer             = LL_DAC_OUTPUT_BUFFER_ENABLE;
00259 }
00260 
00261 /**
00262   * @}
00263   */
00264 
00265 /**
00266   * @}
00267   */
00268 
00269 /**
00270   * @}
00271   */
00272 
00273 #endif /* DAC */
00274 
00275 /**
00276   * @}
00277   */
00278 
00279 #endif /* USE_FULL_LL_DRIVER */
00280 
00281 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/