Subversion Repositories testOled

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 mjames 1
/**
2
  ******************************************************************************
3
  * @file    stm32f1xx_hal_dac_ex.c
4
  * @author  MCD Application Team
5
  * @brief   Extended DAC HAL module driver.
6
  *          This file provides firmware functions to manage the extended
7
  *          functionalities of the DAC peripheral.
8
  *
9
  *
10
  @verbatim
11
  ==============================================================================
12
                      ##### How to use this driver #####
13
  ==============================================================================
14
    [..]
15
 
16
     *** Dual mode IO operation ***
17
     ==============================
18
     [..]
19
      (+) When Dual mode is enabled (i.e. DAC Channel1 and Channel2 are used simultaneously) :
20
          Use HAL_DACEx_DualGetValue() to get digital data to be converted and use
21
          HAL_DACEx_DualSetValue() to set digital value to converted simultaneously in
22
          Channel 1 and Channel 2.
23
 
24
     *** Signal generation operation ***
25
     ===================================
26
     [..]
27
      (+) Use HAL_DACEx_TriangleWaveGenerate() to generate Triangle signal.
28
      (+) Use HAL_DACEx_NoiseWaveGenerate() to generate Noise signal.
29
 
30
 @endverbatim
31
  ******************************************************************************
32
  * @attention
33
  *
34
  * <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.
35
  * All rights reserved.</center></h2>
36
  *
37
  * This software component is licensed by ST under BSD 3-Clause license,
38
  * the "License"; You may not use this file except in compliance with the
39
  * License. You may obtain a copy of the License at:
40
  *                        opensource.org/licenses/BSD-3-Clause
41
  *
42
  ******************************************************************************
43
  */
44
 
45
 
46
/* Includes ------------------------------------------------------------------*/
47
#include "stm32f1xx_hal.h"
48
 
49
/** @addtogroup STM32F1xx_HAL_Driver
50
  * @{
51
  */
52
 
53
#ifdef HAL_DAC_MODULE_ENABLED
54
 
55
#if defined(DAC)
56
 
57
/** @defgroup DACEx DACEx
58
  * @brief DAC Extended HAL module driver
59
  * @{
60
  */
61
 
62
/* Private typedef -----------------------------------------------------------*/
63
/* Private define ------------------------------------------------------------*/
64
/* Private macro -------------------------------------------------------------*/
65
/* Private variables ---------------------------------------------------------*/
66
/* Private function prototypes -----------------------------------------------*/
67
/* Exported functions --------------------------------------------------------*/
68
 
69
/** @defgroup DACEx_Exported_Functions DACEx Exported Functions
70
  * @{
71
  */
72
 
73
/** @defgroup DACEx_Exported_Functions_Group2 IO operation functions
74
  *  @brief    Extended IO operation functions
75
  *
76
@verbatim
77
  ==============================================================================
78
                 ##### Extended features functions #####
79
  ==============================================================================
80
    [..]  This section provides functions allowing to:
81
      (+) Start conversion.
82
      (+) Stop conversion.
83
      (+) Start conversion and enable DMA transfer.
84
      (+) Stop conversion and disable DMA transfer.
85
      (+) Get result of conversion.
86
      (+) Get result of dual mode conversion.
87
 
88
@endverbatim
89
  * @{
90
  */
91
 
92
 
93
/**
94
  * @brief  Enables DAC and starts conversion of both channels.
95
  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
96
  *         the configuration information for the specified DAC.
97
  * @retval HAL status
98
  */
99
HAL_StatusTypeDef HAL_DACEx_DualStart(DAC_HandleTypeDef *hdac)
100
{
101
  uint32_t tmp_swtrig = 0UL;
102
 
103
 
104
  /* Process locked */
105
  __HAL_LOCK(hdac);
106
 
107
  /* Change DAC state */
108
  hdac->State = HAL_DAC_STATE_BUSY;
109
 
110
  /* Enable the Peripheral */
111
  __HAL_DAC_ENABLE(hdac, DAC_CHANNEL_1);
112
  __HAL_DAC_ENABLE(hdac, DAC_CHANNEL_2);
113
 
114
  /* Check if software trigger enabled */
115
  if ((hdac->Instance->CR & (DAC_CR_TEN1 | DAC_CR_TSEL1)) == DAC_TRIGGER_SOFTWARE)
116
  {
117
    tmp_swtrig |= DAC_SWTRIGR_SWTRIG1;
118
  }
119
  if ((hdac->Instance->CR & (DAC_CR_TEN2 | DAC_CR_TSEL2)) == (DAC_TRIGGER_SOFTWARE << (DAC_CHANNEL_2 & 0x10UL)))
120
  {
121
    tmp_swtrig |= DAC_SWTRIGR_SWTRIG2;
122
  }
123
  /* Enable the selected DAC software conversion*/
124
  SET_BIT(hdac->Instance->SWTRIGR, tmp_swtrig);
125
 
126
  /* Change DAC state */
127
  hdac->State = HAL_DAC_STATE_READY;
128
 
129
  /* Process unlocked */
130
  __HAL_UNLOCK(hdac);
131
 
132
  /* Return function status */
133
  return HAL_OK;
134
}
135
 
136
/**
137
  * @brief  Disables DAC and stop conversion of both channels.
138
  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
139
  *         the configuration information for the specified DAC.
140
  * @retval HAL status
141
  */
142
HAL_StatusTypeDef HAL_DACEx_DualStop(DAC_HandleTypeDef *hdac)
143
{
144
 
145
  /* Disable the Peripheral */
146
  __HAL_DAC_DISABLE(hdac, DAC_CHANNEL_1);
147
  __HAL_DAC_DISABLE(hdac, DAC_CHANNEL_2);
148
 
149
  /* Change DAC state */
150
  hdac->State = HAL_DAC_STATE_READY;
151
 
152
  /* Return function status */
153
  return HAL_OK;
154
}
155
 
156
 
157
/**
158
  * @brief  Enable or disable the selected DAC channel wave generation.
159
  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
160
  *         the configuration information for the specified DAC.
161
  * @param  Channel The selected DAC channel.
162
  *          This parameter can be one of the following values:
163
  *            @arg DAC_CHANNEL_1: DAC Channel1 selected
164
  *            @arg DAC_CHANNEL_2: DAC Channel2 selected
165
  * @param  Amplitude Select max triangle amplitude.
166
  *          This parameter can be one of the following values:
167
  *            @arg DAC_TRIANGLEAMPLITUDE_1: Select max triangle amplitude of 1
168
  *            @arg DAC_TRIANGLEAMPLITUDE_3: Select max triangle amplitude of 3
169
  *            @arg DAC_TRIANGLEAMPLITUDE_7: Select max triangle amplitude of 7
170
  *            @arg DAC_TRIANGLEAMPLITUDE_15: Select max triangle amplitude of 15
171
  *            @arg DAC_TRIANGLEAMPLITUDE_31: Select max triangle amplitude of 31
172
  *            @arg DAC_TRIANGLEAMPLITUDE_63: Select max triangle amplitude of 63
173
  *            @arg DAC_TRIANGLEAMPLITUDE_127: Select max triangle amplitude of 127
174
  *            @arg DAC_TRIANGLEAMPLITUDE_255: Select max triangle amplitude of 255
175
  *            @arg DAC_TRIANGLEAMPLITUDE_511: Select max triangle amplitude of 511
176
  *            @arg DAC_TRIANGLEAMPLITUDE_1023: Select max triangle amplitude of 1023
177
  *            @arg DAC_TRIANGLEAMPLITUDE_2047: Select max triangle amplitude of 2047
178
  *            @arg DAC_TRIANGLEAMPLITUDE_4095: Select max triangle amplitude of 4095
179
  * @retval HAL status
180
  */
181
HAL_StatusTypeDef HAL_DACEx_TriangleWaveGenerate(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Amplitude)
182
{
183
  /* Check the parameters */
184
  assert_param(IS_DAC_CHANNEL(Channel));
185
  assert_param(IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(Amplitude));
186
 
187
  /* Process locked */
188
  __HAL_LOCK(hdac);
189
 
190
  /* Change DAC state */
191
  hdac->State = HAL_DAC_STATE_BUSY;
192
 
193
  /* Enable the triangle wave generation for the selected DAC channel */
194
  MODIFY_REG(hdac->Instance->CR, ((DAC_CR_WAVE1) | (DAC_CR_MAMP1)) << (Channel & 0x10UL),
195
             (DAC_CR_WAVE1_1 | Amplitude) << (Channel & 0x10UL));
196
 
197
  /* Change DAC state */
198
  hdac->State = HAL_DAC_STATE_READY;
199
 
200
  /* Process unlocked */
201
  __HAL_UNLOCK(hdac);
202
 
203
  /* Return function status */
204
  return HAL_OK;
205
}
206
 
207
/**
208
  * @brief  Enable or disable the selected DAC channel wave generation.
209
  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
210
  *         the configuration information for the specified DAC.
211
  * @param  Channel The selected DAC channel.
212
  *          This parameter can be one of the following values:
213
  *            @arg DAC_CHANNEL_1: DAC Channel1 selected
214
  *            @arg DAC_CHANNEL_2: DAC Channel2 selected
215
  * @param  Amplitude Unmask DAC channel LFSR for noise wave generation.
216
  *          This parameter can be one of the following values:
217
  *            @arg DAC_LFSRUNMASK_BIT0: Unmask DAC channel LFSR bit0 for noise wave generation
218
  *            @arg DAC_LFSRUNMASK_BITS1_0: Unmask DAC channel LFSR bit[1:0] for noise wave generation
219
  *            @arg DAC_LFSRUNMASK_BITS2_0: Unmask DAC channel LFSR bit[2:0] for noise wave generation
220
  *            @arg DAC_LFSRUNMASK_BITS3_0: Unmask DAC channel LFSR bit[3:0] for noise wave generation
221
  *            @arg DAC_LFSRUNMASK_BITS4_0: Unmask DAC channel LFSR bit[4:0] for noise wave generation
222
  *            @arg DAC_LFSRUNMASK_BITS5_0: Unmask DAC channel LFSR bit[5:0] for noise wave generation
223
  *            @arg DAC_LFSRUNMASK_BITS6_0: Unmask DAC channel LFSR bit[6:0] for noise wave generation
224
  *            @arg DAC_LFSRUNMASK_BITS7_0: Unmask DAC channel LFSR bit[7:0] for noise wave generation
225
  *            @arg DAC_LFSRUNMASK_BITS8_0: Unmask DAC channel LFSR bit[8:0] for noise wave generation
226
  *            @arg DAC_LFSRUNMASK_BITS9_0: Unmask DAC channel LFSR bit[9:0] for noise wave generation
227
  *            @arg DAC_LFSRUNMASK_BITS10_0: Unmask DAC channel LFSR bit[10:0] for noise wave generation
228
  *            @arg DAC_LFSRUNMASK_BITS11_0: Unmask DAC channel LFSR bit[11:0] for noise wave generation
229
  * @retval HAL status
230
  */
231
HAL_StatusTypeDef HAL_DACEx_NoiseWaveGenerate(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Amplitude)
232
{
233
  /* Check the parameters */
234
  assert_param(IS_DAC_CHANNEL(Channel));
235
  assert_param(IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(Amplitude));
236
 
237
  /* Process locked */
238
  __HAL_LOCK(hdac);
239
 
240
  /* Change DAC state */
241
  hdac->State = HAL_DAC_STATE_BUSY;
242
 
243
  /* Enable the noise wave generation for the selected DAC channel */
244
  MODIFY_REG(hdac->Instance->CR, ((DAC_CR_WAVE1) | (DAC_CR_MAMP1)) << (Channel & 0x10UL),
245
             (DAC_CR_WAVE1_0 | Amplitude) << (Channel & 0x10UL));
246
 
247
  /* Change DAC state */
248
  hdac->State = HAL_DAC_STATE_READY;
249
 
250
  /* Process unlocked */
251
  __HAL_UNLOCK(hdac);
252
 
253
  /* Return function status */
254
  return HAL_OK;
255
}
256
 
257
 
258
/**
259
  * @brief  Set the specified data holding register value for dual DAC channel.
260
  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
261
  *               the configuration information for the specified DAC.
262
  * @param  Alignment Specifies the data alignment for dual channel DAC.
263
  *          This parameter can be one of the following values:
264
  *            DAC_ALIGN_8B_R: 8bit right data alignment selected
265
  *            DAC_ALIGN_12B_L: 12bit left data alignment selected
266
  *            DAC_ALIGN_12B_R: 12bit right data alignment selected
267
  * @param  Data1 Data for DAC Channel1 to be loaded in the selected data holding register.
268
  * @param  Data2 Data for DAC Channel2 to be loaded in the selected data  holding register.
269
  * @note   In dual mode, a unique register access is required to write in both
270
  *          DAC channels at the same time.
271
  * @retval HAL status
272
  */
273
HAL_StatusTypeDef HAL_DACEx_DualSetValue(DAC_HandleTypeDef *hdac, uint32_t Alignment, uint32_t Data1, uint32_t Data2)
274
{
275
  uint32_t data;
276
  uint32_t tmp;
277
 
278
  /* Check the parameters */
279
  assert_param(IS_DAC_ALIGN(Alignment));
280
  assert_param(IS_DAC_DATA(Data1));
281
  assert_param(IS_DAC_DATA(Data2));
282
 
283
  /* Calculate and set dual DAC data holding register value */
284
  if (Alignment == DAC_ALIGN_8B_R)
285
  {
286
    data = ((uint32_t)Data2 << 8U) | Data1;
287
  }
288
  else
289
  {
290
    data = ((uint32_t)Data2 << 16U) | Data1;
291
  }
292
 
293
  tmp = (uint32_t)hdac->Instance;
294
  tmp += DAC_DHR12RD_ALIGNMENT(Alignment);
295
 
296
  /* Set the dual DAC selected data holding register */
297
  *(__IO uint32_t *)tmp = data;
298
 
299
  /* Return function status */
300
  return HAL_OK;
301
}
302
 
303
/**
304
  * @brief  Conversion complete callback in non-blocking mode for Channel2.
305
  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
306
  *         the configuration information for the specified DAC.
307
  * @retval None
308
  */
309
__weak void HAL_DACEx_ConvCpltCallbackCh2(DAC_HandleTypeDef *hdac)
310
{
311
  /* Prevent unused argument(s) compilation warning */
312
  UNUSED(hdac);
313
 
314
  /* NOTE : This function should not be modified, when the callback is needed,
315
            the HAL_DACEx_ConvCpltCallbackCh2 could be implemented in the user file
316
   */
317
}
318
 
319
/**
320
  * @brief  Conversion half DMA transfer callback in non-blocking mode for Channel2.
321
  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
322
  *         the configuration information for the specified DAC.
323
  * @retval None
324
  */
325
__weak void HAL_DACEx_ConvHalfCpltCallbackCh2(DAC_HandleTypeDef *hdac)
326
{
327
  /* Prevent unused argument(s) compilation warning */
328
  UNUSED(hdac);
329
 
330
  /* NOTE : This function should not be modified, when the callback is needed,
331
            the HAL_DACEx_ConvHalfCpltCallbackCh2 could be implemented in the user file
332
   */
333
}
334
 
335
/**
336
  * @brief  Error DAC callback for Channel2.
337
  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
338
  *         the configuration information for the specified DAC.
339
  * @retval None
340
  */
341
__weak void HAL_DACEx_ErrorCallbackCh2(DAC_HandleTypeDef *hdac)
342
{
343
  /* Prevent unused argument(s) compilation warning */
344
  UNUSED(hdac);
345
 
346
  /* NOTE : This function should not be modified, when the callback is needed,
347
            the HAL_DACEx_ErrorCallbackCh2 could be implemented in the user file
348
   */
349
}
350
 
351
/**
352
  * @brief  DMA underrun DAC callback for Channel2.
353
  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
354
  *         the configuration information for the specified DAC.
355
  * @retval None
356
  */
357
__weak void HAL_DACEx_DMAUnderrunCallbackCh2(DAC_HandleTypeDef *hdac)
358
{
359
  /* Prevent unused argument(s) compilation warning */
360
  UNUSED(hdac);
361
 
362
  /* NOTE : This function should not be modified, when the callback is needed,
363
            the HAL_DACEx_DMAUnderrunCallbackCh2 could be implemented in the user file
364
   */
365
}
366
 
367
 
368
 
369
/**
370
  * @}
371
  */
372
 
373
/** @defgroup DACEx_Exported_Functions_Group3 Peripheral Control functions
374
  *  @brief    Extended Peripheral Control functions
375
  *
376
@verbatim
377
  ==============================================================================
378
             ##### Peripheral Control functions #####
379
  ==============================================================================
380
    [..]  This section provides functions allowing to:
381
      (+) Set the specified data holding register value for DAC channel.
382
 
383
@endverbatim
384
  * @{
385
  */
386
 
387
 
388
/**
389
  * @brief  Return the last data output value of the selected DAC channel.
390
  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
391
  *         the configuration information for the specified DAC.
392
  * @retval The selected DAC channel data output value.
393
  */
394
uint32_t HAL_DACEx_DualGetValue(DAC_HandleTypeDef *hdac)
395
{
396
  uint32_t tmp = 0UL;
397
 
398
  tmp |= hdac->Instance->DOR1;
399
 
400
  tmp |= hdac->Instance->DOR2 << 16UL;
401
 
402
  /* Returns the DAC channel data output register value */
403
  return tmp;
404
}
405
 
406
 
407
/**
408
  * @}
409
  */
410
/**
411
  * @}
412
  */
413
 
414
/* Private functions ---------------------------------------------------------*/
415
/** @defgroup DACEx_Private_Functions DACEx private functions
416
  *  @brief    Extended private functions
417
  * @{
418
  */
419
 
420
 
421
/**
422
  * @brief  DMA conversion complete callback.
423
  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains
424
  *                the configuration information for the specified DMA module.
425
  * @retval None
426
  */
427
void DAC_DMAConvCpltCh2(DMA_HandleTypeDef *hdma)
428
{
429
  DAC_HandleTypeDef *hdac = (DAC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
430
 
431
#if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
432
  hdac->ConvCpltCallbackCh2(hdac);
433
#else
434
  HAL_DACEx_ConvCpltCallbackCh2(hdac);
435
#endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
436
 
437
  hdac->State = HAL_DAC_STATE_READY;
438
}
439
 
440
/**
441
  * @brief  DMA half transfer complete callback.
442
  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains
443
  *                the configuration information for the specified DMA module.
444
  * @retval None
445
  */
446
void DAC_DMAHalfConvCpltCh2(DMA_HandleTypeDef *hdma)
447
{
448
  DAC_HandleTypeDef *hdac = (DAC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
449
  /* Conversion complete callback */
450
#if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
451
  hdac->ConvHalfCpltCallbackCh2(hdac);
452
#else
453
  HAL_DACEx_ConvHalfCpltCallbackCh2(hdac);
454
#endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
455
}
456
 
457
/**
458
  * @brief  DMA error callback.
459
  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains
460
  *                the configuration information for the specified DMA module.
461
  * @retval None
462
  */
463
void DAC_DMAErrorCh2(DMA_HandleTypeDef *hdma)
464
{
465
  DAC_HandleTypeDef *hdac = (DAC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
466
 
467
  /* Set DAC error code to DMA error */
468
  hdac->ErrorCode |= HAL_DAC_ERROR_DMA;
469
 
470
#if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
471
  hdac->ErrorCallbackCh2(hdac);
472
#else
473
  HAL_DACEx_ErrorCallbackCh2(hdac);
474
#endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
475
 
476
  hdac->State = HAL_DAC_STATE_READY;
477
}
478
 
479
 
480
/**
481
  * @}
482
  */
483
 
484
/**
485
  * @}
486
  */
487
 
488
#endif /* DAC */
489
 
490
#endif /* HAL_DAC_MODULE_ENABLED */
491
 
492
/**
493
  * @}
494
  */
495
 
496
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/