TUKS MCU Introductory course / TUKS-COURSE-TIMER
Committer:
elmot
Date:
Fri Feb 24 21:13:56 2017 +0000
Revision:
1:d0dfbce63a89
Ready-to-copy

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elmot 1:d0dfbce63a89 1 /**
elmot 1:d0dfbce63a89 2 ******************************************************************************
elmot 1:d0dfbce63a89 3 * @file stm32l4xx_hal_dac.c
elmot 1:d0dfbce63a89 4 * @author MCD Application Team
elmot 1:d0dfbce63a89 5 * @version V1.5.1
elmot 1:d0dfbce63a89 6 * @date 31-May-2016
elmot 1:d0dfbce63a89 7 * @brief DAC HAL module driver.
elmot 1:d0dfbce63a89 8 * This file provides firmware functions to manage the following
elmot 1:d0dfbce63a89 9 * functionalities of the Digital to Analog Converter (DAC) peripheral:
elmot 1:d0dfbce63a89 10 * + Initialization and de-initialization functions
elmot 1:d0dfbce63a89 11 * + IO operation functions
elmot 1:d0dfbce63a89 12 * + Peripheral Control functions
elmot 1:d0dfbce63a89 13 * + Peripheral State and Errors functions
elmot 1:d0dfbce63a89 14 *
elmot 1:d0dfbce63a89 15 *
elmot 1:d0dfbce63a89 16 @verbatim
elmot 1:d0dfbce63a89 17 ==============================================================================
elmot 1:d0dfbce63a89 18 ##### DAC Peripheral features #####
elmot 1:d0dfbce63a89 19 ==============================================================================
elmot 1:d0dfbce63a89 20 [..]
elmot 1:d0dfbce63a89 21 *** DAC Channels ***
elmot 1:d0dfbce63a89 22 ====================
elmot 1:d0dfbce63a89 23 [..]
elmot 1:d0dfbce63a89 24 STM32L4 devices integrate two 12-bit Digital Analog Converters
elmot 1:d0dfbce63a89 25
elmot 1:d0dfbce63a89 26 The 2 converters (i.e. channel1 & channel2)
elmot 1:d0dfbce63a89 27 can be used independently or simultaneously (dual mode):
elmot 1:d0dfbce63a89 28 (#) DAC channel1 with DAC_OUT1 (PA4) as output or connected to on-chip
elmot 1:d0dfbce63a89 29 peripherals (ex. OPAMPs, comparators).
elmot 1:d0dfbce63a89 30 (#) DAC channel2 with DAC_OUT2 (PA5) as output or connected to on-chip
elmot 1:d0dfbce63a89 31 peripherals (ex. OPAMPs, comparators).
elmot 1:d0dfbce63a89 32
elmot 1:d0dfbce63a89 33 *** DAC Triggers ***
elmot 1:d0dfbce63a89 34 ====================
elmot 1:d0dfbce63a89 35 [..]
elmot 1:d0dfbce63a89 36 Digital to Analog conversion can be non-triggered using DAC_TRIGGER_NONE
elmot 1:d0dfbce63a89 37 and DAC_OUT1/DAC_OUT2 is available once writing to DHRx register.
elmot 1:d0dfbce63a89 38 [..]
elmot 1:d0dfbce63a89 39 Digital to Analog conversion can be triggered by:
elmot 1:d0dfbce63a89 40 (#) External event: EXTI Line 9 (any GPIOx_PIN_9) using DAC_TRIGGER_EXT_IT9.
elmot 1:d0dfbce63a89 41 The used pin (GPIOx_PIN_9) must be configured in input mode.
elmot 1:d0dfbce63a89 42
elmot 1:d0dfbce63a89 43 (#) Timers TRGO: TIM2, TIM3, TIM4, TIM5, TIM6 and TIM7
elmot 1:d0dfbce63a89 44 (DAC_TRIGGER_T2_TRGO, DAC_TRIGGER_T3_TRGO...)
elmot 1:d0dfbce63a89 45
elmot 1:d0dfbce63a89 46 (#) Software using DAC_TRIGGER_SOFTWARE
elmot 1:d0dfbce63a89 47
elmot 1:d0dfbce63a89 48 *** DAC Buffer mode feature ***
elmot 1:d0dfbce63a89 49 ===============================
elmot 1:d0dfbce63a89 50 [..]
elmot 1:d0dfbce63a89 51 Each DAC channel integrates an output buffer that can be used to
elmot 1:d0dfbce63a89 52 reduce the output impedance, and to drive external loads directly
elmot 1:d0dfbce63a89 53 without having to add an external operational amplifier.
elmot 1:d0dfbce63a89 54 To enable, the output buffer use
elmot 1:d0dfbce63a89 55 sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
elmot 1:d0dfbce63a89 56 [..]
elmot 1:d0dfbce63a89 57 (@) Refer to the device datasheet for more details about output
elmot 1:d0dfbce63a89 58 impedance value with and without output buffer.
elmot 1:d0dfbce63a89 59
elmot 1:d0dfbce63a89 60 *** DAC connect feature ***
elmot 1:d0dfbce63a89 61 ===============================
elmot 1:d0dfbce63a89 62 [..]
elmot 1:d0dfbce63a89 63 Each DAC channel can be connected internally.
elmot 1:d0dfbce63a89 64 To connect, use
elmot 1:d0dfbce63a89 65 sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_ENABLE;
elmot 1:d0dfbce63a89 66
elmot 1:d0dfbce63a89 67 *** GPIO configurations guidelines ***
elmot 1:d0dfbce63a89 68 =====================
elmot 1:d0dfbce63a89 69 [..]
elmot 1:d0dfbce63a89 70 When a DAC channel is used (ex channel1 on PA4) and the other is not
elmot 1:d0dfbce63a89 71 (ex channel2 on PA5 is configured in Analog and disabled).
elmot 1:d0dfbce63a89 72 Channel1 may disturb channel2 as coupling effect.
elmot 1:d0dfbce63a89 73 Note that there is no coupling on channel2 as soon as channel2 is turned on.
elmot 1:d0dfbce63a89 74 Coupling on adjacent channel could be avoided as follows:
elmot 1:d0dfbce63a89 75 when unused PA5 is configured as INPUT PULL-UP or DOWN.
elmot 1:d0dfbce63a89 76 PA5 is configured in ANALOG just before it is turned on.
elmot 1:d0dfbce63a89 77
elmot 1:d0dfbce63a89 78 *** DAC Sample and Hold feature ***
elmot 1:d0dfbce63a89 79 ========================
elmot 1:d0dfbce63a89 80 [..]
elmot 1:d0dfbce63a89 81 For each converter, 2 modes are supported: normal mode and
elmot 1:d0dfbce63a89 82 "sample and hold" mode (i.e. low power mode).
elmot 1:d0dfbce63a89 83 In the sample and hold mode, the DAC core converts data, then holds the
elmot 1:d0dfbce63a89 84 converted voltage on a capacitor. When not converting, the DAC cores and
elmot 1:d0dfbce63a89 85 buffer are completely turned off between samples and the DAC output is
elmot 1:d0dfbce63a89 86 tri-stated, therefore reducing the overall power consumption. A new
elmot 1:d0dfbce63a89 87 stabilization period is needed before each new conversion.
elmot 1:d0dfbce63a89 88
elmot 1:d0dfbce63a89 89 The sample and hold allow setting internal or external voltage @
elmot 1:d0dfbce63a89 90 low power consumption cost (output value can be at any given rate either
elmot 1:d0dfbce63a89 91 by CPU or DMA).
elmot 1:d0dfbce63a89 92
elmot 1:d0dfbce63a89 93 The Sample and hold block and registers uses either LSI & run in
elmot 1:d0dfbce63a89 94 several power modes: run mode, sleep mode, low power run, low power sleep
elmot 1:d0dfbce63a89 95 mode & stop1 mode.
elmot 1:d0dfbce63a89 96
elmot 1:d0dfbce63a89 97 Low power stop1 mode allows only static conversion.
elmot 1:d0dfbce63a89 98
elmot 1:d0dfbce63a89 99 To enable Sample and Hold mode
elmot 1:d0dfbce63a89 100 Enable LSI using HAL_RCC_OscConfig with RCC_OSCILLATORTYPE_LSI &
elmot 1:d0dfbce63a89 101 RCC_LSI_ON parameters.
elmot 1:d0dfbce63a89 102
elmot 1:d0dfbce63a89 103 Use DAC_InitStructure.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_ENABLE;
elmot 1:d0dfbce63a89 104 & DAC_ChannelConfTypeDef.DAC_SampleAndHoldConfig.DAC_SampleTime,
elmot 1:d0dfbce63a89 105 DAC_HoldTime & DAC_RefreshTime;
elmot 1:d0dfbce63a89 106
elmot 1:d0dfbce63a89 107
elmot 1:d0dfbce63a89 108
elmot 1:d0dfbce63a89 109 *** DAC calibration feature ***
elmot 1:d0dfbce63a89 110 ===================================
elmot 1:d0dfbce63a89 111 [..]
elmot 1:d0dfbce63a89 112 (#) The 2 converters (channel1 & channel2) provide calibration capabilities.
elmot 1:d0dfbce63a89 113 (++) Calibration aims at correcting some offset of output buffer.
elmot 1:d0dfbce63a89 114 (++) The DAC uses either factory calibration settings OR user defined
elmot 1:d0dfbce63a89 115 calibration (trimming) settings (i.e. trimming mode).
elmot 1:d0dfbce63a89 116 (++) The user defined settings can be figured out using self calibration
elmot 1:d0dfbce63a89 117 handled by HAL_DACEx_SelfCalibrate.
elmot 1:d0dfbce63a89 118 (++) HAL_DACEx_SelfCalibrate:
elmot 1:d0dfbce63a89 119 (+++) Runs automatically the calibration.
elmot 1:d0dfbce63a89 120 (+++) Enables the user trimming mode
elmot 1:d0dfbce63a89 121 (+++) Updates a structure with trimming values with fresh calibration
elmot 1:d0dfbce63a89 122 results.
elmot 1:d0dfbce63a89 123 The user may store the calibration results for larger
elmot 1:d0dfbce63a89 124 (ex monitoring the trimming as a function of temperature
elmot 1:d0dfbce63a89 125 for instance)
elmot 1:d0dfbce63a89 126
elmot 1:d0dfbce63a89 127 *** DAC wave generation feature ***
elmot 1:d0dfbce63a89 128 ===================================
elmot 1:d0dfbce63a89 129 [..]
elmot 1:d0dfbce63a89 130 Both DAC channels can be used to generate
elmot 1:d0dfbce63a89 131 (#) Noise wave
elmot 1:d0dfbce63a89 132 (#) Triangle wave
elmot 1:d0dfbce63a89 133
elmot 1:d0dfbce63a89 134 *** DAC data format ***
elmot 1:d0dfbce63a89 135 =======================
elmot 1:d0dfbce63a89 136 [..]
elmot 1:d0dfbce63a89 137 The DAC data format can be:
elmot 1:d0dfbce63a89 138 (#) 8-bit right alignment using DAC_ALIGN_8B_R
elmot 1:d0dfbce63a89 139 (#) 12-bit left alignment using DAC_ALIGN_12B_L
elmot 1:d0dfbce63a89 140 (#) 12-bit right alignment using DAC_ALIGN_12B_R
elmot 1:d0dfbce63a89 141
elmot 1:d0dfbce63a89 142 *** DAC data value to voltage correspondence ***
elmot 1:d0dfbce63a89 143 ================================================
elmot 1:d0dfbce63a89 144 [..]
elmot 1:d0dfbce63a89 145 The analog output voltage on each DAC channel pin is determined
elmot 1:d0dfbce63a89 146 by the following equation:
elmot 1:d0dfbce63a89 147 [..]
elmot 1:d0dfbce63a89 148 DAC_OUTx = VREF+ * DOR / 4095
elmot 1:d0dfbce63a89 149 (+) with DOR is the Data Output Register
elmot 1:d0dfbce63a89 150 [..]
elmot 1:d0dfbce63a89 151 VEF+ is the input voltage reference (refer to the device datasheet)
elmot 1:d0dfbce63a89 152 [..]
elmot 1:d0dfbce63a89 153 e.g. To set DAC_OUT1 to 0.7V, use
elmot 1:d0dfbce63a89 154 (+) Assuming that VREF+ = 3.3V, DAC_OUT1 = (3.3 * 868) / 4095 = 0.7V
elmot 1:d0dfbce63a89 155
elmot 1:d0dfbce63a89 156 *** DMA requests ***
elmot 1:d0dfbce63a89 157 =====================
elmot 1:d0dfbce63a89 158 [..]
elmot 1:d0dfbce63a89 159 A DMA1 request can be generated when an external trigger (but not a software trigger)
elmot 1:d0dfbce63a89 160 occurs if DMA1 requests are enabled using HAL_DAC_Start_DMA().
elmot 1:d0dfbce63a89 161 DMA requests are mapped as following:
elmot 1:d0dfbce63a89 162 (#) DAC channel1: mapped either on
elmot 1:d0dfbce63a89 163 (++) DMA1 request 6 channel3
elmot 1:d0dfbce63a89 164 (++) or DMA2 request channel4 which must be already configured
elmot 1:d0dfbce63a89 165 (#) DAC channel2: mapped either on
elmot 1:d0dfbce63a89 166 (++) DMA1 request 5 channel4
elmot 1:d0dfbce63a89 167 (++) or DMA2 request 3 channel5 which must be already configured
elmot 1:d0dfbce63a89 168 [..]
elmot 1:d0dfbce63a89 169 (@) For Dual mode and specific signal (Triangle and noise) generation please
elmot 1:d0dfbce63a89 170 refer to Extended Features Driver description
elmot 1:d0dfbce63a89 171
elmot 1:d0dfbce63a89 172 ##### How to use this driver #####
elmot 1:d0dfbce63a89 173 ==============================================================================
elmot 1:d0dfbce63a89 174 [..]
elmot 1:d0dfbce63a89 175 (+) DAC APB clock must be enabled to get write access to DAC
elmot 1:d0dfbce63a89 176 registers using HAL_DAC_Init()
elmot 1:d0dfbce63a89 177 (+) Configure DAC_OUTx (DAC_OUT1: PA4, DAC_OUT2: PA5) in analog mode.
elmot 1:d0dfbce63a89 178 (+) Configure the DAC channel using HAL_DAC_ConfigChannel() function.
elmot 1:d0dfbce63a89 179 (+) Enable the DAC channel using HAL_DAC_Start() or HAL_DAC_Start_DMA() functions.
elmot 1:d0dfbce63a89 180
elmot 1:d0dfbce63a89 181 *** Calibration mode IO operation ***
elmot 1:d0dfbce63a89 182 ======================================
elmot 1:d0dfbce63a89 183 [..]
elmot 1:d0dfbce63a89 184 (+) Retrieve the factory trimming (calibration settings) using HAL_DACEx_GetTrimOffset()
elmot 1:d0dfbce63a89 185 (+) Run the calibration using HAL_DACEx_SelfCalibrate()
elmot 1:d0dfbce63a89 186 (+) Update the trimming while DAC running using HAL_DACEx_SetUserTrimming()
elmot 1:d0dfbce63a89 187
elmot 1:d0dfbce63a89 188 *** Polling mode IO operation ***
elmot 1:d0dfbce63a89 189 =================================
elmot 1:d0dfbce63a89 190 [..]
elmot 1:d0dfbce63a89 191 (+) Start the DAC peripheral using HAL_DAC_Start()
elmot 1:d0dfbce63a89 192 (+) To read the DAC last data output value, use the HAL_DAC_GetValue() function.
elmot 1:d0dfbce63a89 193 (+) Stop the DAC peripheral using HAL_DAC_Stop()
elmot 1:d0dfbce63a89 194
elmot 1:d0dfbce63a89 195 *** DMA mode IO operation ***
elmot 1:d0dfbce63a89 196 ==============================
elmot 1:d0dfbce63a89 197 [..]
elmot 1:d0dfbce63a89 198 (+) Start the DAC peripheral using HAL_DAC_Start_DMA(), at this stage the user specify the length
elmot 1:d0dfbce63a89 199 of data to be transferred at each end of conversion
elmot 1:d0dfbce63a89 200 (+) At the middle of data transfer HAL_DAC_ConvHalfCpltCallbackCh1() or HAL_DACEx_ConvHalfCpltCallbackCh2()
elmot 1:d0dfbce63a89 201 function is executed and user can add his own code by customization of function pointer
elmot 1:d0dfbce63a89 202 HAL_DAC_ConvHalfCpltCallbackCh1() or HAL_DACEx_ConvHalfCpltCallbackCh2()
elmot 1:d0dfbce63a89 203 (+) At The end of data transfer HAL_DAC_ConvCpltCallbackCh1() or HAL_DACEx_ConvHalfCpltCallbackCh2()
elmot 1:d0dfbce63a89 204 function is executed and user can add his own code by customization of function pointer
elmot 1:d0dfbce63a89 205 HAL_DAC_ConvCpltCallbackCh1() or HAL_DACEx_ConvHalfCpltCallbackCh2()
elmot 1:d0dfbce63a89 206 (+) In case of transfer Error, HAL_DAC_ErrorCallbackCh1() function is executed and user can
elmot 1:d0dfbce63a89 207 add his own code by customization of function pointer HAL_DAC_ErrorCallbackCh1
elmot 1:d0dfbce63a89 208 (+) In case of DMA underrun, DAC interruption triggers and execute internal function HAL_DAC_IRQHandler.
elmot 1:d0dfbce63a89 209 HAL_DAC_DMAUnderrunCallbackCh1() or HAL_DACEx_DMAUnderrunCallbackCh2()
elmot 1:d0dfbce63a89 210 function is executed and user can add his own code by customization of function pointer
elmot 1:d0dfbce63a89 211 HAL_DAC_DMAUnderrunCallbackCh1() or HAL_DACEx_DMAUnderrunCallbackCh2() and
elmot 1:d0dfbce63a89 212 add his own code by customization of function pointer HAL_DAC_ErrorCallbackCh1()
elmot 1:d0dfbce63a89 213 (+) Stop the DAC peripheral using HAL_DAC_Stop_DMA()
elmot 1:d0dfbce63a89 214
elmot 1:d0dfbce63a89 215 *** DAC HAL driver macros list ***
elmot 1:d0dfbce63a89 216 =============================================
elmot 1:d0dfbce63a89 217 [..]
elmot 1:d0dfbce63a89 218 Below the list of most used macros in DAC HAL driver.
elmot 1:d0dfbce63a89 219
elmot 1:d0dfbce63a89 220 (+) __HAL_DAC_ENABLE : Enable the DAC peripheral
elmot 1:d0dfbce63a89 221 (+) __HAL_DAC_DISABLE : Disable the DAC peripheral
elmot 1:d0dfbce63a89 222 (+) __HAL_DAC_CLEAR_FLAG: Clear the DAC's pending flags
elmot 1:d0dfbce63a89 223 (+) __HAL_DAC_GET_FLAG: Get the selected DAC's flag status
elmot 1:d0dfbce63a89 224
elmot 1:d0dfbce63a89 225 [..]
elmot 1:d0dfbce63a89 226 (@) You can refer to the DAC HAL driver header file for more useful macros
elmot 1:d0dfbce63a89 227
elmot 1:d0dfbce63a89 228 @endverbatim
elmot 1:d0dfbce63a89 229 ******************************************************************************
elmot 1:d0dfbce63a89 230 * @attention
elmot 1:d0dfbce63a89 231 *
elmot 1:d0dfbce63a89 232 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
elmot 1:d0dfbce63a89 233 *
elmot 1:d0dfbce63a89 234 * Redistribution and use in source and binary forms, with or without modification,
elmot 1:d0dfbce63a89 235 * are permitted provided that the following conditions are met:
elmot 1:d0dfbce63a89 236 * 1. Redistributions of source code must retain the above copyright notice,
elmot 1:d0dfbce63a89 237 * this list of conditions and the following disclaimer.
elmot 1:d0dfbce63a89 238 * 2. Redistributions in binary form must reproduce the above copyright notice,
elmot 1:d0dfbce63a89 239 * this list of conditions and the following disclaimer in the documentation
elmot 1:d0dfbce63a89 240 * and/or other materials provided with the distribution.
elmot 1:d0dfbce63a89 241 * 3. Neither the name of STMicroelectronics nor the names of its contributors
elmot 1:d0dfbce63a89 242 * may be used to endorse or promote products derived from this software
elmot 1:d0dfbce63a89 243 * without specific prior written permission.
elmot 1:d0dfbce63a89 244 *
elmot 1:d0dfbce63a89 245 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
elmot 1:d0dfbce63a89 246 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
elmot 1:d0dfbce63a89 247 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
elmot 1:d0dfbce63a89 248 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
elmot 1:d0dfbce63a89 249 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
elmot 1:d0dfbce63a89 250 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
elmot 1:d0dfbce63a89 251 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
elmot 1:d0dfbce63a89 252 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
elmot 1:d0dfbce63a89 253 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
elmot 1:d0dfbce63a89 254 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
elmot 1:d0dfbce63a89 255 *
elmot 1:d0dfbce63a89 256 ******************************************************************************
elmot 1:d0dfbce63a89 257 */
elmot 1:d0dfbce63a89 258
elmot 1:d0dfbce63a89 259
elmot 1:d0dfbce63a89 260 /* Includes ------------------------------------------------------------------*/
elmot 1:d0dfbce63a89 261 #include "stm32l4xx_hal.h"
elmot 1:d0dfbce63a89 262
elmot 1:d0dfbce63a89 263 /** @addtogroup STM32L4xx_HAL_Driver
elmot 1:d0dfbce63a89 264 * @{
elmot 1:d0dfbce63a89 265 */
elmot 1:d0dfbce63a89 266
elmot 1:d0dfbce63a89 267 /** @defgroup DAC DAC
elmot 1:d0dfbce63a89 268 * @brief DAC driver modules
elmot 1:d0dfbce63a89 269 * @{
elmot 1:d0dfbce63a89 270 */
elmot 1:d0dfbce63a89 271
elmot 1:d0dfbce63a89 272 #ifdef HAL_DAC_MODULE_ENABLED
elmot 1:d0dfbce63a89 273
elmot 1:d0dfbce63a89 274 /* Private typedef -----------------------------------------------------------*/
elmot 1:d0dfbce63a89 275 /* Private define ------------------------------------------------------------*/
elmot 1:d0dfbce63a89 276 /* Private constants ---------------------------------------------------------*/
elmot 1:d0dfbce63a89 277 /** @addtogroup DAC_Private_Constants DAC Private Constants
elmot 1:d0dfbce63a89 278 * @{
elmot 1:d0dfbce63a89 279 */
elmot 1:d0dfbce63a89 280 #define TIMEOUT_DAC_CALIBCONFIG ((uint32_t)1) /* 1ms */
elmot 1:d0dfbce63a89 281 /**
elmot 1:d0dfbce63a89 282 * @}
elmot 1:d0dfbce63a89 283 */
elmot 1:d0dfbce63a89 284
elmot 1:d0dfbce63a89 285 /* Private macro -------------------------------------------------------------*/
elmot 1:d0dfbce63a89 286 /* Private macro -------------------------------------------------------------*/
elmot 1:d0dfbce63a89 287 /* Private variables ---------------------------------------------------------*/
elmot 1:d0dfbce63a89 288 /* Private function prototypes -----------------------------------------------*/
elmot 1:d0dfbce63a89 289 /** @defgroup DAC_Private_Functions DAC Private Functions
elmot 1:d0dfbce63a89 290 * @{
elmot 1:d0dfbce63a89 291 */
elmot 1:d0dfbce63a89 292 static void DAC_DMAConvCpltCh1(DMA_HandleTypeDef *hdma);
elmot 1:d0dfbce63a89 293 static void DAC_DMAErrorCh1(DMA_HandleTypeDef *hdma);
elmot 1:d0dfbce63a89 294 static void DAC_DMAHalfConvCpltCh1(DMA_HandleTypeDef *hdma);
elmot 1:d0dfbce63a89 295 /**
elmot 1:d0dfbce63a89 296 * @}
elmot 1:d0dfbce63a89 297 */
elmot 1:d0dfbce63a89 298 /* Exported functions -------------------------------------------------------*/
elmot 1:d0dfbce63a89 299
elmot 1:d0dfbce63a89 300 /** @defgroup DAC_Exported_Functions DAC Exported Functions
elmot 1:d0dfbce63a89 301 * @{
elmot 1:d0dfbce63a89 302 */
elmot 1:d0dfbce63a89 303
elmot 1:d0dfbce63a89 304 /** @defgroup DAC_Exported_Functions_Group1 Initialization and de-initialization functions
elmot 1:d0dfbce63a89 305 * @brief Initialization and Configuration functions
elmot 1:d0dfbce63a89 306 *
elmot 1:d0dfbce63a89 307 @verbatim
elmot 1:d0dfbce63a89 308 ==============================================================================
elmot 1:d0dfbce63a89 309 ##### Initialization and de-initialization functions #####
elmot 1:d0dfbce63a89 310 ==============================================================================
elmot 1:d0dfbce63a89 311 [..] This section provides functions allowing to:
elmot 1:d0dfbce63a89 312 (+) Initialize and configure the DAC.
elmot 1:d0dfbce63a89 313 (+) De-initialize the DAC.
elmot 1:d0dfbce63a89 314
elmot 1:d0dfbce63a89 315 @endverbatim
elmot 1:d0dfbce63a89 316 * @{
elmot 1:d0dfbce63a89 317 */
elmot 1:d0dfbce63a89 318
elmot 1:d0dfbce63a89 319 /**
elmot 1:d0dfbce63a89 320 * @brief Initialize the DAC peripheral according to the specified parameters
elmot 1:d0dfbce63a89 321 * in the DAC_InitStruct and initialize the associated handle.
elmot 1:d0dfbce63a89 322 * @param hdac: pointer to a DAC_HandleTypeDef structure that contains
elmot 1:d0dfbce63a89 323 * the configuration information for the specified DAC.
elmot 1:d0dfbce63a89 324 * @retval HAL status
elmot 1:d0dfbce63a89 325 */
elmot 1:d0dfbce63a89 326 HAL_StatusTypeDef HAL_DAC_Init(DAC_HandleTypeDef* hdac)
elmot 1:d0dfbce63a89 327 {
elmot 1:d0dfbce63a89 328 /* Check DAC handle */
elmot 1:d0dfbce63a89 329 if(hdac == NULL)
elmot 1:d0dfbce63a89 330 {
elmot 1:d0dfbce63a89 331 return HAL_ERROR;
elmot 1:d0dfbce63a89 332 }
elmot 1:d0dfbce63a89 333 /* Check the parameters */
elmot 1:d0dfbce63a89 334 assert_param(IS_DAC_ALL_INSTANCE(hdac->Instance));
elmot 1:d0dfbce63a89 335
elmot 1:d0dfbce63a89 336 if(hdac->State == HAL_DAC_STATE_RESET)
elmot 1:d0dfbce63a89 337 {
elmot 1:d0dfbce63a89 338 /* Allocate lock resource and initialize it */
elmot 1:d0dfbce63a89 339 hdac->Lock = HAL_UNLOCKED;
elmot 1:d0dfbce63a89 340
elmot 1:d0dfbce63a89 341 /* Init the low level hardware */
elmot 1:d0dfbce63a89 342 HAL_DAC_MspInit(hdac);
elmot 1:d0dfbce63a89 343 }
elmot 1:d0dfbce63a89 344
elmot 1:d0dfbce63a89 345 /* Initialize the DAC state*/
elmot 1:d0dfbce63a89 346 hdac->State = HAL_DAC_STATE_BUSY;
elmot 1:d0dfbce63a89 347
elmot 1:d0dfbce63a89 348 /* Set DAC error code to none */
elmot 1:d0dfbce63a89 349 hdac->ErrorCode = HAL_DAC_ERROR_NONE;
elmot 1:d0dfbce63a89 350
elmot 1:d0dfbce63a89 351 /* Initialize the DAC state*/
elmot 1:d0dfbce63a89 352 hdac->State = HAL_DAC_STATE_READY;
elmot 1:d0dfbce63a89 353
elmot 1:d0dfbce63a89 354 /* Return function status */
elmot 1:d0dfbce63a89 355 return HAL_OK;
elmot 1:d0dfbce63a89 356 }
elmot 1:d0dfbce63a89 357
elmot 1:d0dfbce63a89 358 /**
elmot 1:d0dfbce63a89 359 * @brief Deinitialize the DAC peripheral registers to their default reset values.
elmot 1:d0dfbce63a89 360 * @param hdac: pointer to a DAC_HandleTypeDef structure that contains
elmot 1:d0dfbce63a89 361 * the configuration information for the specified DAC.
elmot 1:d0dfbce63a89 362 * @retval HAL status
elmot 1:d0dfbce63a89 363 */
elmot 1:d0dfbce63a89 364 HAL_StatusTypeDef HAL_DAC_DeInit(DAC_HandleTypeDef* hdac)
elmot 1:d0dfbce63a89 365 {
elmot 1:d0dfbce63a89 366 /* Check DAC handle */
elmot 1:d0dfbce63a89 367 if(hdac == NULL)
elmot 1:d0dfbce63a89 368 {
elmot 1:d0dfbce63a89 369 return HAL_ERROR;
elmot 1:d0dfbce63a89 370 }
elmot 1:d0dfbce63a89 371
elmot 1:d0dfbce63a89 372 /* Check the parameters */
elmot 1:d0dfbce63a89 373 assert_param(IS_DAC_ALL_INSTANCE(hdac->Instance));
elmot 1:d0dfbce63a89 374
elmot 1:d0dfbce63a89 375 /* Change DAC state */
elmot 1:d0dfbce63a89 376 hdac->State = HAL_DAC_STATE_BUSY;
elmot 1:d0dfbce63a89 377
elmot 1:d0dfbce63a89 378 /* DeInit the low level hardware */
elmot 1:d0dfbce63a89 379 HAL_DAC_MspDeInit(hdac);
elmot 1:d0dfbce63a89 380
elmot 1:d0dfbce63a89 381 /* Set DAC error code to none */
elmot 1:d0dfbce63a89 382 hdac->ErrorCode = HAL_DAC_ERROR_NONE;
elmot 1:d0dfbce63a89 383
elmot 1:d0dfbce63a89 384 /* Change DAC state */
elmot 1:d0dfbce63a89 385 hdac->State = HAL_DAC_STATE_RESET;
elmot 1:d0dfbce63a89 386
elmot 1:d0dfbce63a89 387 /* Release Lock */
elmot 1:d0dfbce63a89 388 __HAL_UNLOCK(hdac);
elmot 1:d0dfbce63a89 389
elmot 1:d0dfbce63a89 390 /* Return function status */
elmot 1:d0dfbce63a89 391 return HAL_OK;
elmot 1:d0dfbce63a89 392 }
elmot 1:d0dfbce63a89 393
elmot 1:d0dfbce63a89 394 /**
elmot 1:d0dfbce63a89 395 * @brief Initialize the DAC MSP.
elmot 1:d0dfbce63a89 396 * @param hdac: pointer to a DAC_HandleTypeDef structure that contains
elmot 1:d0dfbce63a89 397 * the configuration information for the specified DAC.
elmot 1:d0dfbce63a89 398 * @retval None
elmot 1:d0dfbce63a89 399 */
elmot 1:d0dfbce63a89 400 __weak void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)
elmot 1:d0dfbce63a89 401 {
elmot 1:d0dfbce63a89 402 /* Prevent unused argument(s) compilation warning */
elmot 1:d0dfbce63a89 403 UNUSED(hdac);
elmot 1:d0dfbce63a89 404
elmot 1:d0dfbce63a89 405 /* NOTE : This function should not be modified, when the callback is needed,
elmot 1:d0dfbce63a89 406 the HAL_DAC_MspInit could be implemented in the user file
elmot 1:d0dfbce63a89 407 */
elmot 1:d0dfbce63a89 408 }
elmot 1:d0dfbce63a89 409
elmot 1:d0dfbce63a89 410 /**
elmot 1:d0dfbce63a89 411 * @brief DeInitialize the DAC MSP.
elmot 1:d0dfbce63a89 412 * @param hdac: pointer to a DAC_HandleTypeDef structure that contains
elmot 1:d0dfbce63a89 413 * the configuration information for the specified DAC.
elmot 1:d0dfbce63a89 414 * @retval None
elmot 1:d0dfbce63a89 415 */
elmot 1:d0dfbce63a89 416 __weak void HAL_DAC_MspDeInit(DAC_HandleTypeDef* hdac)
elmot 1:d0dfbce63a89 417 {
elmot 1:d0dfbce63a89 418 /* Prevent unused argument(s) compilation warning */
elmot 1:d0dfbce63a89 419 UNUSED(hdac);
elmot 1:d0dfbce63a89 420
elmot 1:d0dfbce63a89 421 /* NOTE : This function should not be modified, when the callback is needed,
elmot 1:d0dfbce63a89 422 the HAL_DAC_MspDeInit could be implemented in the user file
elmot 1:d0dfbce63a89 423 */
elmot 1:d0dfbce63a89 424 }
elmot 1:d0dfbce63a89 425
elmot 1:d0dfbce63a89 426 /**
elmot 1:d0dfbce63a89 427 * @}
elmot 1:d0dfbce63a89 428 */
elmot 1:d0dfbce63a89 429
elmot 1:d0dfbce63a89 430 /** @defgroup DAC_Exported_Functions_Group2 IO operation functions
elmot 1:d0dfbce63a89 431 * @brief IO operation functions
elmot 1:d0dfbce63a89 432 *
elmot 1:d0dfbce63a89 433 @verbatim
elmot 1:d0dfbce63a89 434 ==============================================================================
elmot 1:d0dfbce63a89 435 ##### IO operation functions #####
elmot 1:d0dfbce63a89 436 ==============================================================================
elmot 1:d0dfbce63a89 437 [..] This section provides functions allowing to:
elmot 1:d0dfbce63a89 438 (+) Start conversion.
elmot 1:d0dfbce63a89 439 (+) Stop conversion.
elmot 1:d0dfbce63a89 440 (+) Start conversion and enable DMA transfer.
elmot 1:d0dfbce63a89 441 (+) Stop conversion and disable DMA transfer.
elmot 1:d0dfbce63a89 442 (+) Get result of conversion.
elmot 1:d0dfbce63a89 443
elmot 1:d0dfbce63a89 444 @endverbatim
elmot 1:d0dfbce63a89 445 * @{
elmot 1:d0dfbce63a89 446 */
elmot 1:d0dfbce63a89 447
elmot 1:d0dfbce63a89 448 /**
elmot 1:d0dfbce63a89 449 * @brief Enables DAC and starts conversion of channel.
elmot 1:d0dfbce63a89 450 * @param hdac: pointer to a DAC_HandleTypeDef structure that contains
elmot 1:d0dfbce63a89 451 * the configuration information for the specified DAC.
elmot 1:d0dfbce63a89 452 * @param Channel: The selected DAC channel.
elmot 1:d0dfbce63a89 453 * This parameter can be one of the following values:
elmot 1:d0dfbce63a89 454 * @arg DAC_CHANNEL_1: DAC Channel1 selected
elmot 1:d0dfbce63a89 455 * @arg DAC_CHANNEL_2: DAC Channel2 selected
elmot 1:d0dfbce63a89 456 * @retval HAL status
elmot 1:d0dfbce63a89 457 */
elmot 1:d0dfbce63a89 458 HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef* hdac, uint32_t Channel)
elmot 1:d0dfbce63a89 459 {
elmot 1:d0dfbce63a89 460 /* Check the parameters */
elmot 1:d0dfbce63a89 461 assert_param(IS_DAC_CHANNEL(Channel));
elmot 1:d0dfbce63a89 462
elmot 1:d0dfbce63a89 463 /* Process locked */
elmot 1:d0dfbce63a89 464 __HAL_LOCK(hdac);
elmot 1:d0dfbce63a89 465
elmot 1:d0dfbce63a89 466 /* Change DAC state */
elmot 1:d0dfbce63a89 467 hdac->State = HAL_DAC_STATE_BUSY;
elmot 1:d0dfbce63a89 468
elmot 1:d0dfbce63a89 469 /* Enable the Peripheral */
elmot 1:d0dfbce63a89 470 __HAL_DAC_ENABLE(hdac, Channel);
elmot 1:d0dfbce63a89 471
elmot 1:d0dfbce63a89 472 if(Channel == DAC_CHANNEL_1)
elmot 1:d0dfbce63a89 473 {
elmot 1:d0dfbce63a89 474 /* Check if software trigger enabled */
elmot 1:d0dfbce63a89 475 if((hdac->Instance->CR & (DAC_CR_TEN1 | DAC_CR_TSEL1)) == (DAC_CR_TEN1 | DAC_CR_TSEL1))
elmot 1:d0dfbce63a89 476 {
elmot 1:d0dfbce63a89 477 /* Enable the selected DAC software conversion */
elmot 1:d0dfbce63a89 478 SET_BIT(hdac->Instance->SWTRIGR, DAC_SWTRIGR_SWTRIG1);
elmot 1:d0dfbce63a89 479 }
elmot 1:d0dfbce63a89 480 }
elmot 1:d0dfbce63a89 481 else
elmot 1:d0dfbce63a89 482 {
elmot 1:d0dfbce63a89 483 /* Check if software trigger enabled */
elmot 1:d0dfbce63a89 484 if((hdac->Instance->CR & (DAC_CR_TEN2 | DAC_CR_TSEL2)) == (DAC_CR_TEN2 | DAC_CR_TSEL2))
elmot 1:d0dfbce63a89 485 {
elmot 1:d0dfbce63a89 486 /* Enable the selected DAC software conversion*/
elmot 1:d0dfbce63a89 487 SET_BIT(hdac->Instance->SWTRIGR, DAC_SWTRIGR_SWTRIG2);
elmot 1:d0dfbce63a89 488 }
elmot 1:d0dfbce63a89 489 }
elmot 1:d0dfbce63a89 490
elmot 1:d0dfbce63a89 491 /* Change DAC state */
elmot 1:d0dfbce63a89 492 hdac->State = HAL_DAC_STATE_READY;
elmot 1:d0dfbce63a89 493
elmot 1:d0dfbce63a89 494 /* Process unlocked */
elmot 1:d0dfbce63a89 495 __HAL_UNLOCK(hdac);
elmot 1:d0dfbce63a89 496
elmot 1:d0dfbce63a89 497 /* Return function status */
elmot 1:d0dfbce63a89 498 return HAL_OK;
elmot 1:d0dfbce63a89 499 }
elmot 1:d0dfbce63a89 500
elmot 1:d0dfbce63a89 501 /**
elmot 1:d0dfbce63a89 502 * @brief Disables DAC and stop conversion of channel.
elmot 1:d0dfbce63a89 503 * @param hdac: pointer to a DAC_HandleTypeDef structure that contains
elmot 1:d0dfbce63a89 504 * the configuration information for the specified DAC.
elmot 1:d0dfbce63a89 505 * @param Channel: The selected DAC channel.
elmot 1:d0dfbce63a89 506 * This parameter can be one of the following values:
elmot 1:d0dfbce63a89 507 * @arg DAC_CHANNEL_1: DAC Channel1 selected
elmot 1:d0dfbce63a89 508 * @arg DAC_CHANNEL_2: DAC Channel2 selected
elmot 1:d0dfbce63a89 509 * @retval HAL status
elmot 1:d0dfbce63a89 510 */
elmot 1:d0dfbce63a89 511 HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef* hdac, uint32_t Channel)
elmot 1:d0dfbce63a89 512 {
elmot 1:d0dfbce63a89 513 /* Check the parameters */
elmot 1:d0dfbce63a89 514 assert_param(IS_DAC_CHANNEL(Channel));
elmot 1:d0dfbce63a89 515
elmot 1:d0dfbce63a89 516 /* Disable the Peripheral */
elmot 1:d0dfbce63a89 517 __HAL_DAC_DISABLE(hdac, Channel);
elmot 1:d0dfbce63a89 518
elmot 1:d0dfbce63a89 519 /* Change DAC state */
elmot 1:d0dfbce63a89 520 hdac->State = HAL_DAC_STATE_READY;
elmot 1:d0dfbce63a89 521
elmot 1:d0dfbce63a89 522 /* Return function status */
elmot 1:d0dfbce63a89 523 return HAL_OK;
elmot 1:d0dfbce63a89 524 }
elmot 1:d0dfbce63a89 525
elmot 1:d0dfbce63a89 526 /**
elmot 1:d0dfbce63a89 527 * @brief Enables DAC and starts conversion of channel.
elmot 1:d0dfbce63a89 528 * @param hdac: pointer to a DAC_HandleTypeDef structure that contains
elmot 1:d0dfbce63a89 529 * the configuration information for the specified DAC.
elmot 1:d0dfbce63a89 530 * @param Channel: The selected DAC channel.
elmot 1:d0dfbce63a89 531 * This parameter can be one of the following values:
elmot 1:d0dfbce63a89 532 * @arg DAC_CHANNEL_1: DAC Channel1 selected
elmot 1:d0dfbce63a89 533 * @arg DAC_CHANNEL_2: DAC Channel2 selected
elmot 1:d0dfbce63a89 534 * @param pData: The destination peripheral Buffer address.
elmot 1:d0dfbce63a89 535 * @param Length: The length of data to be transferred from memory to DAC peripheral
elmot 1:d0dfbce63a89 536 * @param Alignment: Specifies the data alignment for DAC channel.
elmot 1:d0dfbce63a89 537 * This parameter can be one of the following values:
elmot 1:d0dfbce63a89 538 * @arg DAC_ALIGN_8B_R: 8bit right data alignment selected
elmot 1:d0dfbce63a89 539 * @arg DAC_ALIGN_12B_L: 12bit left data alignment selected
elmot 1:d0dfbce63a89 540 * @arg DAC_ALIGN_12B_R: 12bit right data alignment selected
elmot 1:d0dfbce63a89 541 * @retval HAL status
elmot 1:d0dfbce63a89 542 */
elmot 1:d0dfbce63a89 543 HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t* pData, uint32_t Length, uint32_t Alignment)
elmot 1:d0dfbce63a89 544 {
elmot 1:d0dfbce63a89 545 uint32_t tmpreg = 0;
elmot 1:d0dfbce63a89 546
elmot 1:d0dfbce63a89 547 /* Check the parameters */
elmot 1:d0dfbce63a89 548 assert_param(IS_DAC_CHANNEL(Channel));
elmot 1:d0dfbce63a89 549 assert_param(IS_DAC_ALIGN(Alignment));
elmot 1:d0dfbce63a89 550
elmot 1:d0dfbce63a89 551 /* Process locked */
elmot 1:d0dfbce63a89 552 __HAL_LOCK(hdac);
elmot 1:d0dfbce63a89 553
elmot 1:d0dfbce63a89 554 /* Change DAC state */
elmot 1:d0dfbce63a89 555 hdac->State = HAL_DAC_STATE_BUSY;
elmot 1:d0dfbce63a89 556
elmot 1:d0dfbce63a89 557 if(Channel == DAC_CHANNEL_1)
elmot 1:d0dfbce63a89 558 {
elmot 1:d0dfbce63a89 559 /* Set the DMA transfer complete callback for channel1 */
elmot 1:d0dfbce63a89 560 hdac->DMA_Handle1->XferCpltCallback = DAC_DMAConvCpltCh1;
elmot 1:d0dfbce63a89 561
elmot 1:d0dfbce63a89 562 /* Set the DMA half transfer complete callback for channel1 */
elmot 1:d0dfbce63a89 563 hdac->DMA_Handle1->XferHalfCpltCallback = DAC_DMAHalfConvCpltCh1;
elmot 1:d0dfbce63a89 564
elmot 1:d0dfbce63a89 565 /* Set the DMA error callback for channel1 */
elmot 1:d0dfbce63a89 566 hdac->DMA_Handle1->XferErrorCallback = DAC_DMAErrorCh1;
elmot 1:d0dfbce63a89 567
elmot 1:d0dfbce63a89 568 /* Enable the selected DAC channel1 DMA request */
elmot 1:d0dfbce63a89 569 SET_BIT(hdac->Instance->CR, DAC_CR_DMAEN1);
elmot 1:d0dfbce63a89 570
elmot 1:d0dfbce63a89 571 /* Case of use of channel 1 */
elmot 1:d0dfbce63a89 572 switch(Alignment)
elmot 1:d0dfbce63a89 573 {
elmot 1:d0dfbce63a89 574 case DAC_ALIGN_12B_R:
elmot 1:d0dfbce63a89 575 /* Get DHR12R1 address */
elmot 1:d0dfbce63a89 576 tmpreg = (uint32_t)&hdac->Instance->DHR12R1;
elmot 1:d0dfbce63a89 577 break;
elmot 1:d0dfbce63a89 578 case DAC_ALIGN_12B_L:
elmot 1:d0dfbce63a89 579 /* Get DHR12L1 address */
elmot 1:d0dfbce63a89 580 tmpreg = (uint32_t)&hdac->Instance->DHR12L1;
elmot 1:d0dfbce63a89 581 break;
elmot 1:d0dfbce63a89 582 case DAC_ALIGN_8B_R:
elmot 1:d0dfbce63a89 583 /* Get DHR8R1 address */
elmot 1:d0dfbce63a89 584 tmpreg = (uint32_t)&hdac->Instance->DHR8R1;
elmot 1:d0dfbce63a89 585 break;
elmot 1:d0dfbce63a89 586 default:
elmot 1:d0dfbce63a89 587 break;
elmot 1:d0dfbce63a89 588 }
elmot 1:d0dfbce63a89 589 }
elmot 1:d0dfbce63a89 590 else
elmot 1:d0dfbce63a89 591 {
elmot 1:d0dfbce63a89 592 /* Set the DMA transfer complete callback for channel2 */
elmot 1:d0dfbce63a89 593 hdac->DMA_Handle2->XferCpltCallback = DAC_DMAConvCpltCh2;
elmot 1:d0dfbce63a89 594
elmot 1:d0dfbce63a89 595 /* Set the DMA half transfer complete callback for channel2 */
elmot 1:d0dfbce63a89 596 hdac->DMA_Handle2->XferHalfCpltCallback = DAC_DMAHalfConvCpltCh2;
elmot 1:d0dfbce63a89 597
elmot 1:d0dfbce63a89 598 /* Set the DMA error callback for channel2 */
elmot 1:d0dfbce63a89 599 hdac->DMA_Handle2->XferErrorCallback = DAC_DMAErrorCh2;
elmot 1:d0dfbce63a89 600
elmot 1:d0dfbce63a89 601 /* Enable the selected DAC channel2 DMA request */
elmot 1:d0dfbce63a89 602 SET_BIT(hdac->Instance->CR, DAC_CR_DMAEN2);
elmot 1:d0dfbce63a89 603
elmot 1:d0dfbce63a89 604 /* Case of use of channel 2 */
elmot 1:d0dfbce63a89 605 switch(Alignment)
elmot 1:d0dfbce63a89 606 {
elmot 1:d0dfbce63a89 607 case DAC_ALIGN_12B_R:
elmot 1:d0dfbce63a89 608 /* Get DHR12R2 address */
elmot 1:d0dfbce63a89 609 tmpreg = (uint32_t)&hdac->Instance->DHR12R2;
elmot 1:d0dfbce63a89 610 break;
elmot 1:d0dfbce63a89 611 case DAC_ALIGN_12B_L:
elmot 1:d0dfbce63a89 612 /* Get DHR12L2 address */
elmot 1:d0dfbce63a89 613 tmpreg = (uint32_t)&hdac->Instance->DHR12L2;
elmot 1:d0dfbce63a89 614 break;
elmot 1:d0dfbce63a89 615 case DAC_ALIGN_8B_R:
elmot 1:d0dfbce63a89 616 /* Get DHR8R2 address */
elmot 1:d0dfbce63a89 617 tmpreg = (uint32_t)&hdac->Instance->DHR8R2;
elmot 1:d0dfbce63a89 618 break;
elmot 1:d0dfbce63a89 619 default:
elmot 1:d0dfbce63a89 620 break;
elmot 1:d0dfbce63a89 621 }
elmot 1:d0dfbce63a89 622 }
elmot 1:d0dfbce63a89 623
elmot 1:d0dfbce63a89 624 /* Enable the DMA channel */
elmot 1:d0dfbce63a89 625 if(Channel == DAC_CHANNEL_1)
elmot 1:d0dfbce63a89 626 {
elmot 1:d0dfbce63a89 627 /* Enable the DAC DMA underrun interrupt */
elmot 1:d0dfbce63a89 628 __HAL_DAC_ENABLE_IT(hdac, DAC_IT_DMAUDR1);
elmot 1:d0dfbce63a89 629
elmot 1:d0dfbce63a89 630 /* Enable the DMA channel */
elmot 1:d0dfbce63a89 631 HAL_DMA_Start_IT(hdac->DMA_Handle1, (uint32_t)pData, tmpreg, Length);
elmot 1:d0dfbce63a89 632 }
elmot 1:d0dfbce63a89 633 else
elmot 1:d0dfbce63a89 634 {
elmot 1:d0dfbce63a89 635 /* Enable the DAC DMA underrun interrupt */
elmot 1:d0dfbce63a89 636 __HAL_DAC_ENABLE_IT(hdac, DAC_IT_DMAUDR2);
elmot 1:d0dfbce63a89 637
elmot 1:d0dfbce63a89 638 /* Enable the DMA channel */
elmot 1:d0dfbce63a89 639 HAL_DMA_Start_IT(hdac->DMA_Handle2, (uint32_t)pData, tmpreg, Length);
elmot 1:d0dfbce63a89 640 }
elmot 1:d0dfbce63a89 641
elmot 1:d0dfbce63a89 642 /* Process Unlocked */
elmot 1:d0dfbce63a89 643 __HAL_UNLOCK(hdac);
elmot 1:d0dfbce63a89 644
elmot 1:d0dfbce63a89 645 /* Enable the Peripheral */
elmot 1:d0dfbce63a89 646 __HAL_DAC_ENABLE(hdac, Channel);
elmot 1:d0dfbce63a89 647
elmot 1:d0dfbce63a89 648 /* Return function status */
elmot 1:d0dfbce63a89 649 return HAL_OK;
elmot 1:d0dfbce63a89 650 }
elmot 1:d0dfbce63a89 651
elmot 1:d0dfbce63a89 652 /**
elmot 1:d0dfbce63a89 653 * @brief Disables DAC and stop conversion of channel.
elmot 1:d0dfbce63a89 654 * @param hdac: pointer to a DAC_HandleTypeDef structure that contains
elmot 1:d0dfbce63a89 655 * the configuration information for the specified DAC.
elmot 1:d0dfbce63a89 656 * @param Channel: The selected DAC channel.
elmot 1:d0dfbce63a89 657 * This parameter can be one of the following values:
elmot 1:d0dfbce63a89 658 * @arg DAC_CHANNEL_1: DAC Channel1 selected
elmot 1:d0dfbce63a89 659 * @arg DAC_CHANNEL_2: DAC Channel2 selected
elmot 1:d0dfbce63a89 660 * @retval HAL status
elmot 1:d0dfbce63a89 661 */
elmot 1:d0dfbce63a89 662 HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel)
elmot 1:d0dfbce63a89 663 {
elmot 1:d0dfbce63a89 664 HAL_StatusTypeDef status = HAL_OK;
elmot 1:d0dfbce63a89 665
elmot 1:d0dfbce63a89 666 /* Check the parameters */
elmot 1:d0dfbce63a89 667 assert_param(IS_DAC_CHANNEL(Channel));
elmot 1:d0dfbce63a89 668
elmot 1:d0dfbce63a89 669 /* Disable the selected DAC channel DMA request */
elmot 1:d0dfbce63a89 670 hdac->Instance->CR &= ~(DAC_CR_DMAEN1 << Channel);
elmot 1:d0dfbce63a89 671
elmot 1:d0dfbce63a89 672 /* Disable the Peripheral */
elmot 1:d0dfbce63a89 673 __HAL_DAC_DISABLE(hdac, Channel);
elmot 1:d0dfbce63a89 674
elmot 1:d0dfbce63a89 675 /* Disable the DMA channel */
elmot 1:d0dfbce63a89 676 /* Channel1 is used */
elmot 1:d0dfbce63a89 677 if (Channel == DAC_CHANNEL_1)
elmot 1:d0dfbce63a89 678 {
elmot 1:d0dfbce63a89 679 /* Disable the DMA channel */
elmot 1:d0dfbce63a89 680 status = HAL_DMA_Abort(hdac->DMA_Handle1);
elmot 1:d0dfbce63a89 681
elmot 1:d0dfbce63a89 682 /* Disable the DAC DMA underrun interrupt */
elmot 1:d0dfbce63a89 683 __HAL_DAC_DISABLE_IT(hdac, DAC_IT_DMAUDR1);
elmot 1:d0dfbce63a89 684 }
elmot 1:d0dfbce63a89 685 else /* Channel2 is used for */
elmot 1:d0dfbce63a89 686 {
elmot 1:d0dfbce63a89 687 /* Disable the DMA channel */
elmot 1:d0dfbce63a89 688 status = HAL_DMA_Abort(hdac->DMA_Handle2);
elmot 1:d0dfbce63a89 689
elmot 1:d0dfbce63a89 690 /* Disable the DAC DMA underrun interrupt */
elmot 1:d0dfbce63a89 691 __HAL_DAC_DISABLE_IT(hdac, DAC_IT_DMAUDR2);
elmot 1:d0dfbce63a89 692 }
elmot 1:d0dfbce63a89 693
elmot 1:d0dfbce63a89 694 /* Check if DMA Channel effectively disabled */
elmot 1:d0dfbce63a89 695 if (status != HAL_OK)
elmot 1:d0dfbce63a89 696 {
elmot 1:d0dfbce63a89 697 /* Update DAC state machine to error */
elmot 1:d0dfbce63a89 698 hdac->State = HAL_DAC_STATE_ERROR;
elmot 1:d0dfbce63a89 699 }
elmot 1:d0dfbce63a89 700 else
elmot 1:d0dfbce63a89 701 {
elmot 1:d0dfbce63a89 702 /* Change DAC state */
elmot 1:d0dfbce63a89 703 hdac->State = HAL_DAC_STATE_READY;
elmot 1:d0dfbce63a89 704 }
elmot 1:d0dfbce63a89 705
elmot 1:d0dfbce63a89 706 /* Return function status */
elmot 1:d0dfbce63a89 707 return status;
elmot 1:d0dfbce63a89 708 }
elmot 1:d0dfbce63a89 709
elmot 1:d0dfbce63a89 710 /* DAC channel 2 is available on top of DAC channel 1 */
elmot 1:d0dfbce63a89 711
elmot 1:d0dfbce63a89 712 /**
elmot 1:d0dfbce63a89 713 * @brief Handles DAC interrupt request
elmot 1:d0dfbce63a89 714 * This function uses the interruption of DMA
elmot 1:d0dfbce63a89 715 * underrun.
elmot 1:d0dfbce63a89 716 * @param hdac: pointer to a DAC_HandleTypeDef structure that contains
elmot 1:d0dfbce63a89 717 * the configuration information for the specified DAC.
elmot 1:d0dfbce63a89 718 * @retval None
elmot 1:d0dfbce63a89 719 */
elmot 1:d0dfbce63a89 720 void HAL_DAC_IRQHandler(DAC_HandleTypeDef* hdac)
elmot 1:d0dfbce63a89 721 {
elmot 1:d0dfbce63a89 722 if(__HAL_DAC_GET_IT_SOURCE(hdac, DAC_IT_DMAUDR1))
elmot 1:d0dfbce63a89 723 {
elmot 1:d0dfbce63a89 724 /* Check underrun flag of DAC channel 1 */
elmot 1:d0dfbce63a89 725 if(__HAL_DAC_GET_FLAG(hdac, DAC_FLAG_DMAUDR1))
elmot 1:d0dfbce63a89 726 {
elmot 1:d0dfbce63a89 727 /* Change DAC state to error state */
elmot 1:d0dfbce63a89 728 hdac->State = HAL_DAC_STATE_ERROR;
elmot 1:d0dfbce63a89 729
elmot 1:d0dfbce63a89 730 /* Set DAC error code to chanel1 DMA underrun error */
elmot 1:d0dfbce63a89 731 SET_BIT(hdac->ErrorCode, HAL_DAC_ERROR_DMAUNDERRUNCH1);
elmot 1:d0dfbce63a89 732
elmot 1:d0dfbce63a89 733 /* Clear the underrun flag */
elmot 1:d0dfbce63a89 734 __HAL_DAC_CLEAR_FLAG(hdac,DAC_FLAG_DMAUDR1);
elmot 1:d0dfbce63a89 735
elmot 1:d0dfbce63a89 736 /* Disable the selected DAC channel1 DMA request */
elmot 1:d0dfbce63a89 737 CLEAR_BIT(hdac->Instance->CR, DAC_CR_DMAEN1);
elmot 1:d0dfbce63a89 738
elmot 1:d0dfbce63a89 739 /* Error callback */
elmot 1:d0dfbce63a89 740 HAL_DAC_DMAUnderrunCallbackCh1(hdac);
elmot 1:d0dfbce63a89 741 }
elmot 1:d0dfbce63a89 742 }
elmot 1:d0dfbce63a89 743 if(__HAL_DAC_GET_IT_SOURCE(hdac, DAC_IT_DMAUDR2))
elmot 1:d0dfbce63a89 744 {
elmot 1:d0dfbce63a89 745 /* Check underrun flag of DAC channel 1 */
elmot 1:d0dfbce63a89 746 if(__HAL_DAC_GET_FLAG(hdac, DAC_FLAG_DMAUDR2))
elmot 1:d0dfbce63a89 747 {
elmot 1:d0dfbce63a89 748 /* Change DAC state to error state */
elmot 1:d0dfbce63a89 749 hdac->State = HAL_DAC_STATE_ERROR;
elmot 1:d0dfbce63a89 750
elmot 1:d0dfbce63a89 751 /* Set DAC error code to channel2 DMA underrun error */
elmot 1:d0dfbce63a89 752 SET_BIT(hdac->ErrorCode, HAL_DAC_ERROR_DMAUNDERRUNCH2);
elmot 1:d0dfbce63a89 753
elmot 1:d0dfbce63a89 754 /* Clear the underrun flag */
elmot 1:d0dfbce63a89 755 __HAL_DAC_CLEAR_FLAG(hdac,DAC_FLAG_DMAUDR2);
elmot 1:d0dfbce63a89 756
elmot 1:d0dfbce63a89 757 /* Disable the selected DAC channel1 DMA request */
elmot 1:d0dfbce63a89 758 CLEAR_BIT(hdac->Instance->CR, DAC_CR_DMAEN2);
elmot 1:d0dfbce63a89 759
elmot 1:d0dfbce63a89 760 /* Error callback */
elmot 1:d0dfbce63a89 761 HAL_DACEx_DMAUnderrunCallbackCh2(hdac);
elmot 1:d0dfbce63a89 762 }
elmot 1:d0dfbce63a89 763 }
elmot 1:d0dfbce63a89 764 }
elmot 1:d0dfbce63a89 765
elmot 1:d0dfbce63a89 766 /**
elmot 1:d0dfbce63a89 767 * @brief Set the specified data holding register value for DAC channel.
elmot 1:d0dfbce63a89 768 * @param hdac: pointer to a DAC_HandleTypeDef structure that contains
elmot 1:d0dfbce63a89 769 * the configuration information for the specified DAC.
elmot 1:d0dfbce63a89 770 * @param Channel: The selected DAC channel.
elmot 1:d0dfbce63a89 771 * This parameter can be one of the following values:
elmot 1:d0dfbce63a89 772 * @arg DAC_CHANNEL_1: DAC Channel1 selected
elmot 1:d0dfbce63a89 773 * @arg DAC_CHANNEL_2: DAC Channel2 selected
elmot 1:d0dfbce63a89 774 * @param Alignment: Specifies the data alignment.
elmot 1:d0dfbce63a89 775 * This parameter can be one of the following values:
elmot 1:d0dfbce63a89 776 * @arg DAC_ALIGN_8B_R: 8bit right data alignment selected
elmot 1:d0dfbce63a89 777 * @arg DAC_ALIGN_12B_L: 12bit left data alignment selected
elmot 1:d0dfbce63a89 778 * @arg DAC_ALIGN_12B_R: 12bit right data alignment selected
elmot 1:d0dfbce63a89 779 * @param Data: Data to be loaded in the selected data holding register.
elmot 1:d0dfbce63a89 780 * @retval HAL status
elmot 1:d0dfbce63a89 781 */
elmot 1:d0dfbce63a89 782 HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data)
elmot 1:d0dfbce63a89 783 {
elmot 1:d0dfbce63a89 784 __IO uint32_t tmp = 0;
elmot 1:d0dfbce63a89 785
elmot 1:d0dfbce63a89 786 /* Check the parameters */
elmot 1:d0dfbce63a89 787 assert_param(IS_DAC_CHANNEL(Channel));
elmot 1:d0dfbce63a89 788 assert_param(IS_DAC_ALIGN(Alignment));
elmot 1:d0dfbce63a89 789 assert_param(IS_DAC_DATA(Data));
elmot 1:d0dfbce63a89 790
elmot 1:d0dfbce63a89 791 tmp = (uint32_t)hdac->Instance;
elmot 1:d0dfbce63a89 792 if(Channel == DAC_CHANNEL_1)
elmot 1:d0dfbce63a89 793 {
elmot 1:d0dfbce63a89 794 tmp += DAC_DHR12R1_ALIGNMENT(Alignment);
elmot 1:d0dfbce63a89 795 }
elmot 1:d0dfbce63a89 796 else
elmot 1:d0dfbce63a89 797 {
elmot 1:d0dfbce63a89 798 tmp += DAC_DHR12R2_ALIGNMENT(Alignment);
elmot 1:d0dfbce63a89 799 }
elmot 1:d0dfbce63a89 800
elmot 1:d0dfbce63a89 801 /* Set the DAC channel selected data holding register */
elmot 1:d0dfbce63a89 802 *(__IO uint32_t *) tmp = Data;
elmot 1:d0dfbce63a89 803
elmot 1:d0dfbce63a89 804 /* Return function status */
elmot 1:d0dfbce63a89 805 return HAL_OK;
elmot 1:d0dfbce63a89 806 }
elmot 1:d0dfbce63a89 807
elmot 1:d0dfbce63a89 808 /**
elmot 1:d0dfbce63a89 809 * @brief Conversion complete callback in non-blocking mode for Channel1
elmot 1:d0dfbce63a89 810 * @param hdac: pointer to a DAC_HandleTypeDef structure that contains
elmot 1:d0dfbce63a89 811 * the configuration information for the specified DAC.
elmot 1:d0dfbce63a89 812 * @retval None
elmot 1:d0dfbce63a89 813 */
elmot 1:d0dfbce63a89 814 __weak void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef* hdac)
elmot 1:d0dfbce63a89 815 {
elmot 1:d0dfbce63a89 816 /* Prevent unused argument(s) compilation warning */
elmot 1:d0dfbce63a89 817 UNUSED(hdac);
elmot 1:d0dfbce63a89 818
elmot 1:d0dfbce63a89 819 /* NOTE : This function should not be modified, when the callback is needed,
elmot 1:d0dfbce63a89 820 the HAL_DAC_ConvCpltCallbackCh1 could be implemented in the user file
elmot 1:d0dfbce63a89 821 */
elmot 1:d0dfbce63a89 822 }
elmot 1:d0dfbce63a89 823
elmot 1:d0dfbce63a89 824 /**
elmot 1:d0dfbce63a89 825 * @brief Conversion half DMA transfer callback in non-blocking mode for Channel1
elmot 1:d0dfbce63a89 826 * @param hdac: pointer to a DAC_HandleTypeDef structure that contains
elmot 1:d0dfbce63a89 827 * the configuration information for the specified DAC.
elmot 1:d0dfbce63a89 828 * @retval None
elmot 1:d0dfbce63a89 829 */
elmot 1:d0dfbce63a89 830 __weak void HAL_DAC_ConvHalfCpltCallbackCh1(DAC_HandleTypeDef* hdac)
elmot 1:d0dfbce63a89 831 {
elmot 1:d0dfbce63a89 832 /* Prevent unused argument(s) compilation warning */
elmot 1:d0dfbce63a89 833 UNUSED(hdac);
elmot 1:d0dfbce63a89 834
elmot 1:d0dfbce63a89 835 /* NOTE : This function should not be modified, when the callback is needed,
elmot 1:d0dfbce63a89 836 the HAL_DAC_ConvHalfCpltCallbackCh1 could be implemented in the user file
elmot 1:d0dfbce63a89 837 */
elmot 1:d0dfbce63a89 838 }
elmot 1:d0dfbce63a89 839
elmot 1:d0dfbce63a89 840 /**
elmot 1:d0dfbce63a89 841 * @brief Error DAC callback for Channel1.
elmot 1:d0dfbce63a89 842 * @param hdac: pointer to a DAC_HandleTypeDef structure that contains
elmot 1:d0dfbce63a89 843 * the configuration information for the specified DAC.
elmot 1:d0dfbce63a89 844 * @retval None
elmot 1:d0dfbce63a89 845 */
elmot 1:d0dfbce63a89 846 __weak void HAL_DAC_ErrorCallbackCh1(DAC_HandleTypeDef *hdac)
elmot 1:d0dfbce63a89 847 {
elmot 1:d0dfbce63a89 848 /* Prevent unused argument(s) compilation warning */
elmot 1:d0dfbce63a89 849 UNUSED(hdac);
elmot 1:d0dfbce63a89 850
elmot 1:d0dfbce63a89 851 /* NOTE : This function should not be modified, when the callback is needed,
elmot 1:d0dfbce63a89 852 the HAL_DAC_ErrorCallbackCh1 could be implemented in the user file
elmot 1:d0dfbce63a89 853 */
elmot 1:d0dfbce63a89 854 }
elmot 1:d0dfbce63a89 855
elmot 1:d0dfbce63a89 856 /**
elmot 1:d0dfbce63a89 857 * @brief DMA underrun DAC callback for channel1.
elmot 1:d0dfbce63a89 858 * @param hdac: pointer to a DAC_HandleTypeDef structure that contains
elmot 1:d0dfbce63a89 859 * the configuration information for the specified DAC.
elmot 1:d0dfbce63a89 860 * @retval None
elmot 1:d0dfbce63a89 861 */
elmot 1:d0dfbce63a89 862 __weak void HAL_DAC_DMAUnderrunCallbackCh1(DAC_HandleTypeDef *hdac)
elmot 1:d0dfbce63a89 863 {
elmot 1:d0dfbce63a89 864 /* Prevent unused argument(s) compilation warning */
elmot 1:d0dfbce63a89 865 UNUSED(hdac);
elmot 1:d0dfbce63a89 866
elmot 1:d0dfbce63a89 867 /* NOTE : This function should not be modified, when the callback is needed,
elmot 1:d0dfbce63a89 868 the HAL_DAC_DMAUnderrunCallbackCh1 could be implemented in the user file
elmot 1:d0dfbce63a89 869 */
elmot 1:d0dfbce63a89 870 }
elmot 1:d0dfbce63a89 871
elmot 1:d0dfbce63a89 872 /**
elmot 1:d0dfbce63a89 873 * @}
elmot 1:d0dfbce63a89 874 */
elmot 1:d0dfbce63a89 875
elmot 1:d0dfbce63a89 876 /** @defgroup DAC_Exported_Functions_Group3 Peripheral Control functions
elmot 1:d0dfbce63a89 877 * @brief Peripheral Control functions
elmot 1:d0dfbce63a89 878 *
elmot 1:d0dfbce63a89 879 @verbatim
elmot 1:d0dfbce63a89 880 ==============================================================================
elmot 1:d0dfbce63a89 881 ##### Peripheral Control functions #####
elmot 1:d0dfbce63a89 882 ==============================================================================
elmot 1:d0dfbce63a89 883 [..] This section provides functions allowing to:
elmot 1:d0dfbce63a89 884 (+) Configure channels.
elmot 1:d0dfbce63a89 885 (+) Set the specified data holding register value for DAC channel.
elmot 1:d0dfbce63a89 886
elmot 1:d0dfbce63a89 887 @endverbatim
elmot 1:d0dfbce63a89 888 * @{
elmot 1:d0dfbce63a89 889 */
elmot 1:d0dfbce63a89 890
elmot 1:d0dfbce63a89 891 /**
elmot 1:d0dfbce63a89 892 * @brief Returns the last data output value of the selected DAC channel.
elmot 1:d0dfbce63a89 893 * @param hdac: pointer to a DAC_HandleTypeDef structure that contains
elmot 1:d0dfbce63a89 894 * the configuration information for the specified DAC.
elmot 1:d0dfbce63a89 895 * @param Channel: The selected DAC channel.
elmot 1:d0dfbce63a89 896 * This parameter can be one of the following values:
elmot 1:d0dfbce63a89 897 * @arg DAC_CHANNEL_1: DAC Channel1 selected
elmot 1:d0dfbce63a89 898 * @arg DAC_CHANNEL_2: DAC Channel2 selected
elmot 1:d0dfbce63a89 899 * @retval The selected DAC channel data output value.
elmot 1:d0dfbce63a89 900 */
elmot 1:d0dfbce63a89 901 uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef* hdac, uint32_t Channel)
elmot 1:d0dfbce63a89 902 {
elmot 1:d0dfbce63a89 903 /* Check the parameters */
elmot 1:d0dfbce63a89 904 assert_param(IS_DAC_CHANNEL(Channel));
elmot 1:d0dfbce63a89 905
elmot 1:d0dfbce63a89 906 /* Returns the DAC channel data output register value */
elmot 1:d0dfbce63a89 907 if(Channel == DAC_CHANNEL_1)
elmot 1:d0dfbce63a89 908 {
elmot 1:d0dfbce63a89 909 return hdac->Instance->DOR1;
elmot 1:d0dfbce63a89 910 }
elmot 1:d0dfbce63a89 911 else
elmot 1:d0dfbce63a89 912 {
elmot 1:d0dfbce63a89 913 return hdac->Instance->DOR2;
elmot 1:d0dfbce63a89 914 }
elmot 1:d0dfbce63a89 915 }
elmot 1:d0dfbce63a89 916
elmot 1:d0dfbce63a89 917 /**
elmot 1:d0dfbce63a89 918 * @brief Configures the selected DAC channel.
elmot 1:d0dfbce63a89 919 * @param hdac: pointer to a DAC_HandleTypeDef structure that contains
elmot 1:d0dfbce63a89 920 * the configuration information for the specified DAC.
elmot 1:d0dfbce63a89 921 * @param sConfig: DAC configuration structure.
elmot 1:d0dfbce63a89 922 * @param Channel: The selected DAC channel.
elmot 1:d0dfbce63a89 923 * This parameter can be one of the following values:
elmot 1:d0dfbce63a89 924 * @arg DAC_CHANNEL_1: DAC Channel1 selected
elmot 1:d0dfbce63a89 925 * @arg DAC_CHANNEL_2: DAC Channel2 selected
elmot 1:d0dfbce63a89 926 * @retval HAL status
elmot 1:d0dfbce63a89 927 */
elmot 1:d0dfbce63a89 928 HAL_StatusTypeDef HAL_DAC_ConfigChannel(DAC_HandleTypeDef* hdac, DAC_ChannelConfTypeDef* sConfig, uint32_t Channel)
elmot 1:d0dfbce63a89 929 {
elmot 1:d0dfbce63a89 930 uint32_t tmpreg1 = 0, tmpreg2 = 0;
elmot 1:d0dfbce63a89 931 uint32_t tickstart = 0;
elmot 1:d0dfbce63a89 932
elmot 1:d0dfbce63a89 933 /* Check the DAC parameters */
elmot 1:d0dfbce63a89 934 assert_param(IS_DAC_TRIGGER(sConfig->DAC_Trigger));
elmot 1:d0dfbce63a89 935 assert_param(IS_DAC_OUTPUT_BUFFER_STATE(sConfig->DAC_OutputBuffer));
elmot 1:d0dfbce63a89 936 assert_param(IS_DAC_CHIP_CONNECTION(sConfig->DAC_ConnectOnChipPeripheral));
elmot 1:d0dfbce63a89 937 assert_param(IS_DAC_TRIMMING(sConfig->DAC_UserTrimming));
elmot 1:d0dfbce63a89 938 if ((sConfig->DAC_UserTrimming) == DAC_TRIMMING_USER)
elmot 1:d0dfbce63a89 939 {
elmot 1:d0dfbce63a89 940 assert_param(IS_DAC_TRIMMINGVALUE(sConfig->DAC_TrimmingValue));
elmot 1:d0dfbce63a89 941 }
elmot 1:d0dfbce63a89 942 assert_param(IS_DAC_SAMPLEANDHOLD(sConfig->DAC_SampleAndHold));
elmot 1:d0dfbce63a89 943 if ((sConfig->DAC_SampleAndHold) == DAC_SAMPLEANDHOLD_ENABLE)
elmot 1:d0dfbce63a89 944 {
elmot 1:d0dfbce63a89 945 assert_param(IS_DAC_SAMPLETIME(sConfig->DAC_SampleAndHoldConfig.DAC_SampleTime));
elmot 1:d0dfbce63a89 946 assert_param(IS_DAC_HOLDTIME(sConfig->DAC_SampleAndHoldConfig.DAC_HoldTime));
elmot 1:d0dfbce63a89 947 assert_param(IS_DAC_REFRESHTIME(sConfig->DAC_SampleAndHoldConfig.DAC_RefreshTime));
elmot 1:d0dfbce63a89 948 }
elmot 1:d0dfbce63a89 949 assert_param(IS_DAC_CHANNEL(Channel));
elmot 1:d0dfbce63a89 950
elmot 1:d0dfbce63a89 951 /* Process locked */
elmot 1:d0dfbce63a89 952 __HAL_LOCK(hdac);
elmot 1:d0dfbce63a89 953
elmot 1:d0dfbce63a89 954 /* Change DAC state */
elmot 1:d0dfbce63a89 955 hdac->State = HAL_DAC_STATE_BUSY;
elmot 1:d0dfbce63a89 956
elmot 1:d0dfbce63a89 957 if(sConfig->DAC_SampleAndHold == DAC_SAMPLEANDHOLD_ENABLE)
elmot 1:d0dfbce63a89 958 /* Sample on old configuration */
elmot 1:d0dfbce63a89 959 {
elmot 1:d0dfbce63a89 960 /* SampleTime */
elmot 1:d0dfbce63a89 961 if (Channel == DAC_CHANNEL_1)
elmot 1:d0dfbce63a89 962 {
elmot 1:d0dfbce63a89 963 /* Get timeout */
elmot 1:d0dfbce63a89 964 tickstart = HAL_GetTick();
elmot 1:d0dfbce63a89 965
elmot 1:d0dfbce63a89 966 /* SHSR1 can be written when BWST1 equals RESET */
elmot 1:d0dfbce63a89 967 while (((hdac->Instance->SR) & DAC_SR_BWST1)!= RESET)
elmot 1:d0dfbce63a89 968 {
elmot 1:d0dfbce63a89 969 /* Check for the Timeout */
elmot 1:d0dfbce63a89 970 if((HAL_GetTick() - tickstart) > TIMEOUT_DAC_CALIBCONFIG)
elmot 1:d0dfbce63a89 971 {
elmot 1:d0dfbce63a89 972 /* Update error code */
elmot 1:d0dfbce63a89 973 SET_BIT(hdac->ErrorCode, HAL_DAC_ERROR_TIMEOUT);
elmot 1:d0dfbce63a89 974
elmot 1:d0dfbce63a89 975 /* Change the DMA state */
elmot 1:d0dfbce63a89 976 hdac->State = HAL_DAC_STATE_TIMEOUT;
elmot 1:d0dfbce63a89 977
elmot 1:d0dfbce63a89 978 return HAL_TIMEOUT;
elmot 1:d0dfbce63a89 979 }
elmot 1:d0dfbce63a89 980 }
elmot 1:d0dfbce63a89 981 HAL_Delay(1);
elmot 1:d0dfbce63a89 982 hdac->Instance->SHSR1 = sConfig->DAC_SampleAndHoldConfig.DAC_SampleTime;
elmot 1:d0dfbce63a89 983 }
elmot 1:d0dfbce63a89 984 else /* Channel 2 */
elmot 1:d0dfbce63a89 985 {
elmot 1:d0dfbce63a89 986 /* SHSR2 can be written when BWST2 equals RESET */
elmot 1:d0dfbce63a89 987
elmot 1:d0dfbce63a89 988 while (((hdac->Instance->SR) & DAC_SR_BWST2)!= RESET)
elmot 1:d0dfbce63a89 989 {
elmot 1:d0dfbce63a89 990 /* Check for the Timeout */
elmot 1:d0dfbce63a89 991 if((HAL_GetTick() - tickstart) > TIMEOUT_DAC_CALIBCONFIG)
elmot 1:d0dfbce63a89 992 {
elmot 1:d0dfbce63a89 993 /* Update error code */
elmot 1:d0dfbce63a89 994 SET_BIT(hdac->ErrorCode, HAL_DAC_ERROR_TIMEOUT);
elmot 1:d0dfbce63a89 995
elmot 1:d0dfbce63a89 996 /* Change the DMA state */
elmot 1:d0dfbce63a89 997 hdac->State = HAL_DAC_STATE_TIMEOUT;
elmot 1:d0dfbce63a89 998
elmot 1:d0dfbce63a89 999 return HAL_TIMEOUT;
elmot 1:d0dfbce63a89 1000 }
elmot 1:d0dfbce63a89 1001 }
elmot 1:d0dfbce63a89 1002 HAL_Delay(1);
elmot 1:d0dfbce63a89 1003 hdac->Instance->SHSR2 = sConfig->DAC_SampleAndHoldConfig.DAC_SampleTime;
elmot 1:d0dfbce63a89 1004 }
elmot 1:d0dfbce63a89 1005 /* HoldTime */
elmot 1:d0dfbce63a89 1006 hdac->Instance->SHHR = (sConfig->DAC_SampleAndHoldConfig.DAC_HoldTime)<<Channel;
elmot 1:d0dfbce63a89 1007 /* RefreshTime */
elmot 1:d0dfbce63a89 1008 hdac->Instance->SHRR = (sConfig->DAC_SampleAndHoldConfig.DAC_RefreshTime)<<Channel;
elmot 1:d0dfbce63a89 1009 }
elmot 1:d0dfbce63a89 1010
elmot 1:d0dfbce63a89 1011 if(sConfig->DAC_UserTrimming == DAC_TRIMMING_USER)
elmot 1:d0dfbce63a89 1012 /* USER TRIMMING */
elmot 1:d0dfbce63a89 1013 {
elmot 1:d0dfbce63a89 1014 /* Get the DAC CCR value */
elmot 1:d0dfbce63a89 1015 tmpreg1 = hdac->Instance->CCR;
elmot 1:d0dfbce63a89 1016 /* Clear trimming value */
elmot 1:d0dfbce63a89 1017 tmpreg1 &= ~(((uint32_t)(DAC_CCR_OTRIM1)) << Channel);
elmot 1:d0dfbce63a89 1018 /* Configure for the selected trimming offset */
elmot 1:d0dfbce63a89 1019 tmpreg2 = sConfig->DAC_TrimmingValue;
elmot 1:d0dfbce63a89 1020 /* Calculate CCR register value depending on DAC_Channel */
elmot 1:d0dfbce63a89 1021 tmpreg1 |= tmpreg2 << Channel;
elmot 1:d0dfbce63a89 1022 /* Write to DAC CCR */
elmot 1:d0dfbce63a89 1023 hdac->Instance->CCR = tmpreg1;
elmot 1:d0dfbce63a89 1024 }
elmot 1:d0dfbce63a89 1025 /* else factory trimming is used (factory setting are available at reset)*/
elmot 1:d0dfbce63a89 1026 /* SW Nothing has nothing to do */
elmot 1:d0dfbce63a89 1027
elmot 1:d0dfbce63a89 1028 /* Get the DAC MCR value */
elmot 1:d0dfbce63a89 1029 tmpreg1 = hdac->Instance->MCR;
elmot 1:d0dfbce63a89 1030 /* Clear DAC_MCR_MODE2_0, DAC_MCR_MODE2_1 and DAC_MCR_MODE2_2 bits */
elmot 1:d0dfbce63a89 1031 tmpreg1 &= ~(((uint32_t)(DAC_MCR_MODE1)) << Channel);
elmot 1:d0dfbce63a89 1032 /* Configure for the selected DAC channel: mode, buffer output & on chip peripheral connect */
elmot 1:d0dfbce63a89 1033 tmpreg2 = (sConfig->DAC_SampleAndHold | sConfig->DAC_OutputBuffer | sConfig->DAC_ConnectOnChipPeripheral);
elmot 1:d0dfbce63a89 1034 /* Calculate MCR register value depending on DAC_Channel */
elmot 1:d0dfbce63a89 1035 tmpreg1 |= tmpreg2 << Channel;
elmot 1:d0dfbce63a89 1036 /* Write to DAC MCR */
elmot 1:d0dfbce63a89 1037 hdac->Instance->MCR = tmpreg1;
elmot 1:d0dfbce63a89 1038
elmot 1:d0dfbce63a89 1039 /* DAC in normal operating mode hence clear DAC_CR_CENx bit */
elmot 1:d0dfbce63a89 1040 CLEAR_BIT (hdac->Instance->CR, DAC_CR_CEN1 << Channel);
elmot 1:d0dfbce63a89 1041
elmot 1:d0dfbce63a89 1042 /* Get the DAC CR value */
elmot 1:d0dfbce63a89 1043 tmpreg1 = hdac->Instance->CR;
elmot 1:d0dfbce63a89 1044 /* Clear TENx, TSELx, WAVEx and MAMPx bits */
elmot 1:d0dfbce63a89 1045 tmpreg1 &= ~(((uint32_t)(DAC_CR_MAMP1 | DAC_CR_WAVE1 | DAC_CR_TSEL1 | DAC_CR_TEN1)) << Channel);
elmot 1:d0dfbce63a89 1046 /* Configure for the selected DAC channel: trigger */
elmot 1:d0dfbce63a89 1047 /* Set TSELx and TENx bits according to DAC_Trigger value */
elmot 1:d0dfbce63a89 1048 tmpreg2 = (sConfig->DAC_Trigger);
elmot 1:d0dfbce63a89 1049 /* Calculate CR register value depending on DAC_Channel */
elmot 1:d0dfbce63a89 1050 tmpreg1 |= tmpreg2 << Channel;
elmot 1:d0dfbce63a89 1051 /* Write to DAC CR */
elmot 1:d0dfbce63a89 1052 hdac->Instance->CR = tmpreg1;
elmot 1:d0dfbce63a89 1053
elmot 1:d0dfbce63a89 1054 /* Disable wave generation */
elmot 1:d0dfbce63a89 1055 hdac->Instance->CR &= ~(DAC_CR_WAVE1 << Channel);
elmot 1:d0dfbce63a89 1056
elmot 1:d0dfbce63a89 1057 /* Change DAC state */
elmot 1:d0dfbce63a89 1058 hdac->State = HAL_DAC_STATE_READY;
elmot 1:d0dfbce63a89 1059
elmot 1:d0dfbce63a89 1060 /* Process unlocked */
elmot 1:d0dfbce63a89 1061 __HAL_UNLOCK(hdac);
elmot 1:d0dfbce63a89 1062
elmot 1:d0dfbce63a89 1063 /* Return function status */
elmot 1:d0dfbce63a89 1064 return HAL_OK;
elmot 1:d0dfbce63a89 1065 }
elmot 1:d0dfbce63a89 1066
elmot 1:d0dfbce63a89 1067 /**
elmot 1:d0dfbce63a89 1068 * @}
elmot 1:d0dfbce63a89 1069 */
elmot 1:d0dfbce63a89 1070
elmot 1:d0dfbce63a89 1071 /** @defgroup DAC_Exported_Functions_Group4 Peripheral State and Errors functions
elmot 1:d0dfbce63a89 1072 * @brief Peripheral State and Errors functions
elmot 1:d0dfbce63a89 1073 *
elmot 1:d0dfbce63a89 1074 @verbatim
elmot 1:d0dfbce63a89 1075 ==============================================================================
elmot 1:d0dfbce63a89 1076 ##### Peripheral State and Errors functions #####
elmot 1:d0dfbce63a89 1077 ==============================================================================
elmot 1:d0dfbce63a89 1078 [..]
elmot 1:d0dfbce63a89 1079 This subsection provides functions allowing to
elmot 1:d0dfbce63a89 1080 (+) Check the DAC state.
elmot 1:d0dfbce63a89 1081 (+) Check the DAC Errors.
elmot 1:d0dfbce63a89 1082
elmot 1:d0dfbce63a89 1083 @endverbatim
elmot 1:d0dfbce63a89 1084 * @{
elmot 1:d0dfbce63a89 1085 */
elmot 1:d0dfbce63a89 1086
elmot 1:d0dfbce63a89 1087 /**
elmot 1:d0dfbce63a89 1088 * @brief return the DAC handle state
elmot 1:d0dfbce63a89 1089 * @param hdac: pointer to a DAC_HandleTypeDef structure that contains
elmot 1:d0dfbce63a89 1090 * the configuration information for the specified DAC.
elmot 1:d0dfbce63a89 1091 * @retval HAL state
elmot 1:d0dfbce63a89 1092 */
elmot 1:d0dfbce63a89 1093 HAL_DAC_StateTypeDef HAL_DAC_GetState(DAC_HandleTypeDef* hdac)
elmot 1:d0dfbce63a89 1094 {
elmot 1:d0dfbce63a89 1095 /* Return DAC handle state */
elmot 1:d0dfbce63a89 1096 return hdac->State;
elmot 1:d0dfbce63a89 1097 }
elmot 1:d0dfbce63a89 1098
elmot 1:d0dfbce63a89 1099
elmot 1:d0dfbce63a89 1100 /**
elmot 1:d0dfbce63a89 1101 * @brief Return the DAC error code
elmot 1:d0dfbce63a89 1102 * @param hdac: pointer to a DAC_HandleTypeDef structure that contains
elmot 1:d0dfbce63a89 1103 * the configuration information for the specified DAC.
elmot 1:d0dfbce63a89 1104 * @retval DAC Error Code
elmot 1:d0dfbce63a89 1105 */
elmot 1:d0dfbce63a89 1106 uint32_t HAL_DAC_GetError(DAC_HandleTypeDef *hdac)
elmot 1:d0dfbce63a89 1107 {
elmot 1:d0dfbce63a89 1108 return hdac->ErrorCode;
elmot 1:d0dfbce63a89 1109 }
elmot 1:d0dfbce63a89 1110
elmot 1:d0dfbce63a89 1111 /**
elmot 1:d0dfbce63a89 1112 * @}
elmot 1:d0dfbce63a89 1113 */
elmot 1:d0dfbce63a89 1114
elmot 1:d0dfbce63a89 1115 /**
elmot 1:d0dfbce63a89 1116 * @}
elmot 1:d0dfbce63a89 1117 */
elmot 1:d0dfbce63a89 1118
elmot 1:d0dfbce63a89 1119 /** @addtogroup DAC_Private_Functions
elmot 1:d0dfbce63a89 1120 * @{
elmot 1:d0dfbce63a89 1121 */
elmot 1:d0dfbce63a89 1122
elmot 1:d0dfbce63a89 1123 /**
elmot 1:d0dfbce63a89 1124 * @brief DMA conversion complete callback.
elmot 1:d0dfbce63a89 1125 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
elmot 1:d0dfbce63a89 1126 * the configuration information for the specified DMA module.
elmot 1:d0dfbce63a89 1127 * @retval None
elmot 1:d0dfbce63a89 1128 */
elmot 1:d0dfbce63a89 1129 static void DAC_DMAConvCpltCh1(DMA_HandleTypeDef *hdma)
elmot 1:d0dfbce63a89 1130 {
elmot 1:d0dfbce63a89 1131 DAC_HandleTypeDef* hdac = ( DAC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
elmot 1:d0dfbce63a89 1132
elmot 1:d0dfbce63a89 1133 HAL_DAC_ConvCpltCallbackCh1(hdac);
elmot 1:d0dfbce63a89 1134
elmot 1:d0dfbce63a89 1135 hdac->State= HAL_DAC_STATE_READY;
elmot 1:d0dfbce63a89 1136 }
elmot 1:d0dfbce63a89 1137
elmot 1:d0dfbce63a89 1138 /**
elmot 1:d0dfbce63a89 1139 * @brief DMA half transfer complete callback.
elmot 1:d0dfbce63a89 1140 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
elmot 1:d0dfbce63a89 1141 * the configuration information for the specified DMA module.
elmot 1:d0dfbce63a89 1142 * @retval None
elmot 1:d0dfbce63a89 1143 */
elmot 1:d0dfbce63a89 1144 static void DAC_DMAHalfConvCpltCh1(DMA_HandleTypeDef *hdma)
elmot 1:d0dfbce63a89 1145 {
elmot 1:d0dfbce63a89 1146 DAC_HandleTypeDef* hdac = ( DAC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
elmot 1:d0dfbce63a89 1147 /* Conversion complete callback */
elmot 1:d0dfbce63a89 1148 HAL_DAC_ConvHalfCpltCallbackCh1(hdac);
elmot 1:d0dfbce63a89 1149 }
elmot 1:d0dfbce63a89 1150
elmot 1:d0dfbce63a89 1151 /**
elmot 1:d0dfbce63a89 1152 * @brief DMA error callback
elmot 1:d0dfbce63a89 1153 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
elmot 1:d0dfbce63a89 1154 * the configuration information for the specified DMA module.
elmot 1:d0dfbce63a89 1155 * @retval None
elmot 1:d0dfbce63a89 1156 */
elmot 1:d0dfbce63a89 1157 static void DAC_DMAErrorCh1(DMA_HandleTypeDef *hdma)
elmot 1:d0dfbce63a89 1158 {
elmot 1:d0dfbce63a89 1159 DAC_HandleTypeDef* hdac = ( DAC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
elmot 1:d0dfbce63a89 1160
elmot 1:d0dfbce63a89 1161 /* Set DAC error code to DMA error */
elmot 1:d0dfbce63a89 1162 hdac->ErrorCode |= HAL_DAC_ERROR_DMA;
elmot 1:d0dfbce63a89 1163
elmot 1:d0dfbce63a89 1164 HAL_DAC_ErrorCallbackCh1(hdac);
elmot 1:d0dfbce63a89 1165
elmot 1:d0dfbce63a89 1166 hdac->State= HAL_DAC_STATE_READY;
elmot 1:d0dfbce63a89 1167 }
elmot 1:d0dfbce63a89 1168
elmot 1:d0dfbce63a89 1169 /**
elmot 1:d0dfbce63a89 1170 * @}
elmot 1:d0dfbce63a89 1171 */
elmot 1:d0dfbce63a89 1172
elmot 1:d0dfbce63a89 1173 #endif /* HAL_DAC_MODULE_ENABLED */
elmot 1:d0dfbce63a89 1174
elmot 1:d0dfbce63a89 1175 /**
elmot 1:d0dfbce63a89 1176 * @}
elmot 1:d0dfbce63a89 1177 */
elmot 1:d0dfbce63a89 1178
elmot 1:d0dfbce63a89 1179 /**
elmot 1:d0dfbce63a89 1180 * @}
elmot 1:d0dfbce63a89 1181 */
elmot 1:d0dfbce63a89 1182
elmot 1:d0dfbce63a89 1183 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/