L4 HAL Drivers

Committer:
EricLew
Date:
Mon Nov 02 19:37:23 2015 +0000
Revision:
0:80ee8f3b695e
Errors are with definitions of LCD and QSPI functions. I believe all .h and .c files are  uploaded, but there may need to be certain functions called.

Who changed what in which revision?

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