]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_M7_STM32F7_STM32756G-EVAL/ST_Library/stm32f7xx_hal_dac_ex.c
Update version number ready for V8.2.1 release.
[freertos] / FreeRTOS / Demo / CORTEX_M7_STM32F7_STM32756G-EVAL / 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 V0.3.0\r
6   * @date    06-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, \\r
158              ((DAC_CR_WAVE1) | (DAC_CR_MAMP1)) << Channel, \\r
159              (DAC_WAVE_TRIANGLE | Amplitude) << Channel);\r
160   \r
161   /* Change DAC state */\r
162   hdac->State = HAL_DAC_STATE_READY;\r
163   \r
164   /* Process unlocked */\r
165   __HAL_UNLOCK(hdac);\r
166   \r
167   /* Return function status */\r
168   return HAL_OK;\r
169 }\r
170 \r
171 /**\r
172   * @brief  Enables or disables the selected DAC channel wave generation.\r
173   * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains\r
174   *         the configuration information for the specified DAC. \r
175   * @param  Channel: The selected DAC channel. \r
176   *          This parameter can be one of the following values:\r
177   *            @arg DAC_CHANNEL_1: DAC Channel1 selected \r
178   *            @arg DAC_CHANNEL_2: DAC Channel2 selected\r
179   * @param  Amplitude: Unmask DAC channel LFSR for noise wave generation. \r
180   *          This parameter can be one of the following values: \r
181   *            @arg DAC_LFSRUNMASK_BIT0: Unmask DAC channel LFSR bit0 for noise wave generation\r
182   *            @arg DAC_LFSRUNMASK_BITS1_0: Unmask DAC channel LFSR bit[1:0] for noise wave generation  \r
183   *            @arg DAC_LFSRUNMASK_BITS2_0: Unmask DAC channel LFSR bit[2:0] for noise wave generation\r
184   *            @arg DAC_LFSRUNMASK_BITS3_0: Unmask DAC channel LFSR bit[3:0] for noise wave generation \r
185   *            @arg DAC_LFSRUNMASK_BITS4_0: Unmask DAC channel LFSR bit[4:0] for noise wave generation \r
186   *            @arg DAC_LFSRUNMASK_BITS5_0: Unmask DAC channel LFSR bit[5:0] for noise wave generation \r
187   *            @arg DAC_LFSRUNMASK_BITS6_0: Unmask DAC channel LFSR bit[6:0] for noise wave generation \r
188   *            @arg DAC_LFSRUNMASK_BITS7_0: Unmask DAC channel LFSR bit[7:0] for noise wave generation \r
189   *            @arg DAC_LFSRUNMASK_BITS8_0: Unmask DAC channel LFSR bit[8:0] for noise wave generation \r
190   *            @arg DAC_LFSRUNMASK_BITS9_0: Unmask DAC channel LFSR bit[9:0] for noise wave generation \r
191   *            @arg DAC_LFSRUNMASK_BITS10_0: Unmask DAC channel LFSR bit[10:0] for noise wave generation \r
192   *            @arg DAC_LFSRUNMASK_BITS11_0: Unmask DAC channel LFSR bit[11:0] for noise wave generation \r
193   * @retval HAL status\r
194   */\r
195 HAL_StatusTypeDef HAL_DACEx_NoiseWaveGenerate(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Amplitude)\r
196 {  \r
197   /* Check the parameters */\r
198   assert_param(IS_DAC_CHANNEL(Channel));\r
199   assert_param(IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(Amplitude));\r
200   \r
201   /* Process locked */\r
202   __HAL_LOCK(hdac);\r
203   \r
204   /* Change DAC state */\r
205   hdac->State = HAL_DAC_STATE_BUSY;\r
206   \r
207   /* Enable the selected wave generation for the selected DAC channel */\r
208   MODIFY_REG(hdac->Instance->CR, \\r
209              ((DAC_CR_WAVE1) | (DAC_CR_MAMP1)) << Channel, \\r
210              (DAC_WAVE_NOISE | Amplitude) << Channel);\r
211   \r
212   /* Change DAC state */\r
213   hdac->State = HAL_DAC_STATE_READY;\r
214   \r
215   /* Process unlocked */\r
216   __HAL_UNLOCK(hdac);\r
217   \r
218   /* Return function status */\r
219   return HAL_OK;\r
220 }\r
221 \r
222 /**\r
223   * @brief  Set the specified data holding register value for dual DAC channel.\r
224   * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains\r
225   *               the configuration information for the specified DAC.\r
226   * @param  Alignment: Specifies the data alignment for dual channel DAC.\r
227   *          This parameter can be one of the following values:\r
228   *            DAC_ALIGN_8B_R: 8bit right data alignment selected\r
229   *            DAC_ALIGN_12B_L: 12bit left data alignment selected\r
230   *            DAC_ALIGN_12B_R: 12bit right data alignment selected\r
231   * @param  Data1: Data for DAC Channel2 to be loaded in the selected data holding register.\r
232   * @param  Data2: Data for DAC Channel1 to be loaded in the selected data  holding register.\r
233   * @note   In dual mode, a unique register access is required to write in both\r
234   *          DAC channels at the same time.\r
235   * @retval HAL status\r
236   */\r
237 HAL_StatusTypeDef HAL_DACEx_DualSetValue(DAC_HandleTypeDef* hdac, uint32_t Alignment, uint32_t Data1, uint32_t Data2)\r
238 {  \r
239   uint32_t data = 0, tmp = 0;\r
240   \r
241   /* Check the parameters */\r
242   assert_param(IS_DAC_ALIGN(Alignment));\r
243   assert_param(IS_DAC_DATA(Data1));\r
244   assert_param(IS_DAC_DATA(Data2));\r
245   \r
246   /* Calculate and set dual DAC data holding register value */\r
247   if (Alignment == DAC_ALIGN_8B_R)\r
248   {\r
249     data = ((uint32_t)Data2 << 8) | Data1; \r
250   }\r
251   else\r
252   {\r
253     data = ((uint32_t)Data2 << 16) | Data1;\r
254   }\r
255   \r
256   tmp = (uint32_t)hdac->Instance;\r
257   tmp += DAC_DHR12RD_ALIGNMENT(Alignment);\r
258 \r
259   /* Set the dual DAC selected data holding register */\r
260   *(__IO uint32_t *)tmp = data;\r
261   \r
262   /* Return function status */\r
263   return HAL_OK;\r
264 }\r
265 \r
266 /**\r
267   * @}\r
268   */\r
269 \r
270 /**\r
271   * @brief  Conversion complete callback in non blocking mode for Channel2 \r
272   * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains\r
273   *         the configuration information for the specified DAC.\r
274   * @retval None\r
275   */\r
276 __weak void HAL_DACEx_ConvCpltCallbackCh2(DAC_HandleTypeDef* hdac)\r
277 {\r
278   /* NOTE : This function Should not be modified, when the callback is needed,\r
279             the HAL_DAC_ConvCpltCallbackCh2 could be implemented in the user file\r
280    */\r
281 }\r
282 \r
283 /**\r
284   * @brief  Conversion half DMA transfer callback in non blocking mode for Channel2 \r
285   * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains\r
286   *         the configuration information for the specified DAC.\r
287   * @retval None\r
288   */\r
289 __weak void HAL_DACEx_ConvHalfCpltCallbackCh2(DAC_HandleTypeDef* hdac)\r
290 {\r
291   /* NOTE : This function Should not be modified, when the callback is needed,\r
292             the HAL_DACEx_ConvHalfCpltCallbackCh2 could be implemented in the user file\r
293    */\r
294 }\r
295 \r
296 /**\r
297   * @brief  Error DAC callback for Channel2.\r
298   * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains\r
299   *         the configuration information for the specified DAC.\r
300   * @retval None\r
301   */\r
302 __weak void HAL_DACEx_ErrorCallbackCh2(DAC_HandleTypeDef *hdac)\r
303 {\r
304   /* NOTE : This function Should not be modified, when the callback is needed,\r
305             the HAL_DACEx_ErrorCallbackCh2 could be implemented in the user file\r
306    */\r
307 }\r
308 \r
309 /**\r
310   * @brief  DMA underrun DAC callback for channel2.\r
311   * @param  hdac: pointer to a DAC_HandleTypeDef structure that contains\r
312   *         the configuration information for the specified DAC.\r
313   * @retval None\r
314   */\r
315 __weak void HAL_DACEx_DMAUnderrunCallbackCh2(DAC_HandleTypeDef *hdac)\r
316 {\r
317   /* NOTE : This function Should not be modified, when the callback is needed,\r
318             the HAL_DACEx_DMAUnderrunCallbackCh2 could be implemented in the user file\r
319    */\r
320 }\r
321 \r
322 /**\r
323   * @brief  DMA conversion complete callback. \r
324   * @param  hdma: pointer to a DMA_HandleTypeDef structure that contains\r
325   *                the configuration information for the specified DMA module.\r
326   * @retval None\r
327   */\r
328 void DAC_DMAConvCpltCh2(DMA_HandleTypeDef *hdma)   \r
329 {\r
330   DAC_HandleTypeDef* hdac = ( DAC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;\r
331   \r
332   HAL_DACEx_ConvCpltCallbackCh2(hdac); \r
333   \r
334   hdac->State= HAL_DAC_STATE_READY;\r
335 }\r
336 \r
337 /**\r
338   * @brief  DMA half transfer complete callback. \r
339   * @param  hdma: pointer to a DMA_HandleTypeDef structure that contains\r
340   *                the configuration information for the specified DMA module.\r
341   * @retval None\r
342   */\r
343 void DAC_DMAHalfConvCpltCh2(DMA_HandleTypeDef *hdma)   \r
344 {\r
345     DAC_HandleTypeDef* hdac = ( DAC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;\r
346     /* Conversion complete callback */\r
347     HAL_DACEx_ConvHalfCpltCallbackCh2(hdac); \r
348 }\r
349 \r
350 /**\r
351   * @brief  DMA error callback \r
352   * @param  hdma: pointer to a DMA_HandleTypeDef structure that contains\r
353   *                the configuration information for the specified DMA module.\r
354   * @retval None\r
355   */\r
356 void DAC_DMAErrorCh2(DMA_HandleTypeDef *hdma)   \r
357 {\r
358   DAC_HandleTypeDef* hdac = ( DAC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;\r
359     \r
360   /* Set DAC error code to DMA error */\r
361   hdac->ErrorCode |= HAL_DAC_ERROR_DMA;\r
362     \r
363   HAL_DACEx_ErrorCallbackCh2(hdac); \r
364     \r
365   hdac->State= HAL_DAC_STATE_READY;\r
366 }\r
367 \r
368 /**\r
369   * @}\r
370   */\r
371 \r
372 #endif /* STM32F756xx || STM32F746xx */\r
373 \r
374 #endif /* HAL_DAC_MODULE_ENABLED */\r
375 \r
376 /**\r
377   * @}\r
378   */\r
379 \r
380 /**\r
381   * @}\r
382   */\r
383 \r
384 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r