Subversion Repositories LedShow

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 mjames 1
/**
2
  ******************************************************************************
3
  * @file    stm32f1xx_hal_dac.c
4
  * @author  MCD Application Team
5
  * @brief   DAC HAL module driver.
6
  *         This file provides firmware functions to manage the following
7
  *         functionalities of the Digital to Analog Converter (DAC) peripheral:
8
  *           + Initialization and de-initialization functions
9
  *           + IO operation functions
10
  *           + Peripheral Control functions
11
  *           + Peripheral State and Errors functions      
12
  *    
13
  *
14
  @verbatim      
15
  ==============================================================================
16
                      ##### DAC Peripheral features #####
17
  ==============================================================================
18
    [..]        
19
      *** DAC Channels ***
20
      ====================  
21
    [..]  
22
    The device integrates two 12-bit Digital Analog Converters that can
23
    be used independently or simultaneously (dual mode):
24
      (#) DAC channel1 with DAC_OUT1 (PA4) as output
25
      (#) DAC channel2 with DAC_OUT2 (PA5) as output
26
 
27
      *** DAC Triggers ***
28
      ====================
29
    [..]
30
    Digital to Analog conversion can be non-triggered using DAC_TRIGGER_NONE
31
    and DAC_OUT1/DAC_OUT2 is available once writing to DHRx register.
32
    [..]
33
    Digital to Analog conversion can be triggered by:
34
      (#) External event: EXTI Line 9 (any GPIOx_PIN_9) using DAC_TRIGGER_EXT_IT9.
35
          The used pin (GPIOx_PIN_9) must be configured in input mode.
36
 
37
      (#) Timers TRGO: TIM2, TIM4, TIM6, TIM7
38
          For STM32F10x connectivity line devices and STM32F100x devices: TIM3
39
          For STM32F10x high-density and XL-density devices: TIM8
40
          For STM32F100x high-density value line devices: TIM15 as
41
          replacement of TIM5.
42
          (DAC_TRIGGER_T2_TRGO, DAC_TRIGGER_T4_TRGO...)
43
 
44
      (#) Software using DAC_TRIGGER_SOFTWARE
45
 
46
      *** DAC Buffer mode feature ***
47
      ===============================
48
      [..]
49
      Each DAC channel integrates an output buffer that can be used to
50
      reduce the output impedance, and to drive external loads directly
51
      without having to add an external operational amplifier.
52
      To enable, the output buffer use  
53
      sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
54
      [..]          
55
      (@) Refer to the device datasheet for more details about output
56
          impedance value with and without output buffer.
57
 
58
      *** DAC connect feature ***
59
      ===============================
60
      [..]
61
      Each DAC channel can be connected internally.
62
      To connect, use
63
      sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_ENABLE;
64
 
65
      *** GPIO configurations guidelines ***
66
      =====================
67
      [..]
68
      When a DAC channel is used (ex channel1 on PA4) and the other is not
69
      (ex channel1 on PA5 is configured in Analog and disabled).
70
      Channel1 may disturb channel2 as coupling effect.
71
      Note that there is no coupling on channel2 as soon as channel2 is turned on.
72
      Coupling on adjacent channel could be avoided as follows:
73
      when unused PA5 is configured as INPUT PULL-UP or DOWN.
74
      PA5 is configured in ANALOG just before it is turned on.    
75
 
76
       *** DAC wave generation feature ***
77
       ===================================
78
       [..]    
79
       Both DAC channels can be used to generate
80
         (#) Noise wave using HAL_DACEx_NoiseWaveGenerate()
81
         (#) Triangle wave using HAL_DACEx_TriangleWaveGenerate()
82
 
83
       *** DAC data format ***
84
       =======================
85
       [..]  
86
       The DAC data format can be:
87
         (#) 8-bit right alignment using DAC_ALIGN_8B_R
88
         (#) 12-bit left alignment using DAC_ALIGN_12B_L
89
         (#) 12-bit right alignment using DAC_ALIGN_12B_R
90
 
91
       *** DAC data value to voltage correspondance ***  
92
       ================================================
93
       [..]
94
       The analog output voltage on each DAC channel pin is determined
95
       by the following equation:
96
       [..]
97
       DAC_OUTx = VREF+ * DOR / 4095
98
       (+) with  DOR is the Data Output Register
99
       [..]
100
          VEF+ is the input voltage reference (refer to the device datasheet)
101
       [..]
102
        e.g. To set DAC_OUT1 to 0.7V, use
103
       (+) Assuming that VREF+ = 3.3V, DAC_OUT1 = (3.3 * 868) / 4095 = 0.7V
104
 
105
       *** DMA requests  ***
106
       =====================
107
       [..]    
108
       A DMA1 request can be generated when an external trigger (but not
109
       a software trigger) occurs if DMA1 requests are enabled using
110
       HAL_DAC_Start_DMA()
111
       [..]
112
       DMA requests are mapped as following:
113
         (#) DAC channel1 :
114
             For STM32F100x low-density, medium-density, high-density with DAC
115
             DMA remap:
116
                            mapped on DMA1 channel3 which must be
117
             already configured
118
             For STM32F100x high-density without DAC DMA remap and other  
119
             STM32F1 devices:
120
                            mapped on DMA2 channel3 which must be
121
             already configured
122
         (#) DAC channel2 :
123
             For STM32F100x low-density, medium-density, high-density with DAC
124
             DMA remap:
125
                            mapped on DMA1 channel4 which must be
126
             already configured
127
             For STM32F100x high-density without DAC DMA remap and other  
128
             STM32F1 devices:
129
                            mapped on DMA2 channel4 which must be
130
             already configured
131
 
132
                      ##### How to use this driver #####
133
  ==============================================================================
134
    [..]          
135
      (+) DAC APB clock must be enabled to get write access to DAC
136
          registers using HAL_DAC_Init()
137
      (+) Configure DAC_OUTx (DAC_OUT1: PA4, DAC_OUT2: PA5) in analog mode.
138
      (+) Configure the DAC channel using HAL_DAC_ConfigChannel() function.
139
      (+) Enable the DAC channel using HAL_DAC_Start() or HAL_DAC_Start_DMA functions
140
 
141
     *** Polling mode IO operation ***
142
     =================================
143
     [..]    
144
       (+) Start the DAC peripheral using HAL_DAC_Start()
145
       (+) To read the DAC last data output value, use the HAL_DAC_GetValue() function.
146
       (+) Stop the DAC peripheral using HAL_DAC_Stop()
147
 
148
     *** DMA mode IO operation ***    
149
     ==============================
150
     [..]    
151
       (+) Start the DAC peripheral using HAL_DAC_Start_DMA(), at this stage the user specify the length
152
           of data to be transferred at each end of conversion
153
       (+) At the middle of data transfer HAL_DACEx_ConvHalfCpltCallbackCh1()or HAL_DACEx_ConvHalfCpltCallbackCh2()  
154
           function is executed and user can add his own code by customization of function pointer
155
           HAL_DAC_ConvHalfCpltCallbackCh1 or HAL_DAC_ConvHalfCpltCallbackCh2
156
       (+) At The end of data transfer HAL_DAC_ConvCpltCallbackCh1()or HAL_DAC_ConvCpltCallbackCh2()  
157
           function is executed and user can add his own code by customization of function pointer
158
           HAL_DAC_ConvCpltCallbackCh1 or HAL_DAC_ConvCpltCallbackCh2
159
       (+) In case of transfer Error, HAL_DAC_ErrorCallbackCh1() or HAL_DACEx_ErrorCallbackCh2() function is executed and user can
160
           add his own code by customization of function pointer HAL_DAC_ErrorCallbackCh1 or HAL_DACEx_ErrorCallbackCh2
161
       (+) For STM32F100x devices with specific feature: DMA underrun.            
162
           In case of DMA underrun, DAC interruption triggers and execute internal function HAL_DAC_IRQHandler.
163
           HAL_DAC_DMAUnderrunCallbackCh1()or HAL_DACEx_DMAUnderrunCallbackCh2()  
164
           function is executed and user can add his own code by customization of function pointer
165
           HAL_DAC_DMAUnderrunCallbackCh1 or HAL_DACEx_DMAUnderrunCallbackCh2
166
           add his own code by customization of function pointer HAL_DAC_ErrorCallbackCh1
167
       (+) Stop the DAC peripheral using HAL_DAC_Stop_DMA()
168
 
169
     *** DAC HAL driver macros list ***
170
     =============================================
171
     [..]
172
       Below the list of most used macros in DAC HAL driver.
173
 
174
      (+) __HAL_DAC_ENABLE : Enable the DAC peripheral (For STM32F100x devices with specific feature: DMA underrun)
175
      (+) __HAL_DAC_DISABLE : Disable the DAC peripheral (For STM32F100x devices with specific feature: DMA underrun)
176
      (+) __HAL_DAC_CLEAR_FLAG: Clear the DAC's pending flags (For STM32F100x devices with specific feature: DMA underrun)
177
      (+) __HAL_DAC_GET_FLAG: Get the selected DAC's flag status (For STM32F100x devices with specific feature: DMA underrun)
178
 
179
     [..]
180
      (@) You can refer to the DAC HAL driver header file for more useful macros  
181
 
182
 @endverbatim    
183
  ******************************************************************************
184
  * @attention
185
  *
186
  * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
187
  *
188
  * Redistribution and use in source and binary forms, with or without modification,
189
  * are permitted provided that the following conditions are met:
190
  *   1. Redistributions of source code must retain the above copyright notice,
191
  *      this list of conditions and the following disclaimer.
192
  *   2. Redistributions in binary form must reproduce the above copyright notice,
193
  *      this list of conditions and the following disclaimer in the documentation
194
  *      and/or other materials provided with the distribution.
195
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
196
  *      may be used to endorse or promote products derived from this software
197
  *      without specific prior written permission.
198
  *
199
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
200
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
201
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
202
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
203
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
204
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
205
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
206
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
207
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
208
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
209
  *
210
  ******************************************************************************
211
  */
212
 
213
 
214
/* Includes ------------------------------------------------------------------*/
215
#include "stm32f1xx_hal.h"
216
 
217
/** @addtogroup STM32F1xx_HAL_Driver
218
  * @{
219
  */
220
 
221
/** @defgroup DAC DAC
222
  * @brief DAC driver modules
223
  * @{
224
  */
225
 
226
#ifdef HAL_DAC_MODULE_ENABLED
227
#if defined (STM32F100xB) || defined (STM32F100xE) || defined (STM32F101xE) || defined (STM32F101xG) || defined (STM32F103xE) || defined (STM32F103xG) || defined (STM32F105xC) || defined (STM32F107xC)
228
 
229
/* Private typedef -----------------------------------------------------------*/
230
/* Private define ------------------------------------------------------------*/
231
/* Private macro -------------------------------------------------------------*/
232
/* Private variables ---------------------------------------------------------*/
233
/* Private function prototypes -----------------------------------------------*/
234
/* Exported functions -------------------------------------------------------*/
235
 
236
/** @defgroup DAC_Exported_Functions DAC Exported Functions
237
  * @{
238
  */
239
 
240
/** @defgroup DAC_Exported_Functions_Group1 Initialization and de-initialization functions
241
 *  @brief    Initialization and Configuration functions
242
 *
243
@verbatim    
244
  ==============================================================================
245
              ##### Initialization and de-initialization functions #####
246
  ==============================================================================
247
    [..]  This section provides functions allowing to:
248
      (+) Initialize and configure the DAC.
249
      (+) De-initialize the DAC.
250
 
251
@endverbatim
252
  * @{
253
  */
254
 
255
/**
256
  * @brief  Initializes the DAC peripheral according to the specified parameters
257
  *         in the DAC_InitStruct.
258
  * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains
259
  *         the configuration information for the specified DAC.
260
  * @retval HAL status
261
  */
262
HAL_StatusTypeDef HAL_DAC_Init(DAC_HandleTypeDef* hdac)
263
{
264
  /* Check DAC handle */
265
  if(hdac == NULL)
266
  {
267
     return HAL_ERROR;
268
  }
269
  /* Check the parameters */
270
  assert_param(IS_DAC_ALL_INSTANCE(hdac->Instance));
271
 
272
  if(hdac->State == HAL_DAC_STATE_RESET)
273
  {  
274
    /* Allocate lock resource and initialize it */
275
    hdac->Lock = HAL_UNLOCKED;
276
 
277
    /* Init the low level hardware */
278
    HAL_DAC_MspInit(hdac);
279
  }
280
 
281
  /* Initialize the DAC state*/
282
  hdac->State = HAL_DAC_STATE_BUSY;
283
 
284
  /* Set DAC error code to none */
285
  hdac->ErrorCode = HAL_DAC_ERROR_NONE;
286
 
287
  /* Initialize the DAC state*/
288
  hdac->State = HAL_DAC_STATE_READY;
289
 
290
  /* Return function status */
291
  return HAL_OK;
292
}
293
 
294
/**
295
  * @brief  Deinitializes the DAC peripheral registers to their default reset values.
296
  * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains
297
  *         the configuration information for the specified DAC.
298
  * @retval HAL status
299
  */
300
HAL_StatusTypeDef HAL_DAC_DeInit(DAC_HandleTypeDef* hdac)
301
{
302
  /* Check DAC handle */
303
  if(hdac == NULL)
304
  {
305
     return HAL_ERROR;
306
  }
307
 
308
  /* Check the parameters */
309
  assert_param(IS_DAC_ALL_INSTANCE(hdac->Instance));
310
 
311
  /* Change DAC state */
312
  hdac->State = HAL_DAC_STATE_BUSY;
313
 
314
  /* DeInit the low level hardware */
315
  HAL_DAC_MspDeInit(hdac);
316
 
317
  /* Set DAC error code to none */
318
  hdac->ErrorCode = HAL_DAC_ERROR_NONE;
319
 
320
  /* Change DAC state */
321
  hdac->State = HAL_DAC_STATE_RESET;
322
 
323
  /* Release Lock */
324
  __HAL_UNLOCK(hdac);
325
 
326
  /* Return function status */
327
  return HAL_OK;
328
}
329
 
330
/**
331
  * @brief  Initializes the DAC MSP.
332
  * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains
333
  *         the configuration information for the specified DAC.
334
  * @retval None
335
  */
336
__weak void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)
337
{
338
  /* Prevent unused argument(s) compilation warning */
339
  UNUSED(hdac);
340
  /* NOTE : This function Should not be modified, when the callback is needed,
341
            the HAL_DAC_MspInit could be implemented in the user file
342
   */
343
}
344
 
345
/**
346
  * @brief  DeInitializes the DAC MSP.
347
  * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains
348
  *         the configuration information for the specified DAC.  
349
  * @retval None
350
  */
351
__weak void HAL_DAC_MspDeInit(DAC_HandleTypeDef* hdac)
352
{
353
  /* Prevent unused argument(s) compilation warning */
354
  UNUSED(hdac);
355
  /* NOTE : This function Should not be modified, when the callback is needed,
356
            the HAL_DAC_MspDeInit could be implemented in the user file
357
   */
358
}
359
 
360
/**
361
  * @}
362
  */
363
 
364
/** @defgroup DAC_Exported_Functions_Group2 IO operation functions
365
 *  @brief    IO operation functions
366
 *
367
@verbatim  
368
  ==============================================================================
369
             ##### IO operation functions #####
370
  ==============================================================================  
371
    [..]  This section provides functions allowing to:
372
      (+) Start conversion.
373
      (+) Stop conversion.
374
      (+) Start conversion and enable DMA transfer.
375
      (+) Stop conversion and disable DMA transfer.
376
      (+) Get result of conversion.
377
 
378
@endverbatim
379
  * @{
380
  */
381
 
382
/**
383
  * @brief  Enables DAC and starts conversion of channel.
384
  * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains
385
  *         the configuration information for the specified DAC.
386
  * @param  Channel: The selected DAC channel.
387
  *          This parameter can be one of the following values:
388
  *            @arg DAC_CHANNEL_1: DAC Channel1 selected
389
  *            @arg DAC_CHANNEL_2: DAC Channel2 selected
390
  * @retval HAL status
391
  */
392
HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef* hdac, uint32_t Channel)
393
{
394
  /* Check the parameters */
395
  assert_param(IS_DAC_CHANNEL(Channel));
396
 
397
  /* Process locked */
398
  __HAL_LOCK(hdac);
399
 
400
  /* Change DAC state */
401
  hdac->State = HAL_DAC_STATE_BUSY;
402
 
403
  /* Enable the Peripharal */
404
  __HAL_DAC_ENABLE(hdac, Channel);
405
 
406
  if(Channel == DAC_CHANNEL_1)
407
  {
408
    /* Check if software trigger enabled */
409
    if((hdac->Instance->CR & (DAC_CR_TEN1 | DAC_CR_TSEL1)) == (DAC_CR_TEN1 | DAC_CR_TSEL1))
410
    {
411
      /* Enable the selected DAC software conversion */
412
      SET_BIT(hdac->Instance->SWTRIGR, DAC_SWTRIGR_SWTRIG1);
413
    }
414
  }
415
  else
416
  {
417
    /* Check if software trigger enabled */
418
    if((hdac->Instance->CR & (DAC_CR_TEN2 | DAC_CR_TSEL2)) == (DAC_CR_TEN2 | DAC_CR_TSEL2))
419
    {
420
      /* Enable the selected DAC software conversion*/
421
      SET_BIT(hdac->Instance->SWTRIGR, DAC_SWTRIGR_SWTRIG2);
422
    }
423
  }
424
 
425
  /* Change DAC state */
426
  hdac->State = HAL_DAC_STATE_READY;
427
 
428
  /* Process unlocked */
429
  __HAL_UNLOCK(hdac);
430
 
431
  /* Return function status */
432
  return HAL_OK;
433
}
434
 
435
/**
436
  * @brief  Disables DAC and stop conversion of channel.
437
  * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains
438
  *         the configuration information for the specified DAC.
439
  * @param  Channel: The selected DAC channel.
440
  *          This parameter can be one of the following values:
441
  *            @arg DAC_CHANNEL_1: DAC Channel1 selected
442
  *            @arg DAC_CHANNEL_2: DAC Channel2 selected  
443
  * @retval HAL status
444
  */
445
HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef* hdac, uint32_t Channel)
446
{
447
  /* Check the parameters */
448
  assert_param(IS_DAC_CHANNEL(Channel));
449
 
450
  /* Disable the Peripheral */
451
  __HAL_DAC_DISABLE(hdac, Channel);
452
 
453
  /* Change DAC state */
454
  hdac->State = HAL_DAC_STATE_READY;
455
 
456
  /* Return function status */
457
  return HAL_OK;
458
}
459
 
460
/**
461
  * @brief  Enables DAC and starts conversion of channel.
462
  *         Note: For STM32F100x devices with specific feature: DMA underrun.
463
  *         On these devices, this function enables the interruption of DMA
464
  *         underrun.
465
  *         (refer to redefinition of this function in DAC extended file)
466
  * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains
467
  *         the configuration information for the specified DAC.
468
  * @param  Channel: The selected DAC channel.
469
  *          This parameter can be one of the following values:
470
  *            @arg DAC_CHANNEL_1: DAC Channel1 selected
471
  *            @arg DAC_CHANNEL_2: DAC Channel2 selected
472
  * @param  pData: The Source memory Buffer address.
473
  * @param  Length: The length of data to be transferred from memory to DAC peripheral
474
  * @param  Alignment: Specifies the data alignment for DAC channel.
475
  *          This parameter can be one of the following values:
476
  *            @arg DAC_ALIGN_8B_R: 8bit right data alignment selected
477
  *            @arg DAC_ALIGN_12B_L: 12bit left data alignment selected
478
  *            @arg DAC_ALIGN_12B_R: 12bit right data alignment selected
479
  * @retval HAL status
480
  */
481
__weak HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t* pData, uint32_t Length, uint32_t Alignment)
482
{
483
  uint32_t tmpreg = 0U;
484
 
485
  /* Check the parameters */
486
  assert_param(IS_DAC_CHANNEL(Channel));
487
  assert_param(IS_DAC_ALIGN(Alignment));
488
 
489
  /* Process locked */
490
  __HAL_LOCK(hdac);
491
 
492
  /* Change DAC state */
493
  hdac->State = HAL_DAC_STATE_BUSY;
494
 
495
  if(Channel == DAC_CHANNEL_1)
496
  {
497
    /* Set the DMA transfer complete callback for channel1 */
498
    hdac->DMA_Handle1->XferCpltCallback = DAC_DMAConvCpltCh1;
499
 
500
    /* Set the DMA half transfer complete callback for channel1 */
501
    hdac->DMA_Handle1->XferHalfCpltCallback = DAC_DMAHalfConvCpltCh1;
502
 
503
    /* Set the DMA error callback for channel1 */
504
    hdac->DMA_Handle1->XferErrorCallback = DAC_DMAErrorCh1;
505
 
506
    /* Enable the selected DAC channel1 DMA request */
507
    SET_BIT(hdac->Instance->CR, DAC_CR_DMAEN1);
508
 
509
    /* Case of use of channel 1 */
510
    switch(Alignment)
511
    {
512
      case DAC_ALIGN_12B_R:
513
        /* Get DHR12R1 address */
514
        tmpreg = (uint32_t)&hdac->Instance->DHR12R1;
515
        break;
516
      case DAC_ALIGN_12B_L:
517
        /* Get DHR12L1 address */
518
        tmpreg = (uint32_t)&hdac->Instance->DHR12L1;
519
        break;
520
      case DAC_ALIGN_8B_R:
521
        /* Get DHR8R1 address */
522
        tmpreg = (uint32_t)&hdac->Instance->DHR8R1;
523
        break;
524
      default:
525
        break;
526
    }
527
  }
528
  else
529
  {
530
    /* Set the DMA transfer complete callback for channel2 */
531
    hdac->DMA_Handle2->XferCpltCallback = DAC_DMAConvCpltCh2;
532
 
533
    /* Set the DMA half transfer complete callback for channel2 */
534
    hdac->DMA_Handle2->XferHalfCpltCallback = DAC_DMAHalfConvCpltCh2;
535
 
536
    /* Set the DMA error callback for channel2 */
537
    hdac->DMA_Handle2->XferErrorCallback = DAC_DMAErrorCh2;
538
 
539
    /* Enable the selected DAC channel2 DMA request */
540
    SET_BIT(hdac->Instance->CR, DAC_CR_DMAEN2);
541
 
542
    /* Case of use of channel 2 */
543
    switch(Alignment)
544
    {
545
      case DAC_ALIGN_12B_R:
546
        /* Get DHR12R2 address */
547
        tmpreg = (uint32_t)&hdac->Instance->DHR12R2;
548
        break;
549
      case DAC_ALIGN_12B_L:
550
        /* Get DHR12L2 address */
551
        tmpreg = (uint32_t)&hdac->Instance->DHR12L2;
552
        break;
553
      case DAC_ALIGN_8B_R:
554
        /* Get DHR8R2 address */
555
        tmpreg = (uint32_t)&hdac->Instance->DHR8R2;
556
        break;
557
      default:
558
        break;
559
    }
560
  }
561
 
562
  /* Enable the DMA channel */
563
  if(Channel == DAC_CHANNEL_1)
564
  {
565
    /* Enable the DMA channel */
566
    HAL_DMA_Start_IT(hdac->DMA_Handle1, (uint32_t)pData, tmpreg, Length);
567
  }
568
  else
569
  {
570
    /* Enable the DMA channel */
571
    HAL_DMA_Start_IT(hdac->DMA_Handle2, (uint32_t)pData, tmpreg, Length);
572
  }
573
 
574
  /* Process Unlocked */
575
  __HAL_UNLOCK(hdac);
576
 
577
  /* Enable the Peripharal */
578
  __HAL_DAC_ENABLE(hdac, Channel);
579
 
580
  /* Return function status */
581
  return HAL_OK;
582
}
583
 
584
/**
585
  * @brief  Disables DAC and stop conversion of channel.
586
  *         Note: For STM32F100x devices with specific feature: DMA underrun.
587
  *         On these devices, this function disables the interruption of DMA
588
  *         underrun.
589
  *         (refer to redefinition of this function in DAC extended file)
590
  * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains
591
  *         the configuration information for the specified DAC.
592
  * @param  Channel: The selected DAC channel.
593
  *          This parameter can be one of the following values:
594
  *            @arg DAC_CHANNEL_1: DAC Channel1 selected
595
  *            @arg DAC_CHANNEL_2: DAC Channel2 selected  
596
  * @retval HAL status
597
  */
598
__weak HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel)
599
{
600
  HAL_StatusTypeDef status = HAL_OK;
601
 
602
  /* Check the parameters */
603
  assert_param(IS_DAC_CHANNEL(Channel));
604
 
605
  /* Disable the selected DAC channel DMA request */
606
  CLEAR_BIT(hdac->Instance->CR, DAC_CR_DMAEN1 << Channel);
607
 
608
  /* Disable the Peripharal */
609
  __HAL_DAC_DISABLE(hdac, Channel);
610
 
611
  /* Disable the DMA Channel */
612
  /* Channel1 is used */
613
  if (Channel == DAC_CHANNEL_1)
614
  {
615
    status = HAL_DMA_Abort(hdac->DMA_Handle1);
616
  }
617
  else /* Channel2 is used for */
618
  {
619
    status = HAL_DMA_Abort(hdac->DMA_Handle2);
620
  }
621
 
622
  /* Check if DMA Channel effectively disabled */
623
  if (status != HAL_OK)
624
  {
625
    /* Update ADC state machine to error */
626
    hdac->State = HAL_DAC_STATE_ERROR;      
627
  }
628
  else
629
  {
630
    /* Change DAC state */
631
    hdac->State = HAL_DAC_STATE_READY;
632
  }
633
 
634
  /* Return function status */
635
  return status;
636
}
637
 
638
/**
639
  * @brief  Returns the last data output value of the selected DAC channel.
640
  * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains
641
  *         the configuration information for the specified DAC.
642
  * @param  Channel: The selected DAC channel.
643
  *          This parameter can be one of the following values:
644
  *            @arg DAC_CHANNEL_1: DAC Channel1 selected
645
  *            @arg DAC_CHANNEL_2: DAC Channel2 selected
646
  * @retval The selected DAC channel data output value.
647
  */
648
uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef* hdac, uint32_t Channel)
649
{
650
  /* Check the parameters */
651
  assert_param(IS_DAC_CHANNEL(Channel));
652
 
653
  /* Returns the DAC channel data output register value */
654
  if(Channel == DAC_CHANNEL_1)
655
  {
656
    return hdac->Instance->DOR1;
657
  }
658
  else
659
  {
660
    return hdac->Instance->DOR2;
661
  }
662
}
663
 
664
/**
665
  * @brief  Conversion complete callback in non blocking mode for Channel1
666
  * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains
667
  *         the configuration information for the specified DAC.
668
  * @retval None
669
  */
670
__weak void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef* hdac)
671
{
672
  /* Prevent unused argument(s) compilation warning */
673
  UNUSED(hdac);
674
  /* NOTE : This function Should not be modified, when the callback is needed,
675
            the HAL_DAC_ConvCpltCallbackCh1 could be implemented in the user file
676
   */
677
}
678
 
679
/**
680
  * @brief  Conversion half DMA transfer callback in non blocking mode for Channel1
681
  * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains
682
  *         the configuration information for the specified DAC.
683
  * @retval None
684
  */
685
__weak void HAL_DAC_ConvHalfCpltCallbackCh1(DAC_HandleTypeDef* hdac)
686
{
687
  /* Prevent unused argument(s) compilation warning */
688
  UNUSED(hdac);
689
  /* NOTE : This function Should not be modified, when the callback is needed,
690
            the HAL_DAC_ConvHalfCpltCallbackCh1 could be implemented in the user file
691
   */
692
}
693
 
694
/**
695
  * @brief  Error DAC callback for Channel1.
696
  * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains
697
  *         the configuration information for the specified DAC.
698
  * @retval None
699
  */
700
__weak void HAL_DAC_ErrorCallbackCh1(DAC_HandleTypeDef *hdac)
701
{
702
  /* Prevent unused argument(s) compilation warning */
703
  UNUSED(hdac);
704
  /* NOTE : This function Should not be modified, when the callback is needed,
705
            the HAL_DAC_ErrorCallbackCh1 could be implemented in the user file
706
   */
707
}
708
 
709
/**
710
  * @}
711
  */
712
 
713
/** @defgroup DAC_Exported_Functions_Group3 Peripheral Control functions
714
 *  @brief    Peripheral Control functions
715
 *
716
@verbatim  
717
  ==============================================================================
718
             ##### Peripheral Control functions #####
719
  ==============================================================================  
720
    [..]  This section provides functions allowing to:
721
      (+) Configure channels.
722
      (+) Set the specified data holding register value for DAC channel.
723
 
724
@endverbatim
725
  * @{
726
  */
727
 
728
/**
729
  * @brief  Configures the selected DAC channel.
730
  * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains
731
  *         the configuration information for the specified DAC.
732
  * @param  sConfig: DAC configuration structure.
733
  * @param  Channel: The selected DAC channel.
734
  *          This parameter can be one of the following values:
735
  *            @arg DAC_CHANNEL_1: DAC Channel1 selected
736
  *            @arg DAC_CHANNEL_2: DAC Channel2 selected
737
  * @retval HAL status
738
  */
739
HAL_StatusTypeDef HAL_DAC_ConfigChannel(DAC_HandleTypeDef* hdac, DAC_ChannelConfTypeDef* sConfig, uint32_t Channel)
740
{
741
  uint32_t tmpreg1 = 0U;
742
 
743
  /* Check the DAC parameters */
744
  assert_param(IS_DAC_TRIGGER(sConfig->DAC_Trigger));
745
  assert_param(IS_DAC_OUTPUT_BUFFER_STATE(sConfig->DAC_OutputBuffer));
746
  assert_param(IS_DAC_CHANNEL(Channel));
747
 
748
  /* Process locked */
749
  __HAL_LOCK(hdac);
750
 
751
  /* Change DAC state */
752
  hdac->State = HAL_DAC_STATE_BUSY;
753
 
754
  /* Configure for the selected DAC channel: buffer output, trigger */
755
  /* Set TSELx and TENx bits according to DAC_Trigger value */
756
  /* Set BOFFx bit according to DAC_OutputBuffer value */  
757
  SET_BIT(tmpreg1, (sConfig->DAC_Trigger | sConfig->DAC_OutputBuffer));
758
 
759
  /* Clear BOFFx, TENx, TSELx, WAVEx and MAMPx bits */  
760
  /* Calculate CR register value depending on DAC_Channel */
761
  MODIFY_REG(hdac->Instance->CR,
762
             ((uint32_t)(DAC_CR_MAMP1 | DAC_CR_WAVE1 | DAC_CR_TSEL1 | DAC_CR_TEN1 | DAC_CR_BOFF1)) << Channel,
763
             tmpreg1 << Channel);
764
 
765
  /* Disable wave generation */
766
  hdac->Instance->CR &= ~(DAC_CR_WAVE1 << Channel);
767
 
768
  /* Change DAC state */
769
  hdac->State = HAL_DAC_STATE_READY;
770
 
771
  /* Process unlocked */
772
  __HAL_UNLOCK(hdac);
773
 
774
  /* Return function status */
775
  return HAL_OK;
776
}
777
 
778
/**
779
  * @brief  Set the specified data holding register value for DAC channel.
780
  * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains
781
  *         the configuration information for the specified DAC.
782
  * @param  Channel: The selected DAC channel.
783
  *          This parameter can be one of the following values:
784
  *            @arg DAC_CHANNEL_1: DAC Channel1 selected
785
  *            @arg DAC_CHANNEL_2: DAC Channel2 selected  
786
  * @param  Alignment: Specifies the data alignment.
787
  *          This parameter can be one of the following values:
788
  *            @arg DAC_ALIGN_8B_R: 8bit right data alignment selected
789
  *            @arg DAC_ALIGN_12B_L: 12bit left data alignment selected
790
  *            @arg DAC_ALIGN_12B_R: 12bit right data alignment selected
791
  * @param  Data: Data to be loaded in the selected data holding register.
792
  * @retval HAL status
793
  */
794
HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data)
795
{  
796
  __IO uint32_t tmp = 0U;
797
 
798
  /* Check the parameters */
799
  assert_param(IS_DAC_CHANNEL(Channel));
800
  assert_param(IS_DAC_ALIGN(Alignment));
801
  assert_param(IS_DAC_DATA(Data));
802
 
803
  tmp = (uint32_t)hdac->Instance;
804
  if(Channel == DAC_CHANNEL_1)
805
  {
806
    tmp += DAC_DHR12R1_ALIGNMENT(Alignment);
807
  }
808
  else
809
  {
810
    tmp += DAC_DHR12R2_ALIGNMENT(Alignment);
811
  }
812
 
813
  /* Set the DAC channel selected data holding register */
814
  *(__IO uint32_t *) tmp = Data;
815
 
816
  /* Return function status */
817
  return HAL_OK;
818
}
819
 
820
/**
821
  * @}
822
  */
823
 
824
/** @defgroup DAC_Exported_Functions_Group4 Peripheral State and Errors functions
825
 *  @brief   Peripheral State and Errors functions
826
 *
827
@verbatim  
828
  ==============================================================================
829
            ##### Peripheral State and Errors functions #####
830
  ==============================================================================  
831
    [..]
832
    This subsection provides functions allowing to
833
      (+) Check the DAC state.
834
      (+) Check the DAC Errors.
835
 
836
@endverbatim
837
  * @{
838
  */
839
 
840
/**
841
  * @brief  return the DAC state
842
  * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains
843
  *         the configuration information for the specified DAC.
844
  * @retval HAL state
845
  */
846
HAL_DAC_StateTypeDef HAL_DAC_GetState(DAC_HandleTypeDef* hdac)
847
{
848
  /* Return DAC state */
849
  return hdac->State;
850
}
851
 
852
 
853
/**
854
  * @brief  Return the DAC error code
855
  * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains
856
  *         the configuration information for the specified DAC.
857
  * @retval DAC Error Code
858
  */
859
uint32_t HAL_DAC_GetError(DAC_HandleTypeDef *hdac)
860
{
861
  return hdac->ErrorCode;
862
}
863
 
864
/**
865
  * @}
866
  */
867
 
868
/**
869
  * @}
870
  */
871
 
872
/** @addtogroup DAC_Private_Functions
873
  * @{
874
  */
875
 
876
/**
877
  * @brief  DMA conversion complete callback.
878
  * @param  hdma: pointer to a DMA_HandleTypeDef structure that contains
879
  *                the configuration information for the specified DMA module.
880
  * @retval None
881
  */
882
void DAC_DMAConvCpltCh1(DMA_HandleTypeDef *hdma)  
883
{
884
  DAC_HandleTypeDef* hdac = ( DAC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
885
 
886
  HAL_DAC_ConvCpltCallbackCh1(hdac);
887
 
888
  hdac->State = HAL_DAC_STATE_READY;
889
}
890
 
891
/**
892
  * @brief  DMA half transfer complete callback.
893
  * @param  hdma: pointer to a DMA_HandleTypeDef structure that contains
894
  *                the configuration information for the specified DMA module.
895
  * @retval None
896
  */
897
void DAC_DMAHalfConvCpltCh1(DMA_HandleTypeDef *hdma)  
898
{
899
    DAC_HandleTypeDef* hdac = ( DAC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
900
    /* Conversion complete callback */
901
    HAL_DAC_ConvHalfCpltCallbackCh1(hdac);
902
}
903
 
904
/**
905
  * @brief  DMA error callback
906
  * @param  hdma: pointer to a DMA_HandleTypeDef structure that contains
907
  *                the configuration information for the specified DMA module.
908
  * @retval None
909
  */
910
void DAC_DMAErrorCh1(DMA_HandleTypeDef *hdma)  
911
{
912
  DAC_HandleTypeDef* hdac = ( DAC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
913
 
914
  /* Set DAC error code to DMA error */
915
  hdac->ErrorCode |= HAL_DAC_ERROR_DMA;
916
 
917
  HAL_DAC_ErrorCallbackCh1(hdac);
918
 
919
  hdac->State = HAL_DAC_STATE_READY;
920
}
921
 
922
/**
923
  * @}
924
  */
925
 
926
#endif /* STM32F100xB || STM32F100xE || STM32F101xE || STM32F101xG || STM32F103xE || STM32F103xG || STM32F105xC || STM32F107xC */
927
#endif /* HAL_DAC_MODULE_ENABLED */
928
 
929
/**
930
  * @}
931
  */
932
 
933
/**
934
  * @}
935
  */
936
 
937
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/