]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_M7_STM32F7_STM32756G-EVAL_IAR_Keil/ST_Library/stm32f7xx_hal_dac_ex.c
Final V8.2.1 release ready for tagging:
[freertos] / FreeRTOS / Demo / CORTEX_M7_STM32F7_STM32756G-EVAL_IAR_Keil / ST_Library / stm32f7xx_hal_dac_ex.c
1 /**\r
2   ******************************************************************************\r
3   * @file    stm32f7xx_hal_dac_ex.c\r
4   * @author  MCD Application Team\r
5   * @version V1.0.0RC1\r
6   * @date    24-March-2015\r
7   * @brief   Extended DAC HAL module driver.\r
8   *         This file provides firmware functions to manage the following \r
9   *         functionalities of DAC extension peripheral:\r
10   *           + Extended features functions\r
11   *     \r
12   *\r
13   @verbatim      \r
14   ==============================================================================\r
15                       ##### How to use this driver #####\r
16   ==============================================================================\r
17     [..]          \r
18       (+) When Dual mode is enabled (i.e DAC Channel1 and Channel2 are used simultaneously) :\r
19           Use HAL_DACEx_DualGetValue() to get digital data to be converted and use\r
20           HAL_DACEx_DualSetValue() to set digital value to converted simultaneously in Channel 1 and Channel 2.  \r
21       (+) Use HAL_DACEx_TriangleWaveGenerate() to generate Triangle signal.\r
22       (+) Use HAL_DACEx_NoiseWaveGenerate() to generate Noise signal.\r
23    \r
24  @endverbatim    \r
25   ******************************************************************************\r
26   * @attention\r
27   *\r
28   * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>\r
29   *\r
30   * Redistribution and use in source and binary forms, with or without modification,\r
31   * are permitted provided that the following conditions are met:\r
32   *   1. Redistributions of source code must retain the above copyright notice,\r
33   *      this list of conditions and the following disclaimer.\r
34   *   2. Redistributions in binary form must reproduce the above copyright notice,\r
35   *      this list of conditions and the following disclaimer in the documentation\r
36   *      and/or other materials provided with the distribution.\r
37   *   3. Neither the name of STMicroelectronics nor the names of its contributors\r
38   *      may be used to endorse or promote products derived from this software\r
39   *      without specific prior written permission.\r
40   *\r
41   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
42   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
43   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
44   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r
45   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
46   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r
47   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r
48   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r
49   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
50   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
51   *\r
52   ******************************************************************************\r
53   */ \r
54 \r
55 \r
56 /* Includes ------------------------------------------------------------------*/\r
57 #include "stm32f7xx_hal.h"\r
58 \r
59 /** @addtogroup STM32F7xx_HAL_Driver\r
60   * @{\r
61   */\r
62 \r
63 /** @defgroup DACEx DACEx\r
64   * @brief DAC driver modules\r
65   * @{\r
66   */ \r
67 \r
68 #ifdef HAL_DAC_MODULE_ENABLED\r
69 \r
70 #if defined(STM32F756xx) || defined(STM32F746xx)\r
71 \r
72 /* Private typedef -----------------------------------------------------------*/\r
73 /* Private define ------------------------------------------------------------*/\r
74 /* Private macro -------------------------------------------------------------*/\r
75 /* Private variables ---------------------------------------------------------*/\r
76 /* Private function prototypes -----------------------------------------------*/\r
77 /* Private functions ---------------------------------------------------------*/\r
78 /* Exported functions --------------------------------------------------------*/\r
79 /** @defgroup DACEx_Exported_Functions DAC Exported Functions\r
80   * @{\r
81   */\r
82 \r
83 /** @defgroup DACEx_Exported_Functions_Group1 Extended features functions\r
84  *  @brief    Extended features functions \r
85  *\r
86 @verbatim   \r
87   ==============================================================================\r
88                  ##### Extended features functions #####\r
89   ==============================================================================  \r
90     [..]  This section provides functions allowing to:\r
91       (+) Start conversion.\r
92       (+) Stop conversion.\r
93       (+) Start conversion and enable DMA transfer.\r
94       (+) Stop conversion and disable DMA transfer.\r
95       (+) Get result of conversion.\r
96       (+) Get result of dual mode conversion.\r
97                      \r
98 @endverbatim\r
99   * @{\r
100   */\r
101 \r
102 /**\r
103   * @brief  Returns the last data output value of the selected DAC channel.\r
104   * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains\r
105   *         the configuration information for the specified DAC.\r
106   * @retval The selected DAC channel data output value.\r
107   */\r
108 uint32_t HAL_DACEx_DualGetValue(DAC_HandleTypeDef* hdac)\r
109 {\r
110   uint32_t tmp = 0;\r
111   \r
112   tmp |= hdac->Instance->DOR1;\r
113   \r
114   tmp |= hdac->Instance->DOR2 << 16;\r
115   \r
116   /* Returns the DAC channel data output register value */\r
117   return tmp;\r
118 }\r
119 \r
120 /**\r
121   * @brief  Enables or disables the selected DAC channel wave generation.\r
122   * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains\r
123   *         the configuration information for the specified DAC.\r
124   * @param  Channel: The selected DAC channel. \r
125   *          This parameter can be one of the following values:\r
126   *            @arg DAC_CHANNEL_1: DAC Channel1 selected \r
127   *            @arg DAC_CHANNEL_2: DAC Channel2 selected\r
128   * @param  Amplitude: Select max triangle amplitude. \r
129   *          This parameter can be one of the following values:\r
130   *            @arg DAC_TRIANGLEAMPLITUDE_1: Select max triangle amplitude of 1\r
131   *            @arg DAC_TRIANGLEAMPLITUDE_3: Select max triangle amplitude of 3\r
132   *            @arg DAC_TRIANGLEAMPLITUDE_7: Select max triangle amplitude of 7\r
133   *            @arg DAC_TRIANGLEAMPLITUDE_15: Select max triangle amplitude of 15\r
134   *            @arg DAC_TRIANGLEAMPLITUDE_31: Select max triangle amplitude of 31\r
135   *            @arg DAC_TRIANGLEAMPLITUDE_63: Select max triangle amplitude of 63\r
136   *            @arg DAC_TRIANGLEAMPLITUDE_127: Select max triangle amplitude of 127\r
137   *            @arg DAC_TRIANGLEAMPLITUDE_255: Select max triangle amplitude of 255\r
138   *            @arg DAC_TRIANGLEAMPLITUDE_511: Select max triangle amplitude of 511\r
139   *            @arg DAC_TRIANGLEAMPLITUDE_1023: Select max triangle amplitude of 1023\r
140   *            @arg DAC_TRIANGLEAMPLITUDE_2047: Select max triangle amplitude of 2047\r
141   *            @arg DAC_TRIANGLEAMPLITUDE_4095: Select max triangle amplitude of 4095                               \r
142   * @retval HAL status\r
143   */\r
144 HAL_StatusTypeDef HAL_DACEx_TriangleWaveGenerate(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Amplitude)\r
145 {  \r
146   /* Check the parameters */\r
147   assert_param(IS_DAC_CHANNEL(Channel));\r
148   assert_param(IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(Amplitude));\r
149   \r
150   /* Process locked */\r
151   __HAL_LOCK(hdac);\r
152   \r
153   /* Change DAC state */\r
154   hdac->State = HAL_DAC_STATE_BUSY;\r
155   \r
156   /* Enable the selected wave generation for the selected DAC channel */\r
157   MODIFY_REG(hdac->Instance->CR, (DAC_CR_WAVE1 | DAC_CR_MAMP1) << Channel, (DAC_CR_WAVE1_1 | Amplitude) << Channel);\r
158 \r
159   /* Change DAC state */\r
160   hdac->State = HAL_DAC_STATE_READY;\r
161   \r
162   /* Process unlocked */\r
163   __HAL_UNLOCK(hdac);\r
164   \r
165   /* Return function status */\r
166   return HAL_OK;\r
167 }\r
168 \r
169 /**\r
170   * @brief  Enables or disables the selected DAC channel wave generation.\r
171   * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains\r
172   *         the configuration information for the specified DAC. \r
173   * @param  Channel: The selected DAC channel. \r
174   *          This parameter can be one of the following values:\r
175   *            @arg DAC_CHANNEL_1: DAC Channel1 selected \r
176   *            @arg DAC_CHANNEL_2: DAC Channel2 selected\r
177   * @param  Amplitude: Unmask DAC channel LFSR for noise wave generation. \r
178   *          This parameter can be one of the following values: \r
179   *            @arg DAC_LFSRUNMASK_BIT0: Unmask DAC channel LFSR bit0 for noise wave generation\r
180   *            @arg DAC_LFSRUNMASK_BITS1_0: Unmask DAC channel LFSR bit[1:0] for noise wave generation  \r
181   *            @arg DAC_LFSRUNMASK_BITS2_0: Unmask DAC channel LFSR bit[2:0] for noise wave generation\r
182   *            @arg DAC_LFSRUNMASK_BITS3_0: Unmask DAC channel LFSR bit[3:0] for noise wave generation \r
183   *            @arg DAC_LFSRUNMASK_BITS4_0: Unmask DAC channel LFSR bit[4:0] for noise wave generation \r
184   *            @arg DAC_LFSRUNMASK_BITS5_0: Unmask DAC channel LFSR bit[5:0] for noise wave generation \r
185   *            @arg DAC_LFSRUNMASK_BITS6_0: Unmask DAC channel LFSR bit[6:0] for noise wave generation \r
186   *            @arg DAC_LFSRUNMASK_BITS7_0: Unmask DAC channel LFSR bit[7:0] for noise wave generation \r
187   *            @arg DAC_LFSRUNMASK_BITS8_0: Unmask DAC channel LFSR bit[8:0] for noise wave generation \r
188   *            @arg DAC_LFSRUNMASK_BITS9_0: Unmask DAC channel LFSR bit[9:0] for noise wave generation \r
189   *            @arg DAC_LFSRUNMASK_BITS10_0: Unmask DAC channel LFSR bit[10:0] for noise wave generation \r
190   *            @arg DAC_LFSRUNMASK_BITS11_0: Unmask DAC channel LFSR bit[11:0] for noise wave generation \r
191   * @retval HAL status\r
192   */\r
193 HAL_StatusTypeDef HAL_DACEx_NoiseWaveGenerate(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Amplitude)\r
194 {  \r
195   /* Check the parameters */\r
196   assert_param(IS_DAC_CHANNEL(Channel));\r
197   assert_param(IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(Amplitude));\r
198   \r
199   /* Process locked */\r
200   __HAL_LOCK(hdac);\r
201   \r
202   /* Change DAC state */\r
203   hdac->State = HAL_DAC_STATE_BUSY;\r
204   \r
205   /* Enable the selected wave generation for the selected DAC channel */\r
206   MODIFY_REG(hdac->Instance->CR, (DAC_CR_WAVE1 | DAC_CR_MAMP1) << Channel, (DAC_CR_WAVE1_0 | Amplitude) << Channel);\r
207   \r
208   /* Change DAC state */\r
209   hdac->State = HAL_DAC_STATE_READY;\r
210   \r
211   /* Process unlocked */\r
212   __HAL_UNLOCK(hdac);\r
213   \r
214   /* Return function status */\r
215   return HAL_OK;\r
216 }\r
217 \r
218 /**\r
219   * @brief  Set the specified data holding register value for dual DAC channel.\r
220   * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains\r
221   *               the configuration information for the specified DAC.\r
222   * @param  Alignment: Specifies the data alignment for dual channel DAC.\r
223   *          This parameter can be one of the following values:\r
224   *            DAC_ALIGN_8B_R: 8bit right data alignment selected\r
225   *            DAC_ALIGN_12B_L: 12bit left data alignment selected\r
226   *            DAC_ALIGN_12B_R: 12bit right data alignment selected\r
227   * @param  Data1: Data for DAC Channel2 to be loaded in the selected data holding register.\r
228   * @param  Data2: Data for DAC Channel1 to be loaded in the selected data  holding register.\r
229   * @note   In dual mode, a unique register access is required to write in both\r
230   *          DAC channels at the same time.\r
231   * @retval HAL status\r
232   */\r
233 HAL_StatusTypeDef HAL_DACEx_DualSetValue(DAC_HandleTypeDef* hdac, uint32_t Alignment, uint32_t Data1, uint32_t Data2)\r
234 {  \r
235   uint32_t data = 0, tmp = 0;\r
236   \r
237   /* Check the parameters */\r
238   assert_param(IS_DAC_ALIGN(Alignment));\r
239   assert_param(IS_DAC_DATA(Data1));\r
240   assert_param(IS_DAC_DATA(Data2));\r
241   \r
242   /* Calculate and set dual DAC data holding register value */\r
243   if (Alignment == DAC_ALIGN_8B_R)\r
244   {\r
245     data = ((uint32_t)Data2 << 8) | Data1; \r
246   }\r
247   else\r
248   {\r
249     data = ((uint32_t)Data2 << 16) | Data1;\r
250   }\r
251   \r
252   tmp = (uint32_t)hdac->Instance;\r
253   tmp += DAC_DHR12RD_ALIGNMENT(Alignment);\r
254 \r
255   /* Set the dual DAC selected data holding register */\r
256   *(__IO uint32_t *)tmp = data;\r
257   \r
258   /* Return function status */\r
259   return HAL_OK;\r
260 }\r
261 \r
262 /**\r
263   * @}\r
264   */\r
265 \r
266 /**\r
267   * @brief  Conversion complete callback in non blocking mode for Channel2 \r
268   * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains\r
269   *         the configuration information for the specified DAC.\r
270   * @retval None\r
271   */\r
272 __weak void HAL_DACEx_ConvCpltCallbackCh2(DAC_HandleTypeDef* hdac)\r
273 {\r
274   /* NOTE : This function Should not be modified, when the callback is needed,\r
275             the HAL_DAC_ConvCpltCallbackCh2 could be implemented in the user file\r
276    */\r
277 }\r
278 \r
279 /**\r
280   * @brief  Conversion half DMA transfer callback in non blocking mode for Channel2 \r
281   * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains\r
282   *         the configuration information for the specified DAC.\r
283   * @retval None\r
284   */\r
285 __weak void HAL_DACEx_ConvHalfCpltCallbackCh2(DAC_HandleTypeDef* hdac)\r
286 {\r
287   /* NOTE : This function Should not be modified, when the callback is needed,\r
288             the HAL_DACEx_ConvHalfCpltCallbackCh2 could be implemented in the user file\r
289    */\r
290 }\r
291 \r
292 /**\r
293   * @brief  Error DAC callback for Channel2.\r
294   * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains\r
295   *         the configuration information for the specified DAC.\r
296   * @retval None\r
297   */\r
298 __weak void HAL_DACEx_ErrorCallbackCh2(DAC_HandleTypeDef *hdac)\r
299 {\r
300   /* NOTE : This function Should not be modified, when the callback is needed,\r
301             the HAL_DACEx_ErrorCallbackCh2 could be implemented in the user file\r
302    */\r
303 }\r
304 \r
305 /**\r
306   * @brief  DMA underrun DAC callback for channel2.\r
307   * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains\r
308   *         the configuration information for the specified DAC.\r
309   * @retval None\r
310   */\r
311 __weak void HAL_DACEx_DMAUnderrunCallbackCh2(DAC_HandleTypeDef *hdac)\r
312 {\r
313   /* NOTE : This function Should not be modified, when the callback is needed,\r
314             the HAL_DACEx_DMAUnderrunCallbackCh2 could be implemented in the user file\r
315    */\r
316 }\r
317 \r
318 /**\r
319   * @brief  DMA conversion complete callback. \r
320   * @param  hdma: pointer to a DMA_HandleTypeDef structure that contains\r
321   *                the configuration information for the specified DMA module.\r
322   * @retval None\r
323   */\r
324 void DAC_DMAConvCpltCh2(DMA_HandleTypeDef *hdma)   \r
325 {\r
326   DAC_HandleTypeDef* hdac = ( DAC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;\r
327   \r
328   HAL_DACEx_ConvCpltCallbackCh2(hdac); \r
329   \r
330   hdac->State= HAL_DAC_STATE_READY;\r
331 }\r
332 \r
333 /**\r
334   * @brief  DMA half transfer complete callback. \r
335   * @param  hdma: pointer to a DMA_HandleTypeDef structure that contains\r
336   *                the configuration information for the specified DMA module.\r
337   * @retval None\r
338   */\r
339 void DAC_DMAHalfConvCpltCh2(DMA_HandleTypeDef *hdma)   \r
340 {\r
341     DAC_HandleTypeDef* hdac = ( DAC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;\r
342     /* Conversion complete callback */\r
343     HAL_DACEx_ConvHalfCpltCallbackCh2(hdac); \r
344 }\r
345 \r
346 /**\r
347   * @brief  DMA error callback \r
348   * @param  hdma: pointer to a DMA_HandleTypeDef structure that contains\r
349   *                the configuration information for the specified DMA module.\r
350   * @retval None\r
351   */\r
352 void DAC_DMAErrorCh2(DMA_HandleTypeDef *hdma)   \r
353 {\r
354   DAC_HandleTypeDef* hdac = ( DAC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;\r
355     \r
356   /* Set DAC error code to DMA error */\r
357   hdac->ErrorCode |= HAL_DAC_ERROR_DMA;\r
358     \r
359   HAL_DACEx_ErrorCallbackCh2(hdac); \r
360     \r
361   hdac->State= HAL_DAC_STATE_READY;\r
362 }\r
363 \r
364 /**\r
365   * @}\r
366   */\r
367 \r
368 #endif /* STM32F756xx || STM32F746xx */\r
369 \r
370 #endif /* HAL_DAC_MODULE_ENABLED */\r
371 \r
372 /**\r
373   * @}\r
374   */\r
375 \r
376 /**\r
377   * @}\r
378   */\r
379 \r
380 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r