Mercurial > public > ostc4
comparison Common/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dfsdm.c @ 160:e3ca52b8e7fa
Merge with FlipDisplay
author | heinrichsweikamp |
---|---|
date | Thu, 07 Mar 2019 15:06:43 +0100 |
parents | c78bcbd5deda |
children |
comparison
equal
deleted
inserted
replaced
80:cc2bb7bb8456 | 160:e3ca52b8e7fa |
---|---|
1 /** | |
2 ****************************************************************************** | |
3 * @file stm32f4xx_hal_dfsdm.c | |
4 * @author MCD Application Team | |
5 * @brief This file provides firmware functions to manage the following | |
6 * functionalities of the Digital Filter for Sigma-Delta Modulators | |
7 * (DFSDM) peripherals: | |
8 * + Initialization and configuration of channels and filters | |
9 * + Regular channels configuration | |
10 * + Injected channels configuration | |
11 * + Regular/Injected Channels DMA Configuration | |
12 * + Interrupts and flags management | |
13 * + Analog watchdog feature | |
14 * + Short-circuit detector feature | |
15 * + Extremes detector feature | |
16 * + Clock absence detector feature | |
17 * + Break generation on analog watchdog or short-circuit event | |
18 * | |
19 @verbatim | |
20 ============================================================================== | |
21 ##### How to use this driver ##### | |
22 ============================================================================== | |
23 [..] | |
24 *** Channel initialization *** | |
25 ============================== | |
26 [..] | |
27 (#) User has first to initialize channels (before filters initialization). | |
28 (#) As prerequisite, fill in the HAL_DFSDM_ChannelMspInit() : | |
29 (++) Enable DFSDMz clock interface with __HAL_RCC_DFSDMz_CLK_ENABLE(). | |
30 (++) Enable the clocks for the DFSDMz GPIOS with __HAL_RCC_GPIOx_CLK_ENABLE(). | |
31 (++) Configure these DFSDMz pins in alternate mode using HAL_GPIO_Init(). | |
32 (++) If interrupt mode is used, enable and configure DFSDMz_FLT0 global | |
33 interrupt with HAL_NVIC_SetPriority() and HAL_NVIC_EnableIRQ(). | |
34 (#) Configure the output clock, input, serial interface, analog watchdog, | |
35 offset and data right bit shift parameters for this channel using the | |
36 HAL_DFSDM_ChannelInit() function. | |
37 | |
38 *** Channel clock absence detector *** | |
39 ====================================== | |
40 [..] | |
41 (#) Start clock absence detector using HAL_DFSDM_ChannelCkabStart() or | |
42 HAL_DFSDM_ChannelCkabStart_IT(). | |
43 (#) In polling mode, use HAL_DFSDM_ChannelPollForCkab() to detect the clock | |
44 absence. | |
45 (#) In interrupt mode, HAL_DFSDM_ChannelCkabCallback() will be called if | |
46 clock absence is detected. | |
47 (#) Stop clock absence detector using HAL_DFSDM_ChannelCkabStop() or | |
48 HAL_DFSDM_ChannelCkabStop_IT(). | |
49 (#) Please note that the same mode (polling or interrupt) has to be used | |
50 for all channels because the channels are sharing the same interrupt. | |
51 (#) Please note also that in interrupt mode, if clock absence detector is | |
52 stopped for one channel, interrupt will be disabled for all channels. | |
53 | |
54 *** Channel short circuit detector *** | |
55 ====================================== | |
56 [..] | |
57 (#) Start short circuit detector using HAL_DFSDM_ChannelScdStart() or | |
58 or HAL_DFSDM_ChannelScdStart_IT(). | |
59 (#) In polling mode, use HAL_DFSDM_ChannelPollForScd() to detect short | |
60 circuit. | |
61 (#) In interrupt mode, HAL_DFSDM_ChannelScdCallback() will be called if | |
62 short circuit is detected. | |
63 (#) Stop short circuit detector using HAL_DFSDM_ChannelScdStop() or | |
64 or HAL_DFSDM_ChannelScdStop_IT(). | |
65 (#) Please note that the same mode (polling or interrupt) has to be used | |
66 for all channels because the channels are sharing the same interrupt. | |
67 (#) Please note also that in interrupt mode, if short circuit detector is | |
68 stopped for one channel, interrupt will be disabled for all channels. | |
69 | |
70 *** Channel analog watchdog value *** | |
71 ===================================== | |
72 [..] | |
73 (#) Get analog watchdog filter value of a channel using | |
74 HAL_DFSDM_ChannelGetAwdValue(). | |
75 | |
76 *** Channel offset value *** | |
77 ===================================== | |
78 [..] | |
79 (#) Modify offset value of a channel using HAL_DFSDM_ChannelModifyOffset(). | |
80 | |
81 *** Filter initialization *** | |
82 ============================= | |
83 [..] | |
84 (#) After channel initialization, user has to init filters. | |
85 (#) As prerequisite, fill in the HAL_DFSDM_FilterMspInit() : | |
86 (++) If interrupt mode is used , enable and configure DFSDMz_FLTx global | |
87 interrupt with HAL_NVIC_SetPriority() and HAL_NVIC_EnableIRQ(). | |
88 Please note that DFSDMz_FLT0 global interrupt could be already | |
89 enabled if interrupt is used for channel. | |
90 (++) If DMA mode is used, configure DMA with HAL_DMA_Init() and link it | |
91 with DFSDMz filter handle using __HAL_LINKDMA(). | |
92 (#) Configure the regular conversion, injected conversion and filter | |
93 parameters for this filter using the HAL_DFSDM_FilterInit() function. | |
94 | |
95 *** Filter regular channel conversion *** | |
96 ========================================= | |
97 [..] | |
98 (#) Select regular channel and enable/disable continuous mode using | |
99 HAL_DFSDM_FilterConfigRegChannel(). | |
100 (#) Start regular conversion using HAL_DFSDM_FilterRegularStart(), | |
101 HAL_DFSDM_FilterRegularStart_IT(), HAL_DFSDM_FilterRegularStart_DMA() or | |
102 HAL_DFSDM_FilterRegularMsbStart_DMA(). | |
103 (#) In polling mode, use HAL_DFSDM_FilterPollForRegConversion() to detect | |
104 the end of regular conversion. | |
105 (#) In interrupt mode, HAL_DFSDM_FilterRegConvCpltCallback() will be called | |
106 at the end of regular conversion. | |
107 (#) Get value of regular conversion and corresponding channel using | |
108 HAL_DFSDM_FilterGetRegularValue(). | |
109 (#) In DMA mode, HAL_DFSDM_FilterRegConvHalfCpltCallback() and | |
110 HAL_DFSDM_FilterRegConvCpltCallback() will be called respectively at the | |
111 half transfer and at the transfer complete. Please note that | |
112 HAL_DFSDM_FilterRegConvHalfCpltCallback() will be called only in DMA | |
113 circular mode. | |
114 (#) Stop regular conversion using HAL_DFSDM_FilterRegularStop(), | |
115 HAL_DFSDM_FilterRegularStop_IT() or HAL_DFSDM_FilterRegularStop_DMA(). | |
116 | |
117 *** Filter injected channels conversion *** | |
118 =========================================== | |
119 [..] | |
120 (#) Select injected channels using HAL_DFSDM_FilterConfigInjChannel(). | |
121 (#) Start injected conversion using HAL_DFSDM_FilterInjectedStart(), | |
122 HAL_DFSDM_FilterInjectedStart_IT(), HAL_DFSDM_FilterInjectedStart_DMA() or | |
123 HAL_DFSDM_FilterInjectedMsbStart_DMA(). | |
124 (#) In polling mode, use HAL_DFSDM_FilterPollForInjConversion() to detect | |
125 the end of injected conversion. | |
126 (#) In interrupt mode, HAL_DFSDM_FilterInjConvCpltCallback() will be called | |
127 at the end of injected conversion. | |
128 (#) Get value of injected conversion and corresponding channel using | |
129 HAL_DFSDM_FilterGetInjectedValue(). | |
130 (#) In DMA mode, HAL_DFSDM_FilterInjConvHalfCpltCallback() and | |
131 HAL_DFSDM_FilterInjConvCpltCallback() will be called respectively at the | |
132 half transfer and at the transfer complete. Please note that | |
133 HAL_DFSDM_FilterInjConvCpltCallback() will be called only in DMA | |
134 circular mode. | |
135 (#) Stop injected conversion using HAL_DFSDM_FilterInjectedStop(), | |
136 HAL_DFSDM_FilterInjectedStop_IT() or HAL_DFSDM_FilterInjectedStop_DMA(). | |
137 | |
138 *** Filter analog watchdog *** | |
139 ============================== | |
140 [..] | |
141 (#) Start filter analog watchdog using HAL_DFSDM_FilterAwdStart_IT(). | |
142 (#) HAL_DFSDM_FilterAwdCallback() will be called if analog watchdog occurs. | |
143 (#) Stop filter analog watchdog using HAL_DFSDM_FilterAwdStop_IT(). | |
144 | |
145 *** Filter extreme detector *** | |
146 =============================== | |
147 [..] | |
148 (#) Start filter extreme detector using HAL_DFSDM_FilterExdStart(). | |
149 (#) Get extreme detector maximum value using HAL_DFSDM_FilterGetExdMaxValue(). | |
150 (#) Get extreme detector minimum value using HAL_DFSDM_FilterGetExdMinValue(). | |
151 (#) Start filter extreme detector using HAL_DFSDM_FilterExdStop(). | |
152 | |
153 *** Filter conversion time *** | |
154 ============================== | |
155 [..] | |
156 (#) Get conversion time value using HAL_DFSDM_FilterGetConvTimeValue(). | |
157 | |
158 @endverbatim | |
159 ****************************************************************************** | |
160 * @attention | |
161 * | |
162 * <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2> | |
163 * | |
164 * Redistribution and use in source and binary forms, with or without modification, | |
165 * are permitted provided that the following conditions are met: | |
166 * 1. Redistributions of source code must retain the above copyright notice, | |
167 * this list of conditions and the following disclaimer. | |
168 * 2. Redistributions in binary form must reproduce the above copyright notice, | |
169 * this list of conditions and the following disclaimer in the documentation | |
170 * and/or other materials provided with the distribution. | |
171 * 3. Neither the name of STMicroelectronics nor the names of its contributors | |
172 * may be used to endorse or promote products derived from this software | |
173 * without specific prior written permission. | |
174 * | |
175 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
176 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
177 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
178 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |
179 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
180 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
181 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
182 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
183 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
184 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
185 * | |
186 ****************************************************************************** | |
187 */ | |
188 | |
189 /* Includes ------------------------------------------------------------------*/ | |
190 #include "stm32f4xx_hal.h" | |
191 | |
192 /** @addtogroup STM32F4xx_HAL_Driver | |
193 * @{ | |
194 */ | |
195 #ifdef HAL_DFSDM_MODULE_ENABLED | |
196 #if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) | |
197 /** @defgroup DFSDM DFSDM | |
198 * @brief DFSDM HAL driver module | |
199 * @{ | |
200 */ | |
201 | |
202 /* Private typedef -----------------------------------------------------------*/ | |
203 /* Private define ------------------------------------------------------------*/ | |
204 /** @defgroup DFSDM_Private_Define DFSDM Private Define | |
205 * @{ | |
206 */ | |
207 | |
208 #define DFSDM_FLTCR1_MSB_RCH_OFFSET 8U | |
209 | |
210 #define DFSDM_MSB_MASK 0xFFFF0000U | |
211 #define DFSDM_LSB_MASK 0x0000FFFFU | |
212 #define DFSDM_CKAB_TIMEOUT 5000U | |
213 #define DFSDM1_CHANNEL_NUMBER 4U | |
214 #if defined (DFSDM2_Channel0) | |
215 #define DFSDM2_CHANNEL_NUMBER 8U | |
216 #endif /* DFSDM2_Channel0 */ | |
217 | |
218 /** | |
219 * @} | |
220 */ | |
221 /** @addtogroup DFSDM_Private_Macros | |
222 * @{ | |
223 */ | |
224 | |
225 /** | |
226 * @} | |
227 */ | |
228 /* Private macro -------------------------------------------------------------*/ | |
229 /* Private variables ---------------------------------------------------------*/ | |
230 /** @defgroup DFSDM_Private_Variables DFSDM Private Variables | |
231 * @{ | |
232 */ | |
233 __IO uint32_t v_dfsdm1ChannelCounter = 0U; | |
234 DFSDM_Channel_HandleTypeDef* a_dfsdm1ChannelHandle[DFSDM1_CHANNEL_NUMBER] = {NULL}; | |
235 | |
236 #if defined (DFSDM2_Channel0) | |
237 __IO uint32_t v_dfsdm2ChannelCounter = 0U; | |
238 DFSDM_Channel_HandleTypeDef* a_dfsdm2ChannelHandle[DFSDM2_CHANNEL_NUMBER] = {NULL}; | |
239 #endif /* DFSDM2_Channel0 */ | |
240 /** | |
241 * @} | |
242 */ | |
243 | |
244 /* Private function prototypes -----------------------------------------------*/ | |
245 /** @defgroup DFSDM_Private_Functions DFSDM Private Functions | |
246 * @{ | |
247 */ | |
248 static uint32_t DFSDM_GetInjChannelsNbr(uint32_t Channels); | |
249 static uint32_t DFSDM_GetChannelFromInstance(DFSDM_Channel_TypeDef* Instance); | |
250 static void DFSDM_RegConvStart(DFSDM_Filter_HandleTypeDef *hdfsdm_filter); | |
251 static void DFSDM_RegConvStop(DFSDM_Filter_HandleTypeDef* hdfsdm_filter); | |
252 static void DFSDM_InjConvStart(DFSDM_Filter_HandleTypeDef* hdfsdm_filter); | |
253 static void DFSDM_InjConvStop(DFSDM_Filter_HandleTypeDef* hdfsdm_filter); | |
254 static void DFSDM_DMARegularHalfConvCplt(DMA_HandleTypeDef *hdma); | |
255 static void DFSDM_DMARegularConvCplt(DMA_HandleTypeDef *hdma); | |
256 static void DFSDM_DMAInjectedHalfConvCplt(DMA_HandleTypeDef *hdma); | |
257 static void DFSDM_DMAInjectedConvCplt(DMA_HandleTypeDef *hdma); | |
258 static void DFSDM_DMAError(DMA_HandleTypeDef *hdma); | |
259 | |
260 /** | |
261 * @} | |
262 */ | |
263 | |
264 /* Exported functions --------------------------------------------------------*/ | |
265 /** @defgroup DFSDM_Exported_Functions DFSDM Exported Functions | |
266 * @{ | |
267 */ | |
268 | |
269 /** @defgroup DFSDM_Exported_Functions_Group1_Channel Channel initialization and de-initialization functions | |
270 * @brief Channel initialization and de-initialization functions | |
271 * | |
272 @verbatim | |
273 ============================================================================== | |
274 ##### Channel initialization and de-initialization functions ##### | |
275 ============================================================================== | |
276 [..] This section provides functions allowing to: | |
277 (+) Initialize the DFSDM channel. | |
278 (+) De-initialize the DFSDM channel. | |
279 @endverbatim | |
280 * @{ | |
281 */ | |
282 | |
283 /** | |
284 * @brief Initialize the DFSDM channel according to the specified parameters | |
285 * in the DFSDM_ChannelInitTypeDef structure and initialize the associated handle. | |
286 * @param hdfsdm_channel DFSDM channel handle. | |
287 * @retval HAL status. | |
288 */ | |
289 HAL_StatusTypeDef HAL_DFSDM_ChannelInit(DFSDM_Channel_HandleTypeDef *hdfsdm_channel) | |
290 { | |
291 #if defined(DFSDM2_Channel0) | |
292 __IO uint32_t* channelCounterPtr; | |
293 DFSDM_Channel_HandleTypeDef **channelHandleTable; | |
294 DFSDM_Channel_TypeDef* channel0Instance; | |
295 #endif /* defined(DFSDM2_Channel0) */ | |
296 | |
297 /* Check DFSDM Channel handle */ | |
298 if(hdfsdm_channel == NULL) | |
299 { | |
300 return HAL_ERROR; | |
301 } | |
302 | |
303 /* Check parameters */ | |
304 assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance)); | |
305 assert_param(IS_FUNCTIONAL_STATE(hdfsdm_channel->Init.OutputClock.Activation)); | |
306 assert_param(IS_DFSDM_CHANNEL_INPUT(hdfsdm_channel->Init.Input.Multiplexer)); | |
307 assert_param(IS_DFSDM_CHANNEL_DATA_PACKING(hdfsdm_channel->Init.Input.DataPacking)); | |
308 assert_param(IS_DFSDM_CHANNEL_INPUT_PINS(hdfsdm_channel->Init.Input.Pins)); | |
309 assert_param(IS_DFSDM_CHANNEL_SERIAL_INTERFACE_TYPE(hdfsdm_channel->Init.SerialInterface.Type)); | |
310 assert_param(IS_DFSDM_CHANNEL_SPI_CLOCK(hdfsdm_channel->Init.SerialInterface.SpiClock)); | |
311 assert_param(IS_DFSDM_CHANNEL_FILTER_ORDER(hdfsdm_channel->Init.Awd.FilterOrder)); | |
312 assert_param(IS_DFSDM_CHANNEL_FILTER_OVS_RATIO(hdfsdm_channel->Init.Awd.Oversampling)); | |
313 assert_param(IS_DFSDM_CHANNEL_OFFSET(hdfsdm_channel->Init.Offset)); | |
314 assert_param(IS_DFSDM_CHANNEL_RIGHT_BIT_SHIFT(hdfsdm_channel->Init.RightBitShift)); | |
315 | |
316 #if defined(DFSDM2_Channel0) | |
317 /* Get channel counter, channel handle table and channel 0 instance */ | |
318 if(IS_DFSDM1_CHANNEL_INSTANCE(hdfsdm_channel->Instance)) | |
319 { | |
320 channelCounterPtr = &v_dfsdm1ChannelCounter; | |
321 channelHandleTable = a_dfsdm1ChannelHandle; | |
322 channel0Instance = DFSDM1_Channel0; | |
323 } | |
324 else | |
325 { | |
326 channelCounterPtr = &v_dfsdm2ChannelCounter; | |
327 channelHandleTable = a_dfsdm2ChannelHandle; | |
328 channel0Instance = DFSDM2_Channel0; | |
329 } | |
330 | |
331 /* Check that channel has not been already initialized */ | |
332 if(channelHandleTable[DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance)] != NULL) | |
333 { | |
334 return HAL_ERROR; | |
335 } | |
336 | |
337 /* Call MSP init function */ | |
338 HAL_DFSDM_ChannelMspInit(hdfsdm_channel); | |
339 | |
340 /* Update the channel counter */ | |
341 (*channelCounterPtr)++; | |
342 | |
343 /* Configure output serial clock and enable global DFSDM interface only for first channel */ | |
344 if(*channelCounterPtr == 1U) | |
345 { | |
346 assert_param(IS_DFSDM_CHANNEL_OUTPUT_CLOCK(hdfsdm_channel->Init.OutputClock.Selection)); | |
347 /* Set the output serial clock source */ | |
348 channel0Instance->CHCFGR1 &= ~(DFSDM_CHCFGR1_CKOUTSRC); | |
349 channel0Instance->CHCFGR1 |= hdfsdm_channel->Init.OutputClock.Selection; | |
350 | |
351 /* Reset clock divider */ | |
352 channel0Instance->CHCFGR1 &= ~(DFSDM_CHCFGR1_CKOUTDIV); | |
353 if(hdfsdm_channel->Init.OutputClock.Activation == ENABLE) | |
354 { | |
355 assert_param(IS_DFSDM_CHANNEL_OUTPUT_CLOCK_DIVIDER(hdfsdm_channel->Init.OutputClock.Divider)); | |
356 /* Set the output clock divider */ | |
357 channel0Instance->CHCFGR1 |= (uint32_t) ((hdfsdm_channel->Init.OutputClock.Divider - 1U) << | |
358 DFSDM_CHCFGR1_CKOUTDIV_Pos); | |
359 } | |
360 | |
361 /* enable the DFSDM global interface */ | |
362 channel0Instance->CHCFGR1 |= DFSDM_CHCFGR1_DFSDMEN; | |
363 } | |
364 | |
365 /* Set channel input parameters */ | |
366 hdfsdm_channel->Instance->CHCFGR1 &= ~(DFSDM_CHCFGR1_DATPACK | DFSDM_CHCFGR1_DATMPX | | |
367 DFSDM_CHCFGR1_CHINSEL); | |
368 hdfsdm_channel->Instance->CHCFGR1 |= (hdfsdm_channel->Init.Input.Multiplexer | | |
369 hdfsdm_channel->Init.Input.DataPacking | | |
370 hdfsdm_channel->Init.Input.Pins); | |
371 | |
372 /* Set serial interface parameters */ | |
373 hdfsdm_channel->Instance->CHCFGR1 &= ~(DFSDM_CHCFGR1_SITP | DFSDM_CHCFGR1_SPICKSEL); | |
374 hdfsdm_channel->Instance->CHCFGR1 |= (hdfsdm_channel->Init.SerialInterface.Type | | |
375 hdfsdm_channel->Init.SerialInterface.SpiClock); | |
376 | |
377 /* Set analog watchdog parameters */ | |
378 hdfsdm_channel->Instance->CHAWSCDR &= ~(DFSDM_CHAWSCDR_AWFORD | DFSDM_CHAWSCDR_AWFOSR); | |
379 hdfsdm_channel->Instance->CHAWSCDR |= (hdfsdm_channel->Init.Awd.FilterOrder | | |
380 ((hdfsdm_channel->Init.Awd.Oversampling - 1U) << DFSDM_CHAWSCDR_AWFOSR_Pos)); | |
381 | |
382 /* Set channel offset and right bit shift */ | |
383 hdfsdm_channel->Instance->CHCFGR2 &= ~(DFSDM_CHCFGR2_OFFSET | DFSDM_CHCFGR2_DTRBS); | |
384 hdfsdm_channel->Instance->CHCFGR2 |= (((uint32_t) hdfsdm_channel->Init.Offset << DFSDM_CHCFGR2_OFFSET_Pos) | | |
385 (hdfsdm_channel->Init.RightBitShift << DFSDM_CHCFGR2_DTRBS_Pos)); | |
386 | |
387 /* Enable DFSDM channel */ | |
388 hdfsdm_channel->Instance->CHCFGR1 |= DFSDM_CHCFGR1_CHEN; | |
389 | |
390 /* Set DFSDM Channel to ready state */ | |
391 hdfsdm_channel->State = HAL_DFSDM_CHANNEL_STATE_READY; | |
392 | |
393 /* Store channel handle in DFSDM channel handle table */ | |
394 channelHandleTable[DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance)] = hdfsdm_channel; | |
395 | |
396 #else | |
397 /* Check that channel has not been already initialized */ | |
398 if(a_dfsdm1ChannelHandle[DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance)] != NULL) | |
399 { | |
400 return HAL_ERROR; | |
401 } | |
402 | |
403 /* Call MSP init function */ | |
404 HAL_DFSDM_ChannelMspInit(hdfsdm_channel); | |
405 | |
406 /* Update the channel counter */ | |
407 v_dfsdm1ChannelCounter++; | |
408 | |
409 /* Configure output serial clock and enable global DFSDM interface only for first channel */ | |
410 if(v_dfsdm1ChannelCounter == 1U) | |
411 { | |
412 assert_param(IS_DFSDM_CHANNEL_OUTPUT_CLOCK(hdfsdm_channel->Init.OutputClock.Selection)); | |
413 /* Set the output serial clock source */ | |
414 DFSDM1_Channel0->CHCFGR1 &= ~(DFSDM_CHCFGR1_CKOUTSRC); | |
415 DFSDM1_Channel0->CHCFGR1 |= hdfsdm_channel->Init.OutputClock.Selection; | |
416 | |
417 /* Reset clock divider */ | |
418 DFSDM1_Channel0->CHCFGR1 &= ~(DFSDM_CHCFGR1_CKOUTDIV); | |
419 if(hdfsdm_channel->Init.OutputClock.Activation == ENABLE) | |
420 { | |
421 assert_param(IS_DFSDM_CHANNEL_OUTPUT_CLOCK_DIVIDER(hdfsdm_channel->Init.OutputClock.Divider)); | |
422 /* Set the output clock divider */ | |
423 DFSDM1_Channel0->CHCFGR1 |= (uint32_t) ((hdfsdm_channel->Init.OutputClock.Divider - 1U) << | |
424 DFSDM_CHCFGR1_CKOUTDIV_Pos); | |
425 } | |
426 | |
427 /* enable the DFSDM global interface */ | |
428 DFSDM1_Channel0->CHCFGR1 |= DFSDM_CHCFGR1_DFSDMEN; | |
429 } | |
430 | |
431 /* Set channel input parameters */ | |
432 hdfsdm_channel->Instance->CHCFGR1 &= ~(DFSDM_CHCFGR1_DATPACK | DFSDM_CHCFGR1_DATMPX | | |
433 DFSDM_CHCFGR1_CHINSEL); | |
434 hdfsdm_channel->Instance->CHCFGR1 |= (hdfsdm_channel->Init.Input.Multiplexer | | |
435 hdfsdm_channel->Init.Input.DataPacking | | |
436 hdfsdm_channel->Init.Input.Pins); | |
437 | |
438 /* Set serial interface parameters */ | |
439 hdfsdm_channel->Instance->CHCFGR1 &= ~(DFSDM_CHCFGR1_SITP | DFSDM_CHCFGR1_SPICKSEL); | |
440 hdfsdm_channel->Instance->CHCFGR1 |= (hdfsdm_channel->Init.SerialInterface.Type | | |
441 hdfsdm_channel->Init.SerialInterface.SpiClock); | |
442 | |
443 /* Set analog watchdog parameters */ | |
444 hdfsdm_channel->Instance->CHAWSCDR &= ~(DFSDM_CHAWSCDR_AWFORD | DFSDM_CHAWSCDR_AWFOSR); | |
445 hdfsdm_channel->Instance->CHAWSCDR |= (hdfsdm_channel->Init.Awd.FilterOrder | | |
446 ((hdfsdm_channel->Init.Awd.Oversampling - 1U) << DFSDM_CHAWSCDR_AWFOSR_Pos)); | |
447 | |
448 /* Set channel offset and right bit shift */ | |
449 hdfsdm_channel->Instance->CHCFGR2 &= ~(DFSDM_CHCFGR2_OFFSET | DFSDM_CHCFGR2_DTRBS); | |
450 hdfsdm_channel->Instance->CHCFGR2 |= (((uint32_t) hdfsdm_channel->Init.Offset << DFSDM_CHCFGR2_OFFSET_Pos) | | |
451 (hdfsdm_channel->Init.RightBitShift << DFSDM_CHCFGR2_DTRBS_Pos)); | |
452 | |
453 /* Enable DFSDM channel */ | |
454 hdfsdm_channel->Instance->CHCFGR1 |= DFSDM_CHCFGR1_CHEN; | |
455 | |
456 /* Set DFSDM Channel to ready state */ | |
457 hdfsdm_channel->State = HAL_DFSDM_CHANNEL_STATE_READY; | |
458 | |
459 /* Store channel handle in DFSDM channel handle table */ | |
460 a_dfsdm1ChannelHandle[DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance)] = hdfsdm_channel; | |
461 #endif /* DFSDM2_Channel0 */ | |
462 | |
463 return HAL_OK; | |
464 } | |
465 | |
466 /** | |
467 * @brief De-initialize the DFSDM channel. | |
468 * @param hdfsdm_channel DFSDM channel handle. | |
469 * @retval HAL status. | |
470 */ | |
471 HAL_StatusTypeDef HAL_DFSDM_ChannelDeInit(DFSDM_Channel_HandleTypeDef *hdfsdm_channel) | |
472 { | |
473 #if defined(DFSDM2_Channel0) | |
474 __IO uint32_t* channelCounterPtr; | |
475 DFSDM_Channel_HandleTypeDef **channelHandleTable; | |
476 DFSDM_Channel_TypeDef* channel0Instance; | |
477 #endif /* defined(DFSDM2_Channel0) */ | |
478 | |
479 /* Check DFSDM Channel handle */ | |
480 if(hdfsdm_channel == NULL) | |
481 { | |
482 return HAL_ERROR; | |
483 } | |
484 | |
485 /* Check parameters */ | |
486 assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance)); | |
487 | |
488 #if defined(DFSDM2_Channel0) | |
489 /* Get channel counter, channel handle table and channel 0 instance */ | |
490 if(IS_DFSDM1_CHANNEL_INSTANCE(hdfsdm_channel->Instance)) | |
491 { | |
492 channelCounterPtr = &v_dfsdm1ChannelCounter; | |
493 channelHandleTable = a_dfsdm1ChannelHandle; | |
494 channel0Instance = DFSDM1_Channel0; | |
495 } | |
496 else | |
497 { | |
498 channelCounterPtr = &v_dfsdm2ChannelCounter; | |
499 channelHandleTable = a_dfsdm2ChannelHandle; | |
500 channel0Instance = DFSDM2_Channel0; | |
501 } | |
502 | |
503 /* Check that channel has not been already deinitialized */ | |
504 if(channelHandleTable[DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance)] == NULL) | |
505 { | |
506 return HAL_ERROR; | |
507 } | |
508 | |
509 /* Disable the DFSDM channel */ | |
510 hdfsdm_channel->Instance->CHCFGR1 &= ~(DFSDM_CHCFGR1_CHEN); | |
511 | |
512 /* Update the channel counter */ | |
513 (*channelCounterPtr)--; | |
514 | |
515 /* Disable global DFSDM at deinit of last channel */ | |
516 if(*channelCounterPtr == 0U) | |
517 { | |
518 channel0Instance->CHCFGR1 &= ~(DFSDM_CHCFGR1_DFSDMEN); | |
519 } | |
520 | |
521 /* Call MSP deinit function */ | |
522 HAL_DFSDM_ChannelMspDeInit(hdfsdm_channel); | |
523 | |
524 /* Set DFSDM Channel in reset state */ | |
525 hdfsdm_channel->State = HAL_DFSDM_CHANNEL_STATE_RESET; | |
526 | |
527 /* Reset channel handle in DFSDM channel handle table */ | |
528 channelHandleTable[DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance)] = NULL; | |
529 #else | |
530 /* Check that channel has not been already deinitialized */ | |
531 if(a_dfsdm1ChannelHandle[DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance)] == NULL) | |
532 { | |
533 return HAL_ERROR; | |
534 } | |
535 | |
536 /* Disable the DFSDM channel */ | |
537 hdfsdm_channel->Instance->CHCFGR1 &= ~(DFSDM_CHCFGR1_CHEN); | |
538 | |
539 /* Update the channel counter */ | |
540 v_dfsdm1ChannelCounter--; | |
541 | |
542 /* Disable global DFSDM at deinit of last channel */ | |
543 if(v_dfsdm1ChannelCounter == 0U) | |
544 { | |
545 DFSDM1_Channel0->CHCFGR1 &= ~(DFSDM_CHCFGR1_DFSDMEN); | |
546 } | |
547 | |
548 /* Call MSP deinit function */ | |
549 HAL_DFSDM_ChannelMspDeInit(hdfsdm_channel); | |
550 | |
551 /* Set DFSDM Channel in reset state */ | |
552 hdfsdm_channel->State = HAL_DFSDM_CHANNEL_STATE_RESET; | |
553 | |
554 /* Reset channel handle in DFSDM channel handle table */ | |
555 a_dfsdm1ChannelHandle[DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance)] = (DFSDM_Channel_HandleTypeDef *) NULL; | |
556 #endif /* defined(DFSDM2_Channel0) */ | |
557 | |
558 return HAL_OK; | |
559 } | |
560 | |
561 /** | |
562 * @brief Initialize the DFSDM channel MSP. | |
563 * @param hdfsdm_channel DFSDM channel handle. | |
564 * @retval None | |
565 */ | |
566 __weak void HAL_DFSDM_ChannelMspInit(DFSDM_Channel_HandleTypeDef *hdfsdm_channel) | |
567 { | |
568 /* Prevent unused argument(s) compilation warning */ | |
569 UNUSED(hdfsdm_channel); | |
570 /* NOTE : This function should not be modified, when the function is needed, | |
571 the HAL_DFSDM_ChannelMspInit could be implemented in the user file. | |
572 */ | |
573 } | |
574 | |
575 /** | |
576 * @brief De-initialize the DFSDM channel MSP. | |
577 * @param hdfsdm_channel DFSDM channel handle. | |
578 * @retval None | |
579 */ | |
580 __weak void HAL_DFSDM_ChannelMspDeInit(DFSDM_Channel_HandleTypeDef *hdfsdm_channel) | |
581 { | |
582 /* Prevent unused argument(s) compilation warning */ | |
583 UNUSED(hdfsdm_channel); | |
584 /* NOTE : This function should not be modified, when the function is needed, | |
585 the HAL_DFSDM_ChannelMspDeInit could be implemented in the user file. | |
586 */ | |
587 } | |
588 | |
589 /** | |
590 * @} | |
591 */ | |
592 | |
593 /** @defgroup DFSDM_Exported_Functions_Group2_Channel Channel operation functions | |
594 * @brief Channel operation functions | |
595 * | |
596 @verbatim | |
597 ============================================================================== | |
598 ##### Channel operation functions ##### | |
599 ============================================================================== | |
600 [..] This section provides functions allowing to: | |
601 (+) Manage clock absence detector feature. | |
602 (+) Manage short circuit detector feature. | |
603 (+) Get analog watchdog value. | |
604 (+) Modify offset value. | |
605 @endverbatim | |
606 * @{ | |
607 */ | |
608 | |
609 /** | |
610 * @brief This function allows to start clock absence detection in polling mode. | |
611 * @note Same mode has to be used for all channels. | |
612 * @note If clock is not available on this channel during 5 seconds, | |
613 * clock absence detection will not be activated and function | |
614 * will return HAL_TIMEOUT error. | |
615 * @param hdfsdm_channel DFSDM channel handle. | |
616 * @retval HAL status | |
617 */ | |
618 HAL_StatusTypeDef HAL_DFSDM_ChannelCkabStart(DFSDM_Channel_HandleTypeDef *hdfsdm_channel) | |
619 { | |
620 HAL_StatusTypeDef status = HAL_OK; | |
621 uint32_t tickstart; | |
622 uint32_t channel; | |
623 | |
624 #if defined(DFSDM2_Channel0) | |
625 DFSDM_Filter_TypeDef* filter0Instance; | |
626 #endif /* defined(DFSDM2_Channel0) */ | |
627 | |
628 /* Check parameters */ | |
629 assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance)); | |
630 | |
631 /* Check DFSDM channel state */ | |
632 if(hdfsdm_channel->State != HAL_DFSDM_CHANNEL_STATE_READY) | |
633 { | |
634 /* Return error status */ | |
635 status = HAL_ERROR; | |
636 } | |
637 else | |
638 { | |
639 #if defined (DFSDM2_Channel0) | |
640 /* Get channel counter, channel handle table and channel 0 instance */ | |
641 if(IS_DFSDM1_CHANNEL_INSTANCE(hdfsdm_channel->Instance)) | |
642 { | |
643 filter0Instance = DFSDM1_Filter0; | |
644 } | |
645 else | |
646 { | |
647 filter0Instance = DFSDM2_Filter0; | |
648 } | |
649 /* Get channel number from channel instance */ | |
650 channel = DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance); | |
651 | |
652 /* Get timeout */ | |
653 tickstart = HAL_GetTick(); | |
654 | |
655 /* Clear clock absence flag */ | |
656 while((((filter0Instance->FLTISR & DFSDM_FLTISR_CKABF) >> (DFSDM_FLTISR_CKABF_Pos + channel)) & 1U) != 0U) | |
657 { | |
658 filter0Instance->FLTICR = (1U << (DFSDM_FLTICR_CLRCKABF_Pos + channel)); | |
659 | |
660 /* Check the Timeout */ | |
661 if((HAL_GetTick()-tickstart) > DFSDM_CKAB_TIMEOUT) | |
662 { | |
663 /* Set timeout status */ | |
664 status = HAL_TIMEOUT; | |
665 break; | |
666 } | |
667 } | |
668 #else | |
669 /* Get channel number from channel instance */ | |
670 channel = DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance); | |
671 | |
672 /* Get timeout */ | |
673 tickstart = HAL_GetTick(); | |
674 | |
675 /* Clear clock absence flag */ | |
676 while((((DFSDM1_Filter0->FLTISR & DFSDM_FLTISR_CKABF) >> (DFSDM_FLTISR_CKABF_Pos + channel)) & 1U) != 0U) | |
677 { | |
678 DFSDM1_Filter0->FLTICR = (1U << (DFSDM_FLTICR_CLRCKABF_Pos + channel)); | |
679 | |
680 /* Check the Timeout */ | |
681 if((HAL_GetTick()-tickstart) > DFSDM_CKAB_TIMEOUT) | |
682 { | |
683 /* Set timeout status */ | |
684 status = HAL_TIMEOUT; | |
685 break; | |
686 } | |
687 } | |
688 #endif /* DFSDM2_Channel0 */ | |
689 | |
690 if(status == HAL_OK) | |
691 { | |
692 /* Start clock absence detection */ | |
693 hdfsdm_channel->Instance->CHCFGR1 |= DFSDM_CHCFGR1_CKABEN; | |
694 } | |
695 } | |
696 /* Return function status */ | |
697 return status; | |
698 } | |
699 | |
700 /** | |
701 * @brief This function allows to poll for the clock absence detection. | |
702 * @param hdfsdm_channel DFSDM channel handle. | |
703 * @param Timeout Timeout value in milliseconds. | |
704 * @retval HAL status | |
705 */ | |
706 HAL_StatusTypeDef HAL_DFSDM_ChannelPollForCkab(DFSDM_Channel_HandleTypeDef *hdfsdm_channel, | |
707 uint32_t Timeout) | |
708 { | |
709 uint32_t tickstart; | |
710 uint32_t channel; | |
711 #if defined(DFSDM2_Channel0) | |
712 DFSDM_Filter_TypeDef* filter0Instance; | |
713 #endif /* defined(DFSDM2_Channel0) */ | |
714 | |
715 /* Check parameters */ | |
716 assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance)); | |
717 | |
718 /* Check DFSDM channel state */ | |
719 if(hdfsdm_channel->State != HAL_DFSDM_CHANNEL_STATE_READY) | |
720 { | |
721 /* Return error status */ | |
722 return HAL_ERROR; | |
723 } | |
724 else | |
725 { | |
726 #if defined(DFSDM2_Channel0) | |
727 | |
728 /* Get channel counter, channel handle table and channel 0 instance */ | |
729 if(IS_DFSDM1_CHANNEL_INSTANCE(hdfsdm_channel->Instance)) | |
730 { | |
731 filter0Instance = DFSDM1_Filter0; | |
732 } | |
733 else | |
734 { | |
735 filter0Instance = DFSDM2_Filter0; | |
736 } | |
737 | |
738 /* Get channel number from channel instance */ | |
739 channel = DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance); | |
740 | |
741 /* Get timeout */ | |
742 tickstart = HAL_GetTick(); | |
743 | |
744 /* Wait clock absence detection */ | |
745 while((((filter0Instance->FLTISR & DFSDM_FLTISR_CKABF) >> (DFSDM_FLTISR_CKABF_Pos + channel)) & 1U) == 0U) | |
746 { | |
747 /* Check the Timeout */ | |
748 if(Timeout != HAL_MAX_DELAY) | |
749 { | |
750 if((Timeout == 0U) || ((HAL_GetTick()-tickstart) > Timeout)) | |
751 { | |
752 /* Return timeout status */ | |
753 return HAL_TIMEOUT; | |
754 } | |
755 } | |
756 } | |
757 | |
758 /* Clear clock absence detection flag */ | |
759 filter0Instance->FLTICR = (1U << (DFSDM_FLTICR_CLRCKABF_Pos + channel)); | |
760 #else | |
761 /* Get channel number from channel instance */ | |
762 channel = DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance); | |
763 | |
764 /* Get timeout */ | |
765 tickstart = HAL_GetTick(); | |
766 | |
767 /* Wait clock absence detection */ | |
768 while((((DFSDM1_Filter0->FLTISR & DFSDM_FLTISR_CKABF) >> (DFSDM_FLTISR_CKABF_Pos + channel)) & 1U) == 0U) | |
769 { | |
770 /* Check the Timeout */ | |
771 if(Timeout != HAL_MAX_DELAY) | |
772 { | |
773 if((Timeout == 0U) || ((HAL_GetTick()-tickstart) > Timeout)) | |
774 { | |
775 /* Return timeout status */ | |
776 return HAL_TIMEOUT; | |
777 } | |
778 } | |
779 } | |
780 | |
781 /* Clear clock absence detection flag */ | |
782 DFSDM1_Filter0->FLTICR = (1U << (DFSDM_FLTICR_CLRCKABF_Pos + channel)); | |
783 #endif /* defined(DFSDM2_Channel0) */ | |
784 /* Return function status */ | |
785 return HAL_OK; | |
786 } | |
787 } | |
788 | |
789 /** | |
790 * @brief This function allows to stop clock absence detection in polling mode. | |
791 * @param hdfsdm_channel DFSDM channel handle. | |
792 * @retval HAL status | |
793 */ | |
794 HAL_StatusTypeDef HAL_DFSDM_ChannelCkabStop(DFSDM_Channel_HandleTypeDef *hdfsdm_channel) | |
795 { | |
796 HAL_StatusTypeDef status = HAL_OK; | |
797 uint32_t channel; | |
798 #if defined(DFSDM2_Channel0) | |
799 DFSDM_Filter_TypeDef* filter0Instance; | |
800 #endif /* defined(DFSDM2_Channel0) */ | |
801 | |
802 /* Check parameters */ | |
803 assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance)); | |
804 | |
805 /* Check DFSDM channel state */ | |
806 if(hdfsdm_channel->State != HAL_DFSDM_CHANNEL_STATE_READY) | |
807 { | |
808 /* Return error status */ | |
809 status = HAL_ERROR; | |
810 } | |
811 else | |
812 { | |
813 #if defined(DFSDM2_Channel0) | |
814 | |
815 /* Get channel counter, channel handle table and channel 0 instance */ | |
816 if(IS_DFSDM1_CHANNEL_INSTANCE(hdfsdm_channel->Instance)) | |
817 { | |
818 filter0Instance = DFSDM1_Filter0; | |
819 } | |
820 else | |
821 { | |
822 filter0Instance = DFSDM2_Filter0; | |
823 } | |
824 | |
825 /* Stop clock absence detection */ | |
826 hdfsdm_channel->Instance->CHCFGR1 &= ~(DFSDM_CHCFGR1_CKABEN); | |
827 | |
828 /* Clear clock absence flag */ | |
829 channel = DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance); | |
830 filter0Instance->FLTICR = (1U << (DFSDM_FLTICR_CLRCKABF_Pos + channel)); | |
831 | |
832 #else | |
833 /* Stop clock absence detection */ | |
834 hdfsdm_channel->Instance->CHCFGR1 &= ~(DFSDM_CHCFGR1_CKABEN); | |
835 | |
836 /* Clear clock absence flag */ | |
837 channel = DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance); | |
838 DFSDM1_Filter0->FLTICR = (1U << (DFSDM_FLTICR_CLRCKABF_Pos + channel)); | |
839 #endif /* DFSDM2_Channel0 */ | |
840 } | |
841 /* Return function status */ | |
842 return status; | |
843 } | |
844 | |
845 /** | |
846 * @brief This function allows to start clock absence detection in interrupt mode. | |
847 * @note Same mode has to be used for all channels. | |
848 * @note If clock is not available on this channel during 5 seconds, | |
849 * clock absence detection will not be activated and function | |
850 * will return HAL_TIMEOUT error. | |
851 * @param hdfsdm_channel DFSDM channel handle. | |
852 * @retval HAL status | |
853 */ | |
854 HAL_StatusTypeDef HAL_DFSDM_ChannelCkabStart_IT(DFSDM_Channel_HandleTypeDef *hdfsdm_channel) | |
855 { | |
856 HAL_StatusTypeDef status = HAL_OK; | |
857 uint32_t channel; | |
858 uint32_t tickstart; | |
859 #if defined(DFSDM2_Channel0) | |
860 DFSDM_Filter_TypeDef* filter0Instance; | |
861 #endif /* defined(DFSDM2_Channel0) */ | |
862 | |
863 /* Check parameters */ | |
864 assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance)); | |
865 | |
866 /* Check DFSDM channel state */ | |
867 if(hdfsdm_channel->State != HAL_DFSDM_CHANNEL_STATE_READY) | |
868 { | |
869 /* Return error status */ | |
870 status = HAL_ERROR; | |
871 } | |
872 else | |
873 { | |
874 #if defined(DFSDM2_Channel0) | |
875 | |
876 /* Get channel counter, channel handle table and channel 0 instance */ | |
877 if(IS_DFSDM1_CHANNEL_INSTANCE(hdfsdm_channel->Instance)) | |
878 { | |
879 filter0Instance = DFSDM1_Filter0; | |
880 } | |
881 else | |
882 { | |
883 filter0Instance = DFSDM2_Filter0; | |
884 } | |
885 | |
886 /* Get channel number from channel instance */ | |
887 channel = DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance); | |
888 | |
889 /* Get timeout */ | |
890 tickstart = HAL_GetTick(); | |
891 | |
892 /* Clear clock absence flag */ | |
893 while((((filter0Instance->FLTISR & DFSDM_FLTISR_CKABF) >> (DFSDM_FLTISR_CKABF_Pos + channel)) & 1U) != 0U) | |
894 { | |
895 filter0Instance->FLTICR = (1U << (DFSDM_FLTICR_CLRCKABF_Pos + channel)); | |
896 | |
897 /* Check the Timeout */ | |
898 if((HAL_GetTick()-tickstart) > DFSDM_CKAB_TIMEOUT) | |
899 { | |
900 /* Set timeout status */ | |
901 status = HAL_TIMEOUT; | |
902 break; | |
903 } | |
904 } | |
905 | |
906 if(status == HAL_OK) | |
907 { | |
908 /* Activate clock absence detection interrupt */ | |
909 filter0Instance->FLTCR2 |= DFSDM_FLTCR2_CKABIE; | |
910 | |
911 /* Start clock absence detection */ | |
912 hdfsdm_channel->Instance->CHCFGR1 |= DFSDM_CHCFGR1_CKABEN; | |
913 } | |
914 #else | |
915 /* Get channel number from channel instance */ | |
916 channel = DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance); | |
917 | |
918 /* Get timeout */ | |
919 tickstart = HAL_GetTick(); | |
920 | |
921 /* Clear clock absence flag */ | |
922 while((((DFSDM1_Filter0->FLTISR & DFSDM_FLTISR_CKABF) >> (DFSDM_FLTISR_CKABF_Pos + channel)) & 1U) != 0U) | |
923 { | |
924 DFSDM1_Filter0->FLTICR = (1U << (DFSDM_FLTICR_CLRCKABF_Pos + channel)); | |
925 | |
926 /* Check the Timeout */ | |
927 if((HAL_GetTick()-tickstart) > DFSDM_CKAB_TIMEOUT) | |
928 { | |
929 /* Set timeout status */ | |
930 status = HAL_TIMEOUT; | |
931 break; | |
932 } | |
933 } | |
934 | |
935 if(status == HAL_OK) | |
936 { | |
937 /* Activate clock absence detection interrupt */ | |
938 DFSDM1_Filter0->FLTCR2 |= DFSDM_FLTCR2_CKABIE; | |
939 | |
940 /* Start clock absence detection */ | |
941 hdfsdm_channel->Instance->CHCFGR1 |= DFSDM_CHCFGR1_CKABEN; | |
942 } | |
943 | |
944 #endif /* defined(DFSDM2_Channel0) */ | |
945 } | |
946 /* Return function status */ | |
947 return status; | |
948 } | |
949 | |
950 /** | |
951 * @brief Clock absence detection callback. | |
952 * @param hdfsdm_channel DFSDM channel handle. | |
953 * @retval None | |
954 */ | |
955 __weak void HAL_DFSDM_ChannelCkabCallback(DFSDM_Channel_HandleTypeDef *hdfsdm_channel) | |
956 { | |
957 /* Prevent unused argument(s) compilation warning */ | |
958 UNUSED(hdfsdm_channel); | |
959 /* NOTE : This function should not be modified, when the callback is needed, | |
960 the HAL_DFSDM_ChannelCkabCallback could be implemented in the user file | |
961 */ | |
962 } | |
963 | |
964 /** | |
965 * @brief This function allows to stop clock absence detection in interrupt mode. | |
966 * @note Interrupt will be disabled for all channels | |
967 * @param hdfsdm_channel DFSDM channel handle. | |
968 * @retval HAL status | |
969 */ | |
970 HAL_StatusTypeDef HAL_DFSDM_ChannelCkabStop_IT(DFSDM_Channel_HandleTypeDef *hdfsdm_channel) | |
971 { | |
972 HAL_StatusTypeDef status = HAL_OK; | |
973 uint32_t channel; | |
974 #if defined(DFSDM2_Channel0) | |
975 DFSDM_Filter_TypeDef* filter0Instance; | |
976 #endif /* defined(DFSDM2_Channel0) */ | |
977 | |
978 /* Check parameters */ | |
979 assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance)); | |
980 | |
981 /* Check DFSDM channel state */ | |
982 if(hdfsdm_channel->State != HAL_DFSDM_CHANNEL_STATE_READY) | |
983 { | |
984 /* Return error status */ | |
985 status = HAL_ERROR; | |
986 } | |
987 else | |
988 { | |
989 #if defined(DFSDM2_Channel0) | |
990 | |
991 /* Get channel counter, channel handle table and channel 0 instance */ | |
992 if(IS_DFSDM1_CHANNEL_INSTANCE(hdfsdm_channel->Instance)) | |
993 { | |
994 filter0Instance = DFSDM1_Filter0; | |
995 } | |
996 else | |
997 { | |
998 filter0Instance = DFSDM2_Filter0; | |
999 } | |
1000 | |
1001 /* Stop clock absence detection */ | |
1002 hdfsdm_channel->Instance->CHCFGR1 &= ~(DFSDM_CHCFGR1_CKABEN); | |
1003 | |
1004 /* Clear clock absence flag */ | |
1005 channel = DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance); | |
1006 filter0Instance->FLTICR = (1U << (DFSDM_FLTICR_CLRCKABF_Pos + channel)); | |
1007 | |
1008 /* Disable clock absence detection interrupt */ | |
1009 filter0Instance->FLTCR2 &= ~(DFSDM_FLTCR2_CKABIE); | |
1010 #else | |
1011 | |
1012 /* Stop clock absence detection */ | |
1013 hdfsdm_channel->Instance->CHCFGR1 &= ~(DFSDM_CHCFGR1_CKABEN); | |
1014 | |
1015 /* Clear clock absence flag */ | |
1016 channel = DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance); | |
1017 DFSDM1_Filter0->FLTICR = (1U << (DFSDM_FLTICR_CLRCKABF_Pos + channel)); | |
1018 | |
1019 /* Disable clock absence detection interrupt */ | |
1020 DFSDM1_Filter0->FLTCR2 &= ~(DFSDM_FLTCR2_CKABIE); | |
1021 #endif /* DFSDM2_Channel0 */ | |
1022 } | |
1023 | |
1024 /* Return function status */ | |
1025 return status; | |
1026 } | |
1027 | |
1028 /** | |
1029 * @brief This function allows to start short circuit detection in polling mode. | |
1030 * @note Same mode has to be used for all channels | |
1031 * @param hdfsdm_channel DFSDM channel handle. | |
1032 * @param Threshold Short circuit detector threshold. | |
1033 * This parameter must be a number between Min_Data = 0 and Max_Data = 255. | |
1034 * @param BreakSignal Break signals assigned to short circuit event. | |
1035 * This parameter can be a values combination of @ref DFSDM_BreakSignals. | |
1036 * @retval HAL status | |
1037 */ | |
1038 HAL_StatusTypeDef HAL_DFSDM_ChannelScdStart(DFSDM_Channel_HandleTypeDef *hdfsdm_channel, | |
1039 uint32_t Threshold, | |
1040 uint32_t BreakSignal) | |
1041 { | |
1042 HAL_StatusTypeDef status = HAL_OK; | |
1043 | |
1044 /* Check parameters */ | |
1045 assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance)); | |
1046 assert_param(IS_DFSDM_CHANNEL_SCD_THRESHOLD(Threshold)); | |
1047 assert_param(IS_DFSDM_BREAK_SIGNALS(BreakSignal)); | |
1048 | |
1049 /* Check DFSDM channel state */ | |
1050 if(hdfsdm_channel->State != HAL_DFSDM_CHANNEL_STATE_READY) | |
1051 { | |
1052 /* Return error status */ | |
1053 status = HAL_ERROR; | |
1054 } | |
1055 else | |
1056 { | |
1057 /* Configure threshold and break signals */ | |
1058 hdfsdm_channel->Instance->CHAWSCDR &= ~(DFSDM_CHAWSCDR_BKSCD | DFSDM_CHAWSCDR_SCDT); | |
1059 hdfsdm_channel->Instance->CHAWSCDR |= ((BreakSignal << DFSDM_CHAWSCDR_BKSCD_Pos) | \ | |
1060 Threshold); | |
1061 | |
1062 /* Start short circuit detection */ | |
1063 hdfsdm_channel->Instance->CHCFGR1 |= DFSDM_CHCFGR1_SCDEN; | |
1064 } | |
1065 /* Return function status */ | |
1066 return status; | |
1067 } | |
1068 | |
1069 /** | |
1070 * @brief This function allows to poll for the short circuit detection. | |
1071 * @param hdfsdm_channel DFSDM channel handle. | |
1072 * @param Timeout Timeout value in milliseconds. | |
1073 * @retval HAL status | |
1074 */ | |
1075 HAL_StatusTypeDef HAL_DFSDM_ChannelPollForScd(DFSDM_Channel_HandleTypeDef *hdfsdm_channel, | |
1076 uint32_t Timeout) | |
1077 { | |
1078 uint32_t tickstart; | |
1079 uint32_t channel; | |
1080 #if defined(DFSDM2_Channel0) | |
1081 DFSDM_Filter_TypeDef* filter0Instance; | |
1082 #endif /* defined(DFSDM2_Channel0) */ | |
1083 | |
1084 /* Check parameters */ | |
1085 assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance)); | |
1086 | |
1087 /* Check DFSDM channel state */ | |
1088 if(hdfsdm_channel->State != HAL_DFSDM_CHANNEL_STATE_READY) | |
1089 { | |
1090 /* Return error status */ | |
1091 return HAL_ERROR; | |
1092 } | |
1093 else | |
1094 { | |
1095 /* Get channel number from channel instance */ | |
1096 channel = DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance); | |
1097 | |
1098 #if defined(DFSDM2_Channel0) | |
1099 /* Get channel counter, channel handle table and channel 0 instance */ | |
1100 if(IS_DFSDM1_CHANNEL_INSTANCE(hdfsdm_channel->Instance)) | |
1101 { | |
1102 filter0Instance = DFSDM1_Filter0; | |
1103 } | |
1104 else | |
1105 { | |
1106 filter0Instance = DFSDM2_Filter0; | |
1107 } | |
1108 | |
1109 /* Get timeout */ | |
1110 tickstart = HAL_GetTick(); | |
1111 | |
1112 /* Wait short circuit detection */ | |
1113 while(((filter0Instance->FLTISR & DFSDM_FLTISR_SCDF) >> (DFSDM_FLTISR_SCDF_Pos + channel)) == 0U) | |
1114 { | |
1115 /* Check the Timeout */ | |
1116 if(Timeout != HAL_MAX_DELAY) | |
1117 { | |
1118 if((Timeout == 0U) || ((HAL_GetTick()-tickstart) > Timeout)) | |
1119 { | |
1120 /* Return timeout status */ | |
1121 return HAL_TIMEOUT; | |
1122 } | |
1123 } | |
1124 } | |
1125 | |
1126 /* Clear short circuit detection flag */ | |
1127 filter0Instance->FLTICR = (1U << (DFSDM_FLTICR_CLRSCSDF_Pos + channel)); | |
1128 | |
1129 #else | |
1130 /* Get timeout */ | |
1131 tickstart = HAL_GetTick(); | |
1132 | |
1133 /* Wait short circuit detection */ | |
1134 while(((DFSDM1_Filter0->FLTISR & DFSDM_FLTISR_SCDF) >> (DFSDM_FLTISR_SCDF_Pos + channel)) == 0U) | |
1135 { | |
1136 /* Check the Timeout */ | |
1137 if(Timeout != HAL_MAX_DELAY) | |
1138 { | |
1139 if((Timeout == 0U) || ((HAL_GetTick()-tickstart) > Timeout)) | |
1140 { | |
1141 /* Return timeout status */ | |
1142 return HAL_TIMEOUT; | |
1143 } | |
1144 } | |
1145 } | |
1146 | |
1147 /* Clear short circuit detection flag */ | |
1148 DFSDM1_Filter0->FLTICR = (1U << (DFSDM_FLTICR_CLRSCSDF_Pos + channel)); | |
1149 #endif /* DFSDM2_Channel0 */ | |
1150 | |
1151 /* Return function status */ | |
1152 return HAL_OK; | |
1153 } | |
1154 } | |
1155 | |
1156 /** | |
1157 * @brief This function allows to stop short circuit detection in polling mode. | |
1158 * @param hdfsdm_channel DFSDM channel handle. | |
1159 * @retval HAL status | |
1160 */ | |
1161 HAL_StatusTypeDef HAL_DFSDM_ChannelScdStop(DFSDM_Channel_HandleTypeDef *hdfsdm_channel) | |
1162 { | |
1163 HAL_StatusTypeDef status = HAL_OK; | |
1164 uint32_t channel; | |
1165 #if defined(DFSDM2_Channel0) | |
1166 DFSDM_Filter_TypeDef* filter0Instance; | |
1167 #endif /* defined(DFSDM2_Channel0) */ | |
1168 | |
1169 /* Check parameters */ | |
1170 assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance)); | |
1171 | |
1172 /* Check DFSDM channel state */ | |
1173 if(hdfsdm_channel->State != HAL_DFSDM_CHANNEL_STATE_READY) | |
1174 { | |
1175 /* Return error status */ | |
1176 status = HAL_ERROR; | |
1177 } | |
1178 else | |
1179 { | |
1180 /* Stop short circuit detection */ | |
1181 hdfsdm_channel->Instance->CHCFGR1 &= ~(DFSDM_CHCFGR1_SCDEN); | |
1182 | |
1183 /* Clear short circuit detection flag */ | |
1184 channel = DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance); | |
1185 | |
1186 #if defined(DFSDM2_Channel0) | |
1187 /* Get channel counter, channel handle table and channel 0 instance */ | |
1188 if(IS_DFSDM1_CHANNEL_INSTANCE(hdfsdm_channel->Instance)) | |
1189 { | |
1190 filter0Instance = DFSDM1_Filter0; | |
1191 } | |
1192 else | |
1193 { | |
1194 filter0Instance = DFSDM2_Filter0; | |
1195 } | |
1196 | |
1197 filter0Instance->FLTICR = (1U << (DFSDM_FLTICR_CLRSCSDF_Pos + channel)); | |
1198 #else | |
1199 DFSDM1_Filter0->FLTICR = (1U << (DFSDM_FLTICR_CLRSCSDF_Pos + channel)); | |
1200 #endif /* DFSDM2_Channel0*/ | |
1201 } | |
1202 /* Return function status */ | |
1203 return status; | |
1204 } | |
1205 | |
1206 /** | |
1207 * @brief This function allows to start short circuit detection in interrupt mode. | |
1208 * @note Same mode has to be used for all channels | |
1209 * @param hdfsdm_channel DFSDM channel handle. | |
1210 * @param Threshold Short circuit detector threshold. | |
1211 * This parameter must be a number between Min_Data = 0 and Max_Data = 255. | |
1212 * @param BreakSignal Break signals assigned to short circuit event. | |
1213 * This parameter can be a values combination of @ref DFSDM_BreakSignals. | |
1214 * @retval HAL status | |
1215 */ | |
1216 HAL_StatusTypeDef HAL_DFSDM_ChannelScdStart_IT(DFSDM_Channel_HandleTypeDef *hdfsdm_channel, | |
1217 uint32_t Threshold, | |
1218 uint32_t BreakSignal) | |
1219 { | |
1220 HAL_StatusTypeDef status = HAL_OK; | |
1221 #if defined(DFSDM2_Channel0) | |
1222 DFSDM_Filter_TypeDef* filter0Instance; | |
1223 #endif /* defined(DFSDM2_Channel0) */ | |
1224 | |
1225 /* Check parameters */ | |
1226 assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance)); | |
1227 assert_param(IS_DFSDM_CHANNEL_SCD_THRESHOLD(Threshold)); | |
1228 assert_param(IS_DFSDM_BREAK_SIGNALS(BreakSignal)); | |
1229 | |
1230 /* Check DFSDM channel state */ | |
1231 if(hdfsdm_channel->State != HAL_DFSDM_CHANNEL_STATE_READY) | |
1232 { | |
1233 /* Return error status */ | |
1234 status = HAL_ERROR; | |
1235 } | |
1236 else | |
1237 { | |
1238 #if defined(DFSDM2_Channel0) | |
1239 /* Get channel counter, channel handle table and channel 0 instance */ | |
1240 if(IS_DFSDM1_CHANNEL_INSTANCE(hdfsdm_channel->Instance)) | |
1241 { | |
1242 filter0Instance = DFSDM1_Filter0; | |
1243 } | |
1244 else | |
1245 { | |
1246 filter0Instance = DFSDM2_Filter0; | |
1247 } | |
1248 /* Activate short circuit detection interrupt */ | |
1249 filter0Instance->FLTCR2 |= DFSDM_FLTCR2_SCDIE; | |
1250 #else | |
1251 /* Activate short circuit detection interrupt */ | |
1252 DFSDM1_Filter0->FLTCR2 |= DFSDM_FLTCR2_SCDIE; | |
1253 #endif /* DFSDM2_Channel0 */ | |
1254 | |
1255 /* Configure threshold and break signals */ | |
1256 hdfsdm_channel->Instance->CHAWSCDR &= ~(DFSDM_CHAWSCDR_BKSCD | DFSDM_CHAWSCDR_SCDT); | |
1257 hdfsdm_channel->Instance->CHAWSCDR |= ((BreakSignal << DFSDM_CHAWSCDR_BKSCD_Pos) | \ | |
1258 Threshold); | |
1259 | |
1260 /* Start short circuit detection */ | |
1261 hdfsdm_channel->Instance->CHCFGR1 |= DFSDM_CHCFGR1_SCDEN; | |
1262 } | |
1263 /* Return function status */ | |
1264 return status; | |
1265 } | |
1266 | |
1267 /** | |
1268 * @brief Short circuit detection callback. | |
1269 * @param hdfsdm_channel DFSDM channel handle. | |
1270 * @retval None | |
1271 */ | |
1272 __weak void HAL_DFSDM_ChannelScdCallback(DFSDM_Channel_HandleTypeDef *hdfsdm_channel) | |
1273 { | |
1274 /* Prevent unused argument(s) compilation warning */ | |
1275 UNUSED(hdfsdm_channel); | |
1276 /* NOTE : This function should not be modified, when the callback is needed, | |
1277 the HAL_DFSDM_ChannelScdCallback could be implemented in the user file | |
1278 */ | |
1279 } | |
1280 | |
1281 /** | |
1282 * @brief This function allows to stop short circuit detection in interrupt mode. | |
1283 * @note Interrupt will be disabled for all channels | |
1284 * @param hdfsdm_channel DFSDM channel handle. | |
1285 * @retval HAL status | |
1286 */ | |
1287 HAL_StatusTypeDef HAL_DFSDM_ChannelScdStop_IT(DFSDM_Channel_HandleTypeDef *hdfsdm_channel) | |
1288 { | |
1289 HAL_StatusTypeDef status = HAL_OK; | |
1290 uint32_t channel; | |
1291 #if defined(DFSDM2_Channel0) | |
1292 DFSDM_Filter_TypeDef* filter0Instance; | |
1293 #endif /* defined(DFSDM2_Channel0) */ | |
1294 | |
1295 /* Check parameters */ | |
1296 assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance)); | |
1297 | |
1298 /* Check DFSDM channel state */ | |
1299 if(hdfsdm_channel->State != HAL_DFSDM_CHANNEL_STATE_READY) | |
1300 { | |
1301 /* Return error status */ | |
1302 status = HAL_ERROR; | |
1303 } | |
1304 else | |
1305 { | |
1306 /* Stop short circuit detection */ | |
1307 hdfsdm_channel->Instance->CHCFGR1 &= ~(DFSDM_CHCFGR1_SCDEN); | |
1308 | |
1309 /* Clear short circuit detection flag */ | |
1310 channel = DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance); | |
1311 #if defined(DFSDM2_Channel0) | |
1312 /* Get channel counter, channel handle table and channel 0 instance */ | |
1313 if(IS_DFSDM1_CHANNEL_INSTANCE(hdfsdm_channel->Instance)) | |
1314 { | |
1315 filter0Instance = DFSDM1_Filter0; | |
1316 } | |
1317 else | |
1318 { | |
1319 filter0Instance = DFSDM2_Filter0; | |
1320 } | |
1321 | |
1322 filter0Instance->FLTICR = (1U << (DFSDM_FLTICR_CLRSCSDF_Pos + channel)); | |
1323 | |
1324 /* Disable short circuit detection interrupt */ | |
1325 filter0Instance->FLTCR2 &= ~(DFSDM_FLTCR2_SCDIE); | |
1326 #else | |
1327 DFSDM1_Filter0->FLTICR = (1U << (DFSDM_FLTICR_CLRSCSDF_Pos + channel)); | |
1328 | |
1329 /* Disable short circuit detection interrupt */ | |
1330 DFSDM1_Filter0->FLTCR2 &= ~(DFSDM_FLTCR2_SCDIE); | |
1331 #endif /* DFSDM2_Channel0 */ | |
1332 } | |
1333 /* Return function status */ | |
1334 return status; | |
1335 } | |
1336 | |
1337 /** | |
1338 * @brief This function allows to get channel analog watchdog value. | |
1339 * @param hdfsdm_channel DFSDM channel handle. | |
1340 * @retval Channel analog watchdog value. | |
1341 */ | |
1342 int16_t HAL_DFSDM_ChannelGetAwdValue(DFSDM_Channel_HandleTypeDef *hdfsdm_channel) | |
1343 { | |
1344 return (int16_t) hdfsdm_channel->Instance->CHWDATAR; | |
1345 } | |
1346 | |
1347 /** | |
1348 * @brief This function allows to modify channel offset value. | |
1349 * @param hdfsdm_channel DFSDM channel handle. | |
1350 * @param Offset DFSDM channel offset. | |
1351 * This parameter must be a number between Min_Data = -8388608 and Max_Data = 8388607. | |
1352 * @retval HAL status. | |
1353 */ | |
1354 HAL_StatusTypeDef HAL_DFSDM_ChannelModifyOffset(DFSDM_Channel_HandleTypeDef *hdfsdm_channel, | |
1355 int32_t Offset) | |
1356 { | |
1357 HAL_StatusTypeDef status = HAL_OK; | |
1358 | |
1359 /* Check parameters */ | |
1360 assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance)); | |
1361 assert_param(IS_DFSDM_CHANNEL_OFFSET(Offset)); | |
1362 | |
1363 /* Check DFSDM channel state */ | |
1364 if(hdfsdm_channel->State != HAL_DFSDM_CHANNEL_STATE_READY) | |
1365 { | |
1366 /* Return error status */ | |
1367 status = HAL_ERROR; | |
1368 } | |
1369 else | |
1370 { | |
1371 /* Modify channel offset */ | |
1372 hdfsdm_channel->Instance->CHCFGR2 &= ~(DFSDM_CHCFGR2_OFFSET); | |
1373 hdfsdm_channel->Instance->CHCFGR2 |= ((uint32_t) Offset << DFSDM_CHCFGR2_OFFSET_Pos); | |
1374 } | |
1375 /* Return function status */ | |
1376 return status; | |
1377 } | |
1378 | |
1379 /** | |
1380 * @} | |
1381 */ | |
1382 | |
1383 /** @defgroup DFSDM_Exported_Functions_Group3_Channel Channel state function | |
1384 * @brief Channel state function | |
1385 * | |
1386 @verbatim | |
1387 ============================================================================== | |
1388 ##### Channel state function ##### | |
1389 ============================================================================== | |
1390 [..] This section provides function allowing to: | |
1391 (+) Get channel handle state. | |
1392 @endverbatim | |
1393 * @{ | |
1394 */ | |
1395 | |
1396 /** | |
1397 * @brief This function allows to get the current DFSDM channel handle state. | |
1398 * @param hdfsdm_channel DFSDM channel handle. | |
1399 * @retval DFSDM channel state. | |
1400 */ | |
1401 HAL_DFSDM_Channel_StateTypeDef HAL_DFSDM_ChannelGetState(DFSDM_Channel_HandleTypeDef *hdfsdm_channel) | |
1402 { | |
1403 /* Return DFSDM channel handle state */ | |
1404 return hdfsdm_channel->State; | |
1405 } | |
1406 | |
1407 /** | |
1408 * @} | |
1409 */ | |
1410 | |
1411 /** @defgroup DFSDM_Exported_Functions_Group1_Filter Filter initialization and de-initialization functions | |
1412 * @brief Filter initialization and de-initialization functions | |
1413 * | |
1414 @verbatim | |
1415 ============================================================================== | |
1416 ##### Filter initialization and de-initialization functions ##### | |
1417 ============================================================================== | |
1418 [..] This section provides functions allowing to: | |
1419 (+) Initialize the DFSDM filter. | |
1420 (+) De-initialize the DFSDM filter. | |
1421 @endverbatim | |
1422 * @{ | |
1423 */ | |
1424 | |
1425 /** | |
1426 * @brief Initialize the DFSDM filter according to the specified parameters | |
1427 * in the DFSDM_FilterInitTypeDef structure and initialize the associated handle. | |
1428 * @param hdfsdm_filter DFSDM filter handle. | |
1429 * @retval HAL status. | |
1430 */ | |
1431 HAL_StatusTypeDef HAL_DFSDM_FilterInit(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
1432 { | |
1433 /* Check DFSDM Channel handle */ | |
1434 if(hdfsdm_filter == NULL) | |
1435 { | |
1436 return HAL_ERROR; | |
1437 } | |
1438 | |
1439 /* Check parameters */ | |
1440 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
1441 assert_param(IS_DFSDM_FILTER_REG_TRIGGER(hdfsdm_filter->Init.RegularParam.Trigger)); | |
1442 assert_param(IS_FUNCTIONAL_STATE(hdfsdm_filter->Init.RegularParam.FastMode)); | |
1443 assert_param(IS_FUNCTIONAL_STATE(hdfsdm_filter->Init.RegularParam.DmaMode)); | |
1444 assert_param(IS_DFSDM_FILTER_INJ_TRIGGER(hdfsdm_filter->Init.InjectedParam.Trigger)); | |
1445 assert_param(IS_FUNCTIONAL_STATE(hdfsdm_filter->Init.InjectedParam.ScanMode)); | |
1446 assert_param(IS_FUNCTIONAL_STATE(hdfsdm_filter->Init.InjectedParam.DmaMode)); | |
1447 assert_param(IS_DFSDM_FILTER_SINC_ORDER(hdfsdm_filter->Init.FilterParam.SincOrder)); | |
1448 assert_param(IS_DFSDM_FILTER_OVS_RATIO(hdfsdm_filter->Init.FilterParam.Oversampling)); | |
1449 assert_param(IS_DFSDM_FILTER_INTEGRATOR_OVS_RATIO(hdfsdm_filter->Init.FilterParam.IntOversampling)); | |
1450 | |
1451 /* Check parameters compatibility */ | |
1452 if((hdfsdm_filter->Instance == DFSDM1_Filter0) && | |
1453 ((hdfsdm_filter->Init.RegularParam.Trigger == DFSDM_FILTER_SYNC_TRIGGER) || | |
1454 (hdfsdm_filter->Init.InjectedParam.Trigger == DFSDM_FILTER_SYNC_TRIGGER))) | |
1455 { | |
1456 return HAL_ERROR; | |
1457 } | |
1458 #if defined (DFSDM2_Channel0) | |
1459 if((hdfsdm_filter->Instance == DFSDM2_Filter0) && | |
1460 ((hdfsdm_filter->Init.RegularParam.Trigger == DFSDM_FILTER_SYNC_TRIGGER) || | |
1461 (hdfsdm_filter->Init.InjectedParam.Trigger == DFSDM_FILTER_SYNC_TRIGGER))) | |
1462 { | |
1463 return HAL_ERROR; | |
1464 } | |
1465 #endif /* DFSDM2_Channel0 */ | |
1466 | |
1467 /* Initialize DFSDM filter variables with default values */ | |
1468 hdfsdm_filter->RegularContMode = DFSDM_CONTINUOUS_CONV_OFF; | |
1469 hdfsdm_filter->InjectedChannelsNbr = 1U; | |
1470 hdfsdm_filter->InjConvRemaining = 1U; | |
1471 hdfsdm_filter->ErrorCode = DFSDM_FILTER_ERROR_NONE; | |
1472 | |
1473 /* Call MSP init function */ | |
1474 HAL_DFSDM_FilterMspInit(hdfsdm_filter); | |
1475 | |
1476 /* Set regular parameters */ | |
1477 hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_RSYNC); | |
1478 if(hdfsdm_filter->Init.RegularParam.FastMode == ENABLE) | |
1479 { | |
1480 hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_FAST; | |
1481 } | |
1482 else | |
1483 { | |
1484 hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_FAST); | |
1485 } | |
1486 | |
1487 if(hdfsdm_filter->Init.RegularParam.DmaMode == ENABLE) | |
1488 { | |
1489 hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_RDMAEN; | |
1490 } | |
1491 else | |
1492 { | |
1493 hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_RDMAEN); | |
1494 } | |
1495 | |
1496 /* Set injected parameters */ | |
1497 hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_JSYNC | DFSDM_FLTCR1_JEXTEN | DFSDM_FLTCR1_JEXTSEL); | |
1498 if(hdfsdm_filter->Init.InjectedParam.Trigger == DFSDM_FILTER_EXT_TRIGGER) | |
1499 { | |
1500 assert_param(IS_DFSDM_FILTER_EXT_TRIG(hdfsdm_filter->Init.InjectedParam.ExtTrigger)); | |
1501 assert_param(IS_DFSDM_FILTER_EXT_TRIG_EDGE(hdfsdm_filter->Init.InjectedParam.ExtTriggerEdge)); | |
1502 hdfsdm_filter->Instance->FLTCR1 |= (hdfsdm_filter->Init.InjectedParam.ExtTrigger); | |
1503 } | |
1504 | |
1505 if(hdfsdm_filter->Init.InjectedParam.ScanMode == ENABLE) | |
1506 { | |
1507 hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_JSCAN; | |
1508 } | |
1509 else | |
1510 { | |
1511 hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_JSCAN); | |
1512 } | |
1513 | |
1514 if(hdfsdm_filter->Init.InjectedParam.DmaMode == ENABLE) | |
1515 { | |
1516 hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_JDMAEN; | |
1517 } | |
1518 else | |
1519 { | |
1520 hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_JDMAEN); | |
1521 } | |
1522 | |
1523 /* Set filter parameters */ | |
1524 hdfsdm_filter->Instance->FLTFCR &= ~(DFSDM_FLTFCR_FORD | DFSDM_FLTFCR_FOSR | DFSDM_FLTFCR_IOSR); | |
1525 hdfsdm_filter->Instance->FLTFCR |= (hdfsdm_filter->Init.FilterParam.SincOrder | | |
1526 ((hdfsdm_filter->Init.FilterParam.Oversampling - 1U) << DFSDM_FLTFCR_FOSR_Pos) | | |
1527 (hdfsdm_filter->Init.FilterParam.IntOversampling - 1U)); | |
1528 | |
1529 /* Store regular and injected triggers and injected scan mode*/ | |
1530 hdfsdm_filter->RegularTrigger = hdfsdm_filter->Init.RegularParam.Trigger; | |
1531 hdfsdm_filter->InjectedTrigger = hdfsdm_filter->Init.InjectedParam.Trigger; | |
1532 hdfsdm_filter->ExtTriggerEdge = hdfsdm_filter->Init.InjectedParam.ExtTriggerEdge; | |
1533 hdfsdm_filter->InjectedScanMode = hdfsdm_filter->Init.InjectedParam.ScanMode; | |
1534 | |
1535 /* Enable DFSDM filter */ | |
1536 hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_DFEN; | |
1537 | |
1538 /* Set DFSDM filter to ready state */ | |
1539 hdfsdm_filter->State = HAL_DFSDM_FILTER_STATE_READY; | |
1540 | |
1541 return HAL_OK; | |
1542 } | |
1543 | |
1544 /** | |
1545 * @brief De-initializes the DFSDM filter. | |
1546 * @param hdfsdm_filter DFSDM filter handle. | |
1547 * @retval HAL status. | |
1548 */ | |
1549 HAL_StatusTypeDef HAL_DFSDM_FilterDeInit(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
1550 { | |
1551 /* Check DFSDM filter handle */ | |
1552 if(hdfsdm_filter == NULL) | |
1553 { | |
1554 return HAL_ERROR; | |
1555 } | |
1556 | |
1557 /* Check parameters */ | |
1558 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
1559 | |
1560 /* Disable the DFSDM filter */ | |
1561 hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_DFEN); | |
1562 | |
1563 /* Call MSP deinit function */ | |
1564 HAL_DFSDM_FilterMspDeInit(hdfsdm_filter); | |
1565 | |
1566 /* Set DFSDM filter in reset state */ | |
1567 hdfsdm_filter->State = HAL_DFSDM_FILTER_STATE_RESET; | |
1568 | |
1569 return HAL_OK; | |
1570 } | |
1571 | |
1572 /** | |
1573 * @brief Initializes the DFSDM filter MSP. | |
1574 * @param hdfsdm_filter DFSDM filter handle. | |
1575 * @retval None | |
1576 */ | |
1577 __weak void HAL_DFSDM_FilterMspInit(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
1578 { | |
1579 /* Prevent unused argument(s) compilation warning */ | |
1580 UNUSED(hdfsdm_filter); | |
1581 /* NOTE : This function should not be modified, when the function is needed, | |
1582 the HAL_DFSDM_FilterMspInit could be implemented in the user file. | |
1583 */ | |
1584 } | |
1585 | |
1586 /** | |
1587 * @brief De-initializes the DFSDM filter MSP. | |
1588 * @param hdfsdm_filter DFSDM filter handle. | |
1589 * @retval None | |
1590 */ | |
1591 __weak void HAL_DFSDM_FilterMspDeInit(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
1592 { | |
1593 /* Prevent unused argument(s) compilation warning */ | |
1594 UNUSED(hdfsdm_filter); | |
1595 /* NOTE : This function should not be modified, when the function is needed, | |
1596 the HAL_DFSDM_FilterMspDeInit could be implemented in the user file. | |
1597 */ | |
1598 } | |
1599 | |
1600 /** | |
1601 * @} | |
1602 */ | |
1603 | |
1604 /** @defgroup DFSDM_Exported_Functions_Group2_Filter Filter control functions | |
1605 * @brief Filter control functions | |
1606 * | |
1607 @verbatim | |
1608 ============================================================================== | |
1609 ##### Filter control functions ##### | |
1610 ============================================================================== | |
1611 [..] This section provides functions allowing to: | |
1612 (+) Select channel and enable/disable continuous mode for regular conversion. | |
1613 (+) Select channels for injected conversion. | |
1614 @endverbatim | |
1615 * @{ | |
1616 */ | |
1617 | |
1618 /** | |
1619 * @brief This function allows to select channel and to enable/disable | |
1620 * continuous mode for regular conversion. | |
1621 * @param hdfsdm_filter DFSDM filter handle. | |
1622 * @param Channel Channel for regular conversion. | |
1623 * This parameter can be a value of @ref DFSDM_Channel_Selection. | |
1624 * @param ContinuousMode Enable/disable continuous mode for regular conversion. | |
1625 * This parameter can be a value of @ref DFSDM_ContinuousMode. | |
1626 * @retval HAL status | |
1627 */ | |
1628 HAL_StatusTypeDef HAL_DFSDM_FilterConfigRegChannel(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, | |
1629 uint32_t Channel, | |
1630 uint32_t ContinuousMode) | |
1631 { | |
1632 HAL_StatusTypeDef status = HAL_OK; | |
1633 | |
1634 /* Check parameters */ | |
1635 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
1636 assert_param(IS_DFSDM_REGULAR_CHANNEL(Channel)); | |
1637 assert_param(IS_DFSDM_CONTINUOUS_MODE(ContinuousMode)); | |
1638 | |
1639 /* Check DFSDM filter state */ | |
1640 if((hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_RESET) && | |
1641 (hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_ERROR)) | |
1642 { | |
1643 /* Configure channel and continuous mode for regular conversion */ | |
1644 hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_RCH | DFSDM_FLTCR1_RCONT); | |
1645 if(ContinuousMode == DFSDM_CONTINUOUS_CONV_ON) | |
1646 { | |
1647 hdfsdm_filter->Instance->FLTCR1 |= (uint32_t) (((Channel & DFSDM_MSB_MASK) << DFSDM_FLTCR1_MSB_RCH_OFFSET) | | |
1648 DFSDM_FLTCR1_RCONT); | |
1649 } | |
1650 else | |
1651 { | |
1652 hdfsdm_filter->Instance->FLTCR1 |= (uint32_t) ((Channel & DFSDM_MSB_MASK) << DFSDM_FLTCR1_MSB_RCH_OFFSET); | |
1653 } | |
1654 /* Store continuous mode information */ | |
1655 hdfsdm_filter->RegularContMode = ContinuousMode; | |
1656 } | |
1657 else | |
1658 { | |
1659 status = HAL_ERROR; | |
1660 } | |
1661 | |
1662 /* Return function status */ | |
1663 return status; | |
1664 } | |
1665 | |
1666 /** | |
1667 * @brief This function allows to select channels for injected conversion. | |
1668 * @param hdfsdm_filter DFSDM filter handle. | |
1669 * @param Channel Channels for injected conversion. | |
1670 * This parameter can be a values combination of @ref DFSDM_Channel_Selection. | |
1671 * @retval HAL status | |
1672 */ | |
1673 HAL_StatusTypeDef HAL_DFSDM_FilterConfigInjChannel(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, | |
1674 uint32_t Channel) | |
1675 { | |
1676 HAL_StatusTypeDef status = HAL_OK; | |
1677 | |
1678 /* Check parameters */ | |
1679 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
1680 assert_param(IS_DFSDM_INJECTED_CHANNEL(Channel)); | |
1681 | |
1682 /* Check DFSDM filter state */ | |
1683 if((hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_RESET) && | |
1684 (hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_ERROR)) | |
1685 { | |
1686 /* Configure channel for injected conversion */ | |
1687 hdfsdm_filter->Instance->FLTJCHGR = (uint32_t) (Channel & DFSDM_LSB_MASK); | |
1688 /* Store number of injected channels */ | |
1689 hdfsdm_filter->InjectedChannelsNbr = DFSDM_GetInjChannelsNbr(Channel); | |
1690 /* Update number of injected channels remaining */ | |
1691 hdfsdm_filter->InjConvRemaining = (hdfsdm_filter->InjectedScanMode == ENABLE) ? \ | |
1692 hdfsdm_filter->InjectedChannelsNbr : 1U; | |
1693 } | |
1694 else | |
1695 { | |
1696 status = HAL_ERROR; | |
1697 } | |
1698 /* Return function status */ | |
1699 return status; | |
1700 } | |
1701 | |
1702 /** | |
1703 * @} | |
1704 */ | |
1705 | |
1706 /** @defgroup DFSDM_Exported_Functions_Group3_Filter Filter operation functions | |
1707 * @brief Filter operation functions | |
1708 * | |
1709 @verbatim | |
1710 ============================================================================== | |
1711 ##### Filter operation functions ##### | |
1712 ============================================================================== | |
1713 [..] This section provides functions allowing to: | |
1714 (+) Start conversion of regular/injected channel. | |
1715 (+) Poll for the end of regular/injected conversion. | |
1716 (+) Stop conversion of regular/injected channel. | |
1717 (+) Start conversion of regular/injected channel and enable interrupt. | |
1718 (+) Call the callback functions at the end of regular/injected conversions. | |
1719 (+) Stop conversion of regular/injected channel and disable interrupt. | |
1720 (+) Start conversion of regular/injected channel and enable DMA transfer. | |
1721 (+) Stop conversion of regular/injected channel and disable DMA transfer. | |
1722 (+) Start analog watchdog and enable interrupt. | |
1723 (+) Call the callback function when analog watchdog occurs. | |
1724 (+) Stop analog watchdog and disable interrupt. | |
1725 (+) Start extreme detector. | |
1726 (+) Stop extreme detector. | |
1727 (+) Get result of regular channel conversion. | |
1728 (+) Get result of injected channel conversion. | |
1729 (+) Get extreme detector maximum and minimum values. | |
1730 (+) Get conversion time. | |
1731 (+) Handle DFSDM interrupt request. | |
1732 @endverbatim | |
1733 * @{ | |
1734 */ | |
1735 | |
1736 /** | |
1737 * @brief This function allows to start regular conversion in polling mode. | |
1738 * @note This function should be called only when DFSDM filter instance is | |
1739 * in idle state or if injected conversion is ongoing. | |
1740 * @param hdfsdm_filter DFSDM filter handle. | |
1741 * @retval HAL status | |
1742 */ | |
1743 HAL_StatusTypeDef HAL_DFSDM_FilterRegularStart(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
1744 { | |
1745 HAL_StatusTypeDef status = HAL_OK; | |
1746 | |
1747 /* Check parameters */ | |
1748 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
1749 | |
1750 /* Check DFSDM filter state */ | |
1751 if((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_READY) || \ | |
1752 (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_INJ)) | |
1753 { | |
1754 /* Start regular conversion */ | |
1755 DFSDM_RegConvStart(hdfsdm_filter); | |
1756 } | |
1757 else | |
1758 { | |
1759 status = HAL_ERROR; | |
1760 } | |
1761 /* Return function status */ | |
1762 return status; | |
1763 } | |
1764 | |
1765 /** | |
1766 * @brief This function allows to poll for the end of regular conversion. | |
1767 * @note This function should be called only if regular conversion is ongoing. | |
1768 * @param hdfsdm_filter DFSDM filter handle. | |
1769 * @param Timeout Timeout value in milliseconds. | |
1770 * @retval HAL status | |
1771 */ | |
1772 HAL_StatusTypeDef HAL_DFSDM_FilterPollForRegConversion(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, | |
1773 uint32_t Timeout) | |
1774 { | |
1775 uint32_t tickstart; | |
1776 | |
1777 /* Check parameters */ | |
1778 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
1779 | |
1780 /* Check DFSDM filter state */ | |
1781 if((hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG) && \ | |
1782 (hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG_INJ)) | |
1783 { | |
1784 /* Return error status */ | |
1785 return HAL_ERROR; | |
1786 } | |
1787 else | |
1788 { | |
1789 /* Get timeout */ | |
1790 tickstart = HAL_GetTick(); | |
1791 | |
1792 /* Wait end of regular conversion */ | |
1793 while((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_REOCF) != DFSDM_FLTISR_REOCF) | |
1794 { | |
1795 /* Check the Timeout */ | |
1796 if(Timeout != HAL_MAX_DELAY) | |
1797 { | |
1798 if((Timeout == 0U) || ((HAL_GetTick()-tickstart) > Timeout)) | |
1799 { | |
1800 /* Return timeout status */ | |
1801 return HAL_TIMEOUT; | |
1802 } | |
1803 } | |
1804 } | |
1805 /* Check if overrun occurs */ | |
1806 if((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_ROVRF) == DFSDM_FLTISR_ROVRF) | |
1807 { | |
1808 /* Update error code and call error callback */ | |
1809 hdfsdm_filter->ErrorCode = DFSDM_FILTER_ERROR_REGULAR_OVERRUN; | |
1810 HAL_DFSDM_FilterErrorCallback(hdfsdm_filter); | |
1811 | |
1812 /* Clear regular overrun flag */ | |
1813 hdfsdm_filter->Instance->FLTICR = DFSDM_FLTICR_CLRROVRF; | |
1814 } | |
1815 /* Update DFSDM filter state only if not continuous conversion and SW trigger */ | |
1816 if((hdfsdm_filter->RegularContMode == DFSDM_CONTINUOUS_CONV_OFF) && \ | |
1817 (hdfsdm_filter->RegularTrigger == DFSDM_FILTER_SW_TRIGGER)) | |
1818 { | |
1819 hdfsdm_filter->State = (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_REG) ? \ | |
1820 HAL_DFSDM_FILTER_STATE_READY : HAL_DFSDM_FILTER_STATE_INJ; | |
1821 } | |
1822 /* Return function status */ | |
1823 return HAL_OK; | |
1824 } | |
1825 } | |
1826 | |
1827 /** | |
1828 * @brief This function allows to stop regular conversion in polling mode. | |
1829 * @note This function should be called only if regular conversion is ongoing. | |
1830 * @param hdfsdm_filter DFSDM filter handle. | |
1831 * @retval HAL status | |
1832 */ | |
1833 HAL_StatusTypeDef HAL_DFSDM_FilterRegularStop(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
1834 { | |
1835 HAL_StatusTypeDef status = HAL_OK; | |
1836 | |
1837 /* Check parameters */ | |
1838 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
1839 | |
1840 /* Check DFSDM filter state */ | |
1841 if((hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG) && \ | |
1842 (hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG_INJ)) | |
1843 { | |
1844 /* Return error status */ | |
1845 status = HAL_ERROR; | |
1846 } | |
1847 else | |
1848 { | |
1849 /* Stop regular conversion */ | |
1850 DFSDM_RegConvStop(hdfsdm_filter); | |
1851 } | |
1852 /* Return function status */ | |
1853 return status; | |
1854 } | |
1855 | |
1856 /** | |
1857 * @brief This function allows to start regular conversion in interrupt mode. | |
1858 * @note This function should be called only when DFSDM filter instance is | |
1859 * in idle state or if injected conversion is ongoing. | |
1860 * @param hdfsdm_filter DFSDM filter handle. | |
1861 * @retval HAL status | |
1862 */ | |
1863 HAL_StatusTypeDef HAL_DFSDM_FilterRegularStart_IT(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
1864 { | |
1865 HAL_StatusTypeDef status = HAL_OK; | |
1866 | |
1867 /* Check parameters */ | |
1868 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
1869 | |
1870 /* Check DFSDM filter state */ | |
1871 if((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_READY) || \ | |
1872 (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_INJ)) | |
1873 { | |
1874 /* Enable interrupts for regular conversions */ | |
1875 hdfsdm_filter->Instance->FLTCR2 |= (DFSDM_FLTCR2_REOCIE | DFSDM_FLTCR2_ROVRIE); | |
1876 | |
1877 /* Start regular conversion */ | |
1878 DFSDM_RegConvStart(hdfsdm_filter); | |
1879 } | |
1880 else | |
1881 { | |
1882 status = HAL_ERROR; | |
1883 } | |
1884 /* Return function status */ | |
1885 return status; | |
1886 } | |
1887 | |
1888 /** | |
1889 * @brief This function allows to stop regular conversion in interrupt mode. | |
1890 * @note This function should be called only if regular conversion is ongoing. | |
1891 * @param hdfsdm_filter DFSDM filter handle. | |
1892 * @retval HAL status | |
1893 */ | |
1894 HAL_StatusTypeDef HAL_DFSDM_FilterRegularStop_IT(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
1895 { | |
1896 HAL_StatusTypeDef status = HAL_OK; | |
1897 | |
1898 /* Check parameters */ | |
1899 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
1900 | |
1901 /* Check DFSDM filter state */ | |
1902 if((hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG) && \ | |
1903 (hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG_INJ)) | |
1904 { | |
1905 /* Return error status */ | |
1906 status = HAL_ERROR; | |
1907 } | |
1908 else | |
1909 { | |
1910 /* Disable interrupts for regular conversions */ | |
1911 hdfsdm_filter->Instance->FLTCR2 &= ~(DFSDM_FLTCR2_REOCIE | DFSDM_FLTCR2_ROVRIE); | |
1912 | |
1913 /* Stop regular conversion */ | |
1914 DFSDM_RegConvStop(hdfsdm_filter); | |
1915 } | |
1916 /* Return function status */ | |
1917 return status; | |
1918 } | |
1919 | |
1920 /** | |
1921 * @brief This function allows to start regular conversion in DMA mode. | |
1922 * @note This function should be called only when DFSDM filter instance is | |
1923 * in idle state or if injected conversion is ongoing. | |
1924 * Please note that data on buffer will contain signed regular conversion | |
1925 * value on 24 most significant bits and corresponding channel on 3 least | |
1926 * significant bits. | |
1927 * @param hdfsdm_filter DFSDM filter handle. | |
1928 * @param pData The destination buffer address. | |
1929 * @param Length The length of data to be transferred from DFSDM filter to memory. | |
1930 * @retval HAL status | |
1931 */ | |
1932 HAL_StatusTypeDef HAL_DFSDM_FilterRegularStart_DMA(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, | |
1933 int32_t *pData, | |
1934 uint32_t Length) | |
1935 { | |
1936 HAL_StatusTypeDef status = HAL_OK; | |
1937 | |
1938 /* Check parameters */ | |
1939 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
1940 | |
1941 /* Check destination address and length */ | |
1942 if((pData == NULL) || (Length == 0U)) | |
1943 { | |
1944 status = HAL_ERROR; | |
1945 } | |
1946 /* Check that DMA is enabled for regular conversion */ | |
1947 else if((hdfsdm_filter->Instance->FLTCR1 & DFSDM_FLTCR1_RDMAEN) != DFSDM_FLTCR1_RDMAEN) | |
1948 { | |
1949 status = HAL_ERROR; | |
1950 } | |
1951 /* Check parameters compatibility */ | |
1952 else if((hdfsdm_filter->RegularTrigger == DFSDM_FILTER_SW_TRIGGER) && \ | |
1953 (hdfsdm_filter->RegularContMode == DFSDM_CONTINUOUS_CONV_OFF) && \ | |
1954 (hdfsdm_filter->hdmaReg->Init.Mode == DMA_NORMAL) && \ | |
1955 (Length != 1U)) | |
1956 { | |
1957 status = HAL_ERROR; | |
1958 } | |
1959 else if((hdfsdm_filter->RegularTrigger == DFSDM_FILTER_SW_TRIGGER) && \ | |
1960 (hdfsdm_filter->RegularContMode == DFSDM_CONTINUOUS_CONV_OFF) && \ | |
1961 (hdfsdm_filter->hdmaReg->Init.Mode == DMA_CIRCULAR)) | |
1962 { | |
1963 status = HAL_ERROR; | |
1964 } | |
1965 /* Check DFSDM filter state */ | |
1966 else if((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_READY) || \ | |
1967 (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_INJ)) | |
1968 { | |
1969 /* Set callbacks on DMA handler */ | |
1970 hdfsdm_filter->hdmaReg->XferCpltCallback = DFSDM_DMARegularConvCplt; | |
1971 hdfsdm_filter->hdmaReg->XferErrorCallback = DFSDM_DMAError; | |
1972 hdfsdm_filter->hdmaReg->XferHalfCpltCallback = (hdfsdm_filter->hdmaReg->Init.Mode == DMA_CIRCULAR) ?\ | |
1973 DFSDM_DMARegularHalfConvCplt : NULL; | |
1974 | |
1975 /* Start DMA in interrupt mode */ | |
1976 if(HAL_DMA_Start_IT(hdfsdm_filter->hdmaReg, (uint32_t)&hdfsdm_filter->Instance->FLTRDATAR, \ | |
1977 (uint32_t) pData, Length) != HAL_OK) | |
1978 { | |
1979 /* Set DFSDM filter in error state */ | |
1980 hdfsdm_filter->State = HAL_DFSDM_FILTER_STATE_ERROR; | |
1981 status = HAL_ERROR; | |
1982 } | |
1983 else | |
1984 { | |
1985 /* Start regular conversion */ | |
1986 DFSDM_RegConvStart(hdfsdm_filter); | |
1987 } | |
1988 } | |
1989 else | |
1990 { | |
1991 status = HAL_ERROR; | |
1992 } | |
1993 /* Return function status */ | |
1994 return status; | |
1995 } | |
1996 | |
1997 /** | |
1998 * @brief This function allows to start regular conversion in DMA mode and to get | |
1999 * only the 16 most significant bits of conversion. | |
2000 * @note This function should be called only when DFSDM filter instance is | |
2001 * in idle state or if injected conversion is ongoing. | |
2002 * Please note that data on buffer will contain signed 16 most significant | |
2003 * bits of regular conversion. | |
2004 * @param hdfsdm_filter DFSDM filter handle. | |
2005 * @param pData The destination buffer address. | |
2006 * @param Length The length of data to be transferred from DFSDM filter to memory. | |
2007 * @retval HAL status | |
2008 */ | |
2009 HAL_StatusTypeDef HAL_DFSDM_FilterRegularMsbStart_DMA(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, | |
2010 int16_t *pData, | |
2011 uint32_t Length) | |
2012 { | |
2013 HAL_StatusTypeDef status = HAL_OK; | |
2014 | |
2015 /* Check parameters */ | |
2016 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
2017 | |
2018 /* Check destination address and length */ | |
2019 if((pData == NULL) || (Length == 0U)) | |
2020 { | |
2021 status = HAL_ERROR; | |
2022 } | |
2023 /* Check that DMA is enabled for regular conversion */ | |
2024 else if((hdfsdm_filter->Instance->FLTCR1 & DFSDM_FLTCR1_RDMAEN) != DFSDM_FLTCR1_RDMAEN) | |
2025 { | |
2026 status = HAL_ERROR; | |
2027 } | |
2028 /* Check parameters compatibility */ | |
2029 else if((hdfsdm_filter->RegularTrigger == DFSDM_FILTER_SW_TRIGGER) && \ | |
2030 (hdfsdm_filter->RegularContMode == DFSDM_CONTINUOUS_CONV_OFF) && \ | |
2031 (hdfsdm_filter->hdmaReg->Init.Mode == DMA_NORMAL) && \ | |
2032 (Length != 1U)) | |
2033 { | |
2034 status = HAL_ERROR; | |
2035 } | |
2036 else if((hdfsdm_filter->RegularTrigger == DFSDM_FILTER_SW_TRIGGER) && \ | |
2037 (hdfsdm_filter->RegularContMode == DFSDM_CONTINUOUS_CONV_OFF) && \ | |
2038 (hdfsdm_filter->hdmaReg->Init.Mode == DMA_CIRCULAR)) | |
2039 { | |
2040 status = HAL_ERROR; | |
2041 } | |
2042 /* Check DFSDM filter state */ | |
2043 else if((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_READY) || \ | |
2044 (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_INJ)) | |
2045 { | |
2046 /* Set callbacks on DMA handler */ | |
2047 hdfsdm_filter->hdmaReg->XferCpltCallback = DFSDM_DMARegularConvCplt; | |
2048 hdfsdm_filter->hdmaReg->XferErrorCallback = DFSDM_DMAError; | |
2049 hdfsdm_filter->hdmaReg->XferHalfCpltCallback = (hdfsdm_filter->hdmaReg->Init.Mode == DMA_CIRCULAR) ?\ | |
2050 DFSDM_DMARegularHalfConvCplt : NULL; | |
2051 | |
2052 /* Start DMA in interrupt mode */ | |
2053 if(HAL_DMA_Start_IT(hdfsdm_filter->hdmaReg, (uint32_t)(&hdfsdm_filter->Instance->FLTRDATAR) + 2U, \ | |
2054 (uint32_t) pData, Length) != HAL_OK) | |
2055 { | |
2056 /* Set DFSDM filter in error state */ | |
2057 hdfsdm_filter->State = HAL_DFSDM_FILTER_STATE_ERROR; | |
2058 status = HAL_ERROR; | |
2059 } | |
2060 else | |
2061 { | |
2062 /* Start regular conversion */ | |
2063 DFSDM_RegConvStart(hdfsdm_filter); | |
2064 } | |
2065 } | |
2066 else | |
2067 { | |
2068 status = HAL_ERROR; | |
2069 } | |
2070 /* Return function status */ | |
2071 return status; | |
2072 } | |
2073 | |
2074 /** | |
2075 * @brief This function allows to stop regular conversion in DMA mode. | |
2076 * @note This function should be called only if regular conversion is ongoing. | |
2077 * @param hdfsdm_filter DFSDM filter handle. | |
2078 * @retval HAL status | |
2079 */ | |
2080 HAL_StatusTypeDef HAL_DFSDM_FilterRegularStop_DMA(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
2081 { | |
2082 HAL_StatusTypeDef status = HAL_OK; | |
2083 | |
2084 /* Check parameters */ | |
2085 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
2086 | |
2087 /* Check DFSDM filter state */ | |
2088 if((hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG) && \ | |
2089 (hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG_INJ)) | |
2090 { | |
2091 /* Return error status */ | |
2092 status = HAL_ERROR; | |
2093 } | |
2094 else | |
2095 { | |
2096 /* Stop current DMA transfer */ | |
2097 if(HAL_DMA_Abort(hdfsdm_filter->hdmaReg) != HAL_OK) | |
2098 { | |
2099 /* Set DFSDM filter in error state */ | |
2100 hdfsdm_filter->State = HAL_DFSDM_FILTER_STATE_ERROR; | |
2101 status = HAL_ERROR; | |
2102 } | |
2103 else | |
2104 { | |
2105 /* Stop regular conversion */ | |
2106 DFSDM_RegConvStop(hdfsdm_filter); | |
2107 } | |
2108 } | |
2109 /* Return function status */ | |
2110 return status; | |
2111 } | |
2112 | |
2113 /** | |
2114 * @brief This function allows to get regular conversion value. | |
2115 * @param hdfsdm_filter DFSDM filter handle. | |
2116 * @param Channel Corresponding channel of regular conversion. | |
2117 * @retval Regular conversion value | |
2118 */ | |
2119 int32_t HAL_DFSDM_FilterGetRegularValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, | |
2120 uint32_t *Channel) | |
2121 { | |
2122 uint32_t reg = 0U; | |
2123 int32_t value = 0; | |
2124 | |
2125 /* Check parameters */ | |
2126 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
2127 assert_param(Channel != NULL); | |
2128 | |
2129 /* Get value of data register for regular channel */ | |
2130 reg = hdfsdm_filter->Instance->FLTRDATAR; | |
2131 | |
2132 /* Extract channel and regular conversion value */ | |
2133 *Channel = (reg & DFSDM_FLTRDATAR_RDATACH); | |
2134 value = ((int32_t)(reg & DFSDM_FLTRDATAR_RDATA) >> DFSDM_FLTRDATAR_RDATA_Pos); | |
2135 | |
2136 /* return regular conversion value */ | |
2137 return value; | |
2138 } | |
2139 | |
2140 /** | |
2141 * @brief This function allows to start injected conversion in polling mode. | |
2142 * @note This function should be called only when DFSDM filter instance is | |
2143 * in idle state or if regular conversion is ongoing. | |
2144 * @param hdfsdm_filter DFSDM filter handle. | |
2145 * @retval HAL status | |
2146 */ | |
2147 HAL_StatusTypeDef HAL_DFSDM_FilterInjectedStart(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
2148 { | |
2149 HAL_StatusTypeDef status = HAL_OK; | |
2150 | |
2151 /* Check parameters */ | |
2152 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
2153 | |
2154 /* Check DFSDM filter state */ | |
2155 if((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_READY) || \ | |
2156 (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_REG)) | |
2157 { | |
2158 /* Start injected conversion */ | |
2159 DFSDM_InjConvStart(hdfsdm_filter); | |
2160 } | |
2161 else | |
2162 { | |
2163 status = HAL_ERROR; | |
2164 } | |
2165 /* Return function status */ | |
2166 return status; | |
2167 } | |
2168 | |
2169 /** | |
2170 * @brief This function allows to poll for the end of injected conversion. | |
2171 * @note This function should be called only if injected conversion is ongoing. | |
2172 * @param hdfsdm_filter DFSDM filter handle. | |
2173 * @param Timeout Timeout value in milliseconds. | |
2174 * @retval HAL status | |
2175 */ | |
2176 HAL_StatusTypeDef HAL_DFSDM_FilterPollForInjConversion(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, | |
2177 uint32_t Timeout) | |
2178 { | |
2179 uint32_t tickstart; | |
2180 | |
2181 /* Check parameters */ | |
2182 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
2183 | |
2184 /* Check DFSDM filter state */ | |
2185 if((hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_INJ) && \ | |
2186 (hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG_INJ)) | |
2187 { | |
2188 /* Return error status */ | |
2189 return HAL_ERROR; | |
2190 } | |
2191 else | |
2192 { | |
2193 /* Get timeout */ | |
2194 tickstart = HAL_GetTick(); | |
2195 | |
2196 /* Wait end of injected conversions */ | |
2197 while((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_JEOCF) != DFSDM_FLTISR_JEOCF) | |
2198 { | |
2199 /* Check the Timeout */ | |
2200 if(Timeout != HAL_MAX_DELAY) | |
2201 { | |
2202 if((Timeout == 0U) || ((HAL_GetTick()-tickstart) > Timeout)) | |
2203 { | |
2204 /* Return timeout status */ | |
2205 return HAL_TIMEOUT; | |
2206 } | |
2207 } | |
2208 } | |
2209 /* Check if overrun occurs */ | |
2210 if((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_JOVRF) == DFSDM_FLTISR_JOVRF) | |
2211 { | |
2212 /* Update error code and call error callback */ | |
2213 hdfsdm_filter->ErrorCode = DFSDM_FILTER_ERROR_INJECTED_OVERRUN; | |
2214 HAL_DFSDM_FilterErrorCallback(hdfsdm_filter); | |
2215 | |
2216 /* Clear injected overrun flag */ | |
2217 hdfsdm_filter->Instance->FLTICR = DFSDM_FLTICR_CLRJOVRF; | |
2218 } | |
2219 | |
2220 /* Update remaining injected conversions */ | |
2221 hdfsdm_filter->InjConvRemaining--; | |
2222 if(hdfsdm_filter->InjConvRemaining == 0U) | |
2223 { | |
2224 /* Update DFSDM filter state only if trigger is software */ | |
2225 if(hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_SW_TRIGGER) | |
2226 { | |
2227 hdfsdm_filter->State = (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_INJ) ? \ | |
2228 HAL_DFSDM_FILTER_STATE_READY : HAL_DFSDM_FILTER_STATE_REG; | |
2229 } | |
2230 | |
2231 /* end of injected sequence, reset the value */ | |
2232 hdfsdm_filter->InjConvRemaining = (hdfsdm_filter->InjectedScanMode == ENABLE) ? \ | |
2233 hdfsdm_filter->InjectedChannelsNbr : 1U; | |
2234 } | |
2235 | |
2236 /* Return function status */ | |
2237 return HAL_OK; | |
2238 } | |
2239 } | |
2240 | |
2241 /** | |
2242 * @brief This function allows to stop injected conversion in polling mode. | |
2243 * @note This function should be called only if injected conversion is ongoing. | |
2244 * @param hdfsdm_filter DFSDM filter handle. | |
2245 * @retval HAL status | |
2246 */ | |
2247 HAL_StatusTypeDef HAL_DFSDM_FilterInjectedStop(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
2248 { | |
2249 HAL_StatusTypeDef status = HAL_OK; | |
2250 | |
2251 /* Check parameters */ | |
2252 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
2253 | |
2254 /* Check DFSDM filter state */ | |
2255 if((hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_INJ) && \ | |
2256 (hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG_INJ)) | |
2257 { | |
2258 /* Return error status */ | |
2259 status = HAL_ERROR; | |
2260 } | |
2261 else | |
2262 { | |
2263 /* Stop injected conversion */ | |
2264 DFSDM_InjConvStop(hdfsdm_filter); | |
2265 } | |
2266 /* Return function status */ | |
2267 return status; | |
2268 } | |
2269 | |
2270 /** | |
2271 * @brief This function allows to start injected conversion in interrupt mode. | |
2272 * @note This function should be called only when DFSDM filter instance is | |
2273 * in idle state or if regular conversion is ongoing. | |
2274 * @param hdfsdm_filter DFSDM filter handle. | |
2275 * @retval HAL status | |
2276 */ | |
2277 HAL_StatusTypeDef HAL_DFSDM_FilterInjectedStart_IT(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
2278 { | |
2279 HAL_StatusTypeDef status = HAL_OK; | |
2280 | |
2281 /* Check parameters */ | |
2282 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
2283 | |
2284 /* Check DFSDM filter state */ | |
2285 if((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_READY) || \ | |
2286 (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_REG)) | |
2287 { | |
2288 /* Enable interrupts for injected conversions */ | |
2289 hdfsdm_filter->Instance->FLTCR2 |= (DFSDM_FLTCR2_JEOCIE | DFSDM_FLTCR2_JOVRIE); | |
2290 | |
2291 /* Start injected conversion */ | |
2292 DFSDM_InjConvStart(hdfsdm_filter); | |
2293 } | |
2294 else | |
2295 { | |
2296 status = HAL_ERROR; | |
2297 } | |
2298 /* Return function status */ | |
2299 return status; | |
2300 } | |
2301 | |
2302 /** | |
2303 * @brief This function allows to stop injected conversion in interrupt mode. | |
2304 * @note This function should be called only if injected conversion is ongoing. | |
2305 * @param hdfsdm_filter DFSDM filter handle. | |
2306 * @retval HAL status | |
2307 */ | |
2308 HAL_StatusTypeDef HAL_DFSDM_FilterInjectedStop_IT(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
2309 { | |
2310 HAL_StatusTypeDef status = HAL_OK; | |
2311 | |
2312 /* Check parameters */ | |
2313 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
2314 | |
2315 /* Check DFSDM filter state */ | |
2316 if((hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_INJ) && \ | |
2317 (hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG_INJ)) | |
2318 { | |
2319 /* Return error status */ | |
2320 status = HAL_ERROR; | |
2321 } | |
2322 else | |
2323 { | |
2324 /* Disable interrupts for injected conversions */ | |
2325 hdfsdm_filter->Instance->FLTCR2 &= ~(DFSDM_FLTCR2_JEOCIE | DFSDM_FLTCR2_JOVRIE); | |
2326 | |
2327 /* Stop injected conversion */ | |
2328 DFSDM_InjConvStop(hdfsdm_filter); | |
2329 } | |
2330 /* Return function status */ | |
2331 return status; | |
2332 } | |
2333 | |
2334 /** | |
2335 * @brief This function allows to start injected conversion in DMA mode. | |
2336 * @note This function should be called only when DFSDM filter instance is | |
2337 * in idle state or if regular conversion is ongoing. | |
2338 * Please note that data on buffer will contain signed injected conversion | |
2339 * value on 24 most significant bits and corresponding channel on 3 least | |
2340 * significant bits. | |
2341 * @param hdfsdm_filter DFSDM filter handle. | |
2342 * @param pData The destination buffer address. | |
2343 * @param Length The length of data to be transferred from DFSDM filter to memory. | |
2344 * @retval HAL status | |
2345 */ | |
2346 HAL_StatusTypeDef HAL_DFSDM_FilterInjectedStart_DMA(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, | |
2347 int32_t *pData, | |
2348 uint32_t Length) | |
2349 { | |
2350 HAL_StatusTypeDef status = HAL_OK; | |
2351 | |
2352 /* Check parameters */ | |
2353 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
2354 | |
2355 /* Check destination address and length */ | |
2356 if((pData == NULL) || (Length == 0U)) | |
2357 { | |
2358 status = HAL_ERROR; | |
2359 } | |
2360 /* Check that DMA is enabled for injected conversion */ | |
2361 else if((hdfsdm_filter->Instance->FLTCR1 & DFSDM_FLTCR1_JDMAEN) != DFSDM_FLTCR1_JDMAEN) | |
2362 { | |
2363 status = HAL_ERROR; | |
2364 } | |
2365 /* Check parameters compatibility */ | |
2366 else if((hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_SW_TRIGGER) && \ | |
2367 (hdfsdm_filter->hdmaInj->Init.Mode == DMA_NORMAL) && \ | |
2368 (Length > hdfsdm_filter->InjConvRemaining)) | |
2369 { | |
2370 status = HAL_ERROR; | |
2371 } | |
2372 else if((hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_SW_TRIGGER) && \ | |
2373 (hdfsdm_filter->hdmaInj->Init.Mode == DMA_CIRCULAR)) | |
2374 { | |
2375 status = HAL_ERROR; | |
2376 } | |
2377 /* Check DFSDM filter state */ | |
2378 else if((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_READY) || \ | |
2379 (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_REG)) | |
2380 { | |
2381 /* Set callbacks on DMA handler */ | |
2382 hdfsdm_filter->hdmaInj->XferCpltCallback = DFSDM_DMAInjectedConvCplt; | |
2383 hdfsdm_filter->hdmaInj->XferErrorCallback = DFSDM_DMAError; | |
2384 hdfsdm_filter->hdmaInj->XferHalfCpltCallback = (hdfsdm_filter->hdmaInj->Init.Mode == DMA_CIRCULAR) ?\ | |
2385 DFSDM_DMAInjectedHalfConvCplt : NULL; | |
2386 | |
2387 /* Start DMA in interrupt mode */ | |
2388 if(HAL_DMA_Start_IT(hdfsdm_filter->hdmaInj, (uint32_t)&hdfsdm_filter->Instance->FLTJDATAR, \ | |
2389 (uint32_t) pData, Length) != HAL_OK) | |
2390 { | |
2391 /* Set DFSDM filter in error state */ | |
2392 hdfsdm_filter->State = HAL_DFSDM_FILTER_STATE_ERROR; | |
2393 status = HAL_ERROR; | |
2394 } | |
2395 else | |
2396 { | |
2397 /* Start injected conversion */ | |
2398 DFSDM_InjConvStart(hdfsdm_filter); | |
2399 } | |
2400 } | |
2401 else | |
2402 { | |
2403 status = HAL_ERROR; | |
2404 } | |
2405 /* Return function status */ | |
2406 return status; | |
2407 } | |
2408 | |
2409 /** | |
2410 * @brief This function allows to start injected conversion in DMA mode and to get | |
2411 * only the 16 most significant bits of conversion. | |
2412 * @note This function should be called only when DFSDM filter instance is | |
2413 * in idle state or if regular conversion is ongoing. | |
2414 * Please note that data on buffer will contain signed 16 most significant | |
2415 * bits of injected conversion. | |
2416 * @param hdfsdm_filter DFSDM filter handle. | |
2417 * @param pData The destination buffer address. | |
2418 * @param Length The length of data to be transferred from DFSDM filter to memory. | |
2419 * @retval HAL status | |
2420 */ | |
2421 HAL_StatusTypeDef HAL_DFSDM_FilterInjectedMsbStart_DMA(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, | |
2422 int16_t *pData, | |
2423 uint32_t Length) | |
2424 { | |
2425 HAL_StatusTypeDef status = HAL_OK; | |
2426 | |
2427 /* Check parameters */ | |
2428 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
2429 | |
2430 /* Check destination address and length */ | |
2431 if((pData == NULL) || (Length == 0U)) | |
2432 { | |
2433 status = HAL_ERROR; | |
2434 } | |
2435 /* Check that DMA is enabled for injected conversion */ | |
2436 else if((hdfsdm_filter->Instance->FLTCR1 & DFSDM_FLTCR1_JDMAEN) != DFSDM_FLTCR1_JDMAEN) | |
2437 { | |
2438 status = HAL_ERROR; | |
2439 } | |
2440 /* Check parameters compatibility */ | |
2441 else if((hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_SW_TRIGGER) && \ | |
2442 (hdfsdm_filter->hdmaInj->Init.Mode == DMA_NORMAL) && \ | |
2443 (Length > hdfsdm_filter->InjConvRemaining)) | |
2444 { | |
2445 status = HAL_ERROR; | |
2446 } | |
2447 else if((hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_SW_TRIGGER) && \ | |
2448 (hdfsdm_filter->hdmaInj->Init.Mode == DMA_CIRCULAR)) | |
2449 { | |
2450 status = HAL_ERROR; | |
2451 } | |
2452 /* Check DFSDM filter state */ | |
2453 else if((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_READY) || \ | |
2454 (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_REG)) | |
2455 { | |
2456 /* Set callbacks on DMA handler */ | |
2457 hdfsdm_filter->hdmaInj->XferCpltCallback = DFSDM_DMAInjectedConvCplt; | |
2458 hdfsdm_filter->hdmaInj->XferErrorCallback = DFSDM_DMAError; | |
2459 hdfsdm_filter->hdmaInj->XferHalfCpltCallback = (hdfsdm_filter->hdmaInj->Init.Mode == DMA_CIRCULAR) ?\ | |
2460 DFSDM_DMAInjectedHalfConvCplt : NULL; | |
2461 | |
2462 /* Start DMA in interrupt mode */ | |
2463 if(HAL_DMA_Start_IT(hdfsdm_filter->hdmaInj, (uint32_t)(&hdfsdm_filter->Instance->FLTJDATAR) + 2U, \ | |
2464 (uint32_t) pData, Length) != HAL_OK) | |
2465 { | |
2466 /* Set DFSDM filter in error state */ | |
2467 hdfsdm_filter->State = HAL_DFSDM_FILTER_STATE_ERROR; | |
2468 status = HAL_ERROR; | |
2469 } | |
2470 else | |
2471 { | |
2472 /* Start injected conversion */ | |
2473 DFSDM_InjConvStart(hdfsdm_filter); | |
2474 } | |
2475 } | |
2476 else | |
2477 { | |
2478 status = HAL_ERROR; | |
2479 } | |
2480 /* Return function status */ | |
2481 return status; | |
2482 } | |
2483 | |
2484 /** | |
2485 * @brief This function allows to stop injected conversion in DMA mode. | |
2486 * @note This function should be called only if injected conversion is ongoing. | |
2487 * @param hdfsdm_filter DFSDM filter handle. | |
2488 * @retval HAL status | |
2489 */ | |
2490 HAL_StatusTypeDef HAL_DFSDM_FilterInjectedStop_DMA(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
2491 { | |
2492 HAL_StatusTypeDef status = HAL_OK; | |
2493 | |
2494 /* Check parameters */ | |
2495 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
2496 | |
2497 /* Check DFSDM filter state */ | |
2498 if((hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_INJ) && \ | |
2499 (hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG_INJ)) | |
2500 { | |
2501 /* Return error status */ | |
2502 status = HAL_ERROR; | |
2503 } | |
2504 else | |
2505 { | |
2506 /* Stop current DMA transfer */ | |
2507 if(HAL_DMA_Abort(hdfsdm_filter->hdmaInj) != HAL_OK) | |
2508 { | |
2509 /* Set DFSDM filter in error state */ | |
2510 hdfsdm_filter->State = HAL_DFSDM_FILTER_STATE_ERROR; | |
2511 status = HAL_ERROR; | |
2512 } | |
2513 else | |
2514 { | |
2515 /* Stop regular conversion */ | |
2516 DFSDM_InjConvStop(hdfsdm_filter); | |
2517 } | |
2518 } | |
2519 /* Return function status */ | |
2520 return status; | |
2521 } | |
2522 | |
2523 /** | |
2524 * @brief This function allows to get injected conversion value. | |
2525 * @param hdfsdm_filter DFSDM filter handle. | |
2526 * @param Channel Corresponding channel of injected conversion. | |
2527 * @retval Injected conversion value | |
2528 */ | |
2529 int32_t HAL_DFSDM_FilterGetInjectedValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, | |
2530 uint32_t *Channel) | |
2531 { | |
2532 uint32_t reg = 0U; | |
2533 int32_t value = 0; | |
2534 | |
2535 /* Check parameters */ | |
2536 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
2537 assert_param(Channel != NULL); | |
2538 | |
2539 /* Get value of data register for injected channel */ | |
2540 reg = hdfsdm_filter->Instance->FLTJDATAR; | |
2541 | |
2542 /* Extract channel and injected conversion value */ | |
2543 *Channel = (reg & DFSDM_FLTJDATAR_JDATACH); | |
2544 value = ((int32_t)(reg & DFSDM_FLTJDATAR_JDATA) >> DFSDM_FLTJDATAR_JDATA_Pos); | |
2545 | |
2546 /* return regular conversion value */ | |
2547 return value; | |
2548 } | |
2549 | |
2550 /** | |
2551 * @brief This function allows to start filter analog watchdog in interrupt mode. | |
2552 * @param hdfsdm_filter DFSDM filter handle. | |
2553 * @param awdParam DFSDM filter analog watchdog parameters. | |
2554 * @retval HAL status | |
2555 */ | |
2556 HAL_StatusTypeDef HAL_DFSDM_FilterAwdStart_IT(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, | |
2557 DFSDM_Filter_AwdParamTypeDef *awdParam) | |
2558 { | |
2559 HAL_StatusTypeDef status = HAL_OK; | |
2560 | |
2561 /* Check parameters */ | |
2562 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
2563 assert_param(IS_DFSDM_FILTER_AWD_DATA_SOURCE(awdParam->DataSource)); | |
2564 assert_param(IS_DFSDM_INJECTED_CHANNEL(awdParam->Channel)); | |
2565 assert_param(IS_DFSDM_FILTER_AWD_THRESHOLD(awdParam->HighThreshold)); | |
2566 assert_param(IS_DFSDM_FILTER_AWD_THRESHOLD(awdParam->LowThreshold)); | |
2567 assert_param(IS_DFSDM_BREAK_SIGNALS(awdParam->HighBreakSignal)); | |
2568 assert_param(IS_DFSDM_BREAK_SIGNALS(awdParam->LowBreakSignal)); | |
2569 | |
2570 /* Check DFSDM filter state */ | |
2571 if((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_RESET) || \ | |
2572 (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_ERROR)) | |
2573 { | |
2574 /* Return error status */ | |
2575 status = HAL_ERROR; | |
2576 } | |
2577 else | |
2578 { | |
2579 /* Set analog watchdog data source */ | |
2580 hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_AWFSEL); | |
2581 hdfsdm_filter->Instance->FLTCR1 |= awdParam->DataSource; | |
2582 | |
2583 /* Set thresholds and break signals */ | |
2584 hdfsdm_filter->Instance->FLTAWHTR &= ~(DFSDM_FLTAWHTR_AWHT | DFSDM_FLTAWHTR_BKAWH); | |
2585 hdfsdm_filter->Instance->FLTAWHTR |= (((uint32_t) awdParam->HighThreshold << DFSDM_FLTAWHTR_AWHT_Pos) | \ | |
2586 awdParam->HighBreakSignal); | |
2587 hdfsdm_filter->Instance->FLTAWLTR &= ~(DFSDM_FLTAWLTR_AWLT | DFSDM_FLTAWLTR_BKAWL); | |
2588 hdfsdm_filter->Instance->FLTAWLTR |= (((uint32_t) awdParam->LowThreshold << DFSDM_FLTAWLTR_AWLT_Pos) | \ | |
2589 awdParam->LowBreakSignal); | |
2590 | |
2591 /* Set channels and interrupt for analog watchdog */ | |
2592 hdfsdm_filter->Instance->FLTCR2 &= ~(DFSDM_FLTCR2_AWDCH); | |
2593 hdfsdm_filter->Instance->FLTCR2 |= (((awdParam->Channel & DFSDM_LSB_MASK) << DFSDM_FLTCR2_AWDCH_Pos) | \ | |
2594 DFSDM_FLTCR2_AWDIE); | |
2595 } | |
2596 /* Return function status */ | |
2597 return status; | |
2598 } | |
2599 | |
2600 /** | |
2601 * @brief This function allows to stop filter analog watchdog in interrupt mode. | |
2602 * @param hdfsdm_filter DFSDM filter handle. | |
2603 * @retval HAL status | |
2604 */ | |
2605 HAL_StatusTypeDef HAL_DFSDM_FilterAwdStop_IT(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
2606 { | |
2607 HAL_StatusTypeDef status = HAL_OK; | |
2608 | |
2609 /* Check parameters */ | |
2610 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
2611 | |
2612 /* Check DFSDM filter state */ | |
2613 if((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_RESET) || \ | |
2614 (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_ERROR)) | |
2615 { | |
2616 /* Return error status */ | |
2617 status = HAL_ERROR; | |
2618 } | |
2619 else | |
2620 { | |
2621 /* Reset channels for analog watchdog and deactivate interrupt */ | |
2622 hdfsdm_filter->Instance->FLTCR2 &= ~(DFSDM_FLTCR2_AWDCH | DFSDM_FLTCR2_AWDIE); | |
2623 | |
2624 /* Clear all analog watchdog flags */ | |
2625 hdfsdm_filter->Instance->FLTAWCFR = (DFSDM_FLTAWCFR_CLRAWHTF | DFSDM_FLTAWCFR_CLRAWLTF); | |
2626 | |
2627 /* Reset thresholds and break signals */ | |
2628 hdfsdm_filter->Instance->FLTAWHTR &= ~(DFSDM_FLTAWHTR_AWHT | DFSDM_FLTAWHTR_BKAWH); | |
2629 hdfsdm_filter->Instance->FLTAWLTR &= ~(DFSDM_FLTAWLTR_AWLT | DFSDM_FLTAWLTR_BKAWL); | |
2630 | |
2631 /* Reset analog watchdog data source */ | |
2632 hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_AWFSEL); | |
2633 } | |
2634 /* Return function status */ | |
2635 return status; | |
2636 } | |
2637 | |
2638 /** | |
2639 * @brief This function allows to start extreme detector feature. | |
2640 * @param hdfsdm_filter DFSDM filter handle. | |
2641 * @param Channel Channels where extreme detector is enabled. | |
2642 * This parameter can be a values combination of @ref DFSDM_Channel_Selection. | |
2643 * @retval HAL status | |
2644 */ | |
2645 HAL_StatusTypeDef HAL_DFSDM_FilterExdStart(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, | |
2646 uint32_t Channel) | |
2647 { | |
2648 HAL_StatusTypeDef status = HAL_OK; | |
2649 | |
2650 /* Check parameters */ | |
2651 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
2652 assert_param(IS_DFSDM_INJECTED_CHANNEL(Channel)); | |
2653 | |
2654 /* Check DFSDM filter state */ | |
2655 if((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_RESET) || \ | |
2656 (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_ERROR)) | |
2657 { | |
2658 /* Return error status */ | |
2659 status = HAL_ERROR; | |
2660 } | |
2661 else | |
2662 { | |
2663 /* Set channels for extreme detector */ | |
2664 hdfsdm_filter->Instance->FLTCR2 &= ~(DFSDM_FLTCR2_EXCH); | |
2665 hdfsdm_filter->Instance->FLTCR2 |= ((Channel & DFSDM_LSB_MASK) << DFSDM_FLTCR2_EXCH_Pos); | |
2666 } | |
2667 /* Return function status */ | |
2668 return status; | |
2669 } | |
2670 | |
2671 /** | |
2672 * @brief This function allows to stop extreme detector feature. | |
2673 * @param hdfsdm_filter DFSDM filter handle. | |
2674 * @retval HAL status | |
2675 */ | |
2676 HAL_StatusTypeDef HAL_DFSDM_FilterExdStop(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
2677 { | |
2678 HAL_StatusTypeDef status = HAL_OK; | |
2679 __IO uint32_t reg1; | |
2680 __IO uint32_t reg2; | |
2681 | |
2682 /* Check parameters */ | |
2683 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
2684 | |
2685 /* Check DFSDM filter state */ | |
2686 if((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_RESET) || \ | |
2687 (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_ERROR)) | |
2688 { | |
2689 /* Return error status */ | |
2690 status = HAL_ERROR; | |
2691 } | |
2692 else | |
2693 { | |
2694 /* Reset channels for extreme detector */ | |
2695 hdfsdm_filter->Instance->FLTCR2 &= ~(DFSDM_FLTCR2_EXCH); | |
2696 | |
2697 /* Clear extreme detector values */ | |
2698 reg1 = hdfsdm_filter->Instance->FLTEXMAX; | |
2699 reg2 = hdfsdm_filter->Instance->FLTEXMIN; | |
2700 UNUSED(reg1); /* To avoid GCC warning */ | |
2701 UNUSED(reg2); /* To avoid GCC warning */ | |
2702 } | |
2703 /* Return function status */ | |
2704 return status; | |
2705 } | |
2706 | |
2707 /** | |
2708 * @brief This function allows to get extreme detector maximum value. | |
2709 * @param hdfsdm_filter DFSDM filter handle. | |
2710 * @param Channel Corresponding channel. | |
2711 * @retval Extreme detector maximum value | |
2712 * This value is between Min_Data = -8388608 and Max_Data = 8388607. | |
2713 */ | |
2714 int32_t HAL_DFSDM_FilterGetExdMaxValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, | |
2715 uint32_t *Channel) | |
2716 { | |
2717 uint32_t reg = 0U; | |
2718 int32_t value = 0; | |
2719 | |
2720 /* Check parameters */ | |
2721 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
2722 assert_param(Channel != NULL); | |
2723 | |
2724 /* Get value of extreme detector maximum register */ | |
2725 reg = hdfsdm_filter->Instance->FLTEXMAX; | |
2726 | |
2727 /* Extract channel and extreme detector maximum value */ | |
2728 *Channel = (reg & DFSDM_FLTEXMAX_EXMAXCH); | |
2729 value = ((int32_t)(reg & DFSDM_FLTEXMAX_EXMAX) >> DFSDM_FLTEXMAX_EXMAX_Pos); | |
2730 | |
2731 /* return extreme detector maximum value */ | |
2732 return value; | |
2733 } | |
2734 | |
2735 /** | |
2736 * @brief This function allows to get extreme detector minimum value. | |
2737 * @param hdfsdm_filter DFSDM filter handle. | |
2738 * @param Channel Corresponding channel. | |
2739 * @retval Extreme detector minimum value | |
2740 * This value is between Min_Data = -8388608 and Max_Data = 8388607. | |
2741 */ | |
2742 int32_t HAL_DFSDM_FilterGetExdMinValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, | |
2743 uint32_t *Channel) | |
2744 { | |
2745 uint32_t reg = 0U; | |
2746 int32_t value = 0; | |
2747 | |
2748 /* Check parameters */ | |
2749 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
2750 assert_param(Channel != NULL); | |
2751 | |
2752 /* Get value of extreme detector minimum register */ | |
2753 reg = hdfsdm_filter->Instance->FLTEXMIN; | |
2754 | |
2755 /* Extract channel and extreme detector minimum value */ | |
2756 *Channel = (reg & DFSDM_FLTEXMIN_EXMINCH); | |
2757 value = ((int32_t)(reg & DFSDM_FLTEXMIN_EXMIN) >> DFSDM_FLTEXMIN_EXMIN_Pos); | |
2758 | |
2759 /* return extreme detector minimum value */ | |
2760 return value; | |
2761 } | |
2762 | |
2763 /** | |
2764 * @brief This function allows to get conversion time value. | |
2765 * @param hdfsdm_filter DFSDM filter handle. | |
2766 * @retval Conversion time value | |
2767 * @note To get time in second, this value has to be divided by DFSDM clock frequency. | |
2768 */ | |
2769 uint32_t HAL_DFSDM_FilterGetConvTimeValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
2770 { | |
2771 uint32_t reg = 0U; | |
2772 uint32_t value = 0U; | |
2773 | |
2774 /* Check parameters */ | |
2775 assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); | |
2776 | |
2777 /* Get value of conversion timer register */ | |
2778 reg = hdfsdm_filter->Instance->FLTCNVTIMR; | |
2779 | |
2780 /* Extract conversion time value */ | |
2781 value = ((reg & DFSDM_FLTCNVTIMR_CNVCNT) >> DFSDM_FLTCNVTIMR_CNVCNT_Pos); | |
2782 | |
2783 /* return extreme detector minimum value */ | |
2784 return value; | |
2785 } | |
2786 | |
2787 /** | |
2788 * @brief This function handles the DFSDM interrupts. | |
2789 * @param hdfsdm_filter DFSDM filter handle. | |
2790 * @retval None | |
2791 */ | |
2792 void HAL_DFSDM_IRQHandler(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
2793 { | |
2794 /* Check if overrun occurs during regular conversion */ | |
2795 if(((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_ROVRF) != 0U) && \ | |
2796 ((hdfsdm_filter->Instance->FLTCR2 & DFSDM_FLTCR2_ROVRIE) != 0U)) | |
2797 { | |
2798 /* Clear regular overrun flag */ | |
2799 hdfsdm_filter->Instance->FLTICR = DFSDM_FLTICR_CLRROVRF; | |
2800 | |
2801 /* Update error code */ | |
2802 hdfsdm_filter->ErrorCode = DFSDM_FILTER_ERROR_REGULAR_OVERRUN; | |
2803 | |
2804 /* Call error callback */ | |
2805 HAL_DFSDM_FilterErrorCallback(hdfsdm_filter); | |
2806 } | |
2807 /* Check if overrun occurs during injected conversion */ | |
2808 else if(((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_JOVRF) != 0U) && \ | |
2809 ((hdfsdm_filter->Instance->FLTCR2 & DFSDM_FLTCR2_JOVRIE) != 0U)) | |
2810 { | |
2811 /* Clear injected overrun flag */ | |
2812 hdfsdm_filter->Instance->FLTICR = DFSDM_FLTICR_CLRJOVRF; | |
2813 | |
2814 /* Update error code */ | |
2815 hdfsdm_filter->ErrorCode = DFSDM_FILTER_ERROR_INJECTED_OVERRUN; | |
2816 | |
2817 /* Call error callback */ | |
2818 HAL_DFSDM_FilterErrorCallback(hdfsdm_filter); | |
2819 } | |
2820 /* Check if end of regular conversion */ | |
2821 else if(((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_REOCF) != 0U) && \ | |
2822 ((hdfsdm_filter->Instance->FLTCR2 & DFSDM_FLTCR2_REOCIE) != 0U)) | |
2823 { | |
2824 /* Call regular conversion complete callback */ | |
2825 HAL_DFSDM_FilterRegConvCpltCallback(hdfsdm_filter); | |
2826 | |
2827 /* End of conversion if mode is not continuous and software trigger */ | |
2828 if((hdfsdm_filter->RegularContMode == DFSDM_CONTINUOUS_CONV_OFF) && \ | |
2829 (hdfsdm_filter->RegularTrigger == DFSDM_FILTER_SW_TRIGGER)) | |
2830 { | |
2831 /* Disable interrupts for regular conversions */ | |
2832 hdfsdm_filter->Instance->FLTCR2 &= ~(DFSDM_FLTCR2_REOCIE); | |
2833 | |
2834 /* Update DFSDM filter state */ | |
2835 hdfsdm_filter->State = (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_REG) ? \ | |
2836 HAL_DFSDM_FILTER_STATE_READY : HAL_DFSDM_FILTER_STATE_INJ; | |
2837 } | |
2838 } | |
2839 /* Check if end of injected conversion */ | |
2840 else if(((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_JEOCF) != 0U) && \ | |
2841 ((hdfsdm_filter->Instance->FLTCR2 & DFSDM_FLTCR2_JEOCIE) != 0U)) | |
2842 { | |
2843 /* Call injected conversion complete callback */ | |
2844 HAL_DFSDM_FilterInjConvCpltCallback(hdfsdm_filter); | |
2845 | |
2846 /* Update remaining injected conversions */ | |
2847 hdfsdm_filter->InjConvRemaining--; | |
2848 if(hdfsdm_filter->InjConvRemaining == 0U) | |
2849 { | |
2850 /* End of conversion if trigger is software */ | |
2851 if(hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_SW_TRIGGER) | |
2852 { | |
2853 /* Disable interrupts for injected conversions */ | |
2854 hdfsdm_filter->Instance->FLTCR2 &= ~(DFSDM_FLTCR2_JEOCIE); | |
2855 | |
2856 /* Update DFSDM filter state */ | |
2857 hdfsdm_filter->State = (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_INJ) ? \ | |
2858 HAL_DFSDM_FILTER_STATE_READY : HAL_DFSDM_FILTER_STATE_REG; | |
2859 } | |
2860 /* end of injected sequence, reset the value */ | |
2861 hdfsdm_filter->InjConvRemaining = (hdfsdm_filter->InjectedScanMode == ENABLE) ? \ | |
2862 hdfsdm_filter->InjectedChannelsNbr : 1U; | |
2863 } | |
2864 } | |
2865 /* Check if analog watchdog occurs */ | |
2866 else if(((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_AWDF) != 0U) && \ | |
2867 ((hdfsdm_filter->Instance->FLTCR2 & DFSDM_FLTCR2_AWDIE) != 0U)) | |
2868 { | |
2869 uint32_t reg = 0U; | |
2870 uint32_t threshold = 0U; | |
2871 uint32_t channel = 0U; | |
2872 | |
2873 /* Get channel and threshold */ | |
2874 reg = hdfsdm_filter->Instance->FLTAWSR; | |
2875 threshold = ((reg & DFSDM_FLTAWSR_AWLTF) != 0U) ? DFSDM_AWD_LOW_THRESHOLD : DFSDM_AWD_HIGH_THRESHOLD; | |
2876 if(threshold == DFSDM_AWD_HIGH_THRESHOLD) | |
2877 { | |
2878 reg = reg >> DFSDM_FLTAWSR_AWHTF_Pos; | |
2879 } | |
2880 while((reg & 1U) == 0U) | |
2881 { | |
2882 channel++; | |
2883 reg = reg >> 1U; | |
2884 } | |
2885 /* Clear analog watchdog flag */ | |
2886 hdfsdm_filter->Instance->FLTAWCFR = (threshold == DFSDM_AWD_HIGH_THRESHOLD) ? \ | |
2887 (1U << (DFSDM_FLTAWSR_AWHTF_Pos + channel)) : \ | |
2888 (1U << channel); | |
2889 | |
2890 /* Call analog watchdog callback */ | |
2891 HAL_DFSDM_FilterAwdCallback(hdfsdm_filter, channel, threshold); | |
2892 } | |
2893 /* Check if clock absence occurs */ | |
2894 else if((hdfsdm_filter->Instance == DFSDM1_Filter0) && \ | |
2895 ((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_CKABF) != 0U) && \ | |
2896 ((hdfsdm_filter->Instance->FLTCR2 & DFSDM_FLTCR2_CKABIE) != 0U)) | |
2897 { | |
2898 uint32_t reg = 0U; | |
2899 uint32_t channel = 0U; | |
2900 | |
2901 reg = ((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_CKABF) >> DFSDM_FLTISR_CKABF_Pos); | |
2902 | |
2903 while(channel < DFSDM1_CHANNEL_NUMBER) | |
2904 { | |
2905 /* Check if flag is set and corresponding channel is enabled */ | |
2906 if(((reg & 1U) != 0U) && (a_dfsdm1ChannelHandle[channel] != NULL)) | |
2907 { | |
2908 /* Check clock absence has been enabled for this channel */ | |
2909 if((a_dfsdm1ChannelHandle[channel]->Instance->CHCFGR1 & DFSDM_CHCFGR1_CKABEN) != 0U) | |
2910 { | |
2911 /* Clear clock absence flag */ | |
2912 hdfsdm_filter->Instance->FLTICR = (1U << (DFSDM_FLTICR_CLRCKABF_Pos + channel)); | |
2913 | |
2914 /* Call clock absence callback */ | |
2915 HAL_DFSDM_ChannelCkabCallback(a_dfsdm1ChannelHandle[channel]); | |
2916 } | |
2917 } | |
2918 channel++; | |
2919 reg = reg >> 1U; | |
2920 } | |
2921 } | |
2922 #if defined (DFSDM2_Channel0) | |
2923 /* Check if clock absence occurs */ | |
2924 else if((hdfsdm_filter->Instance == DFSDM2_Filter0) && \ | |
2925 ((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_CKABF) != 0U) && \ | |
2926 ((hdfsdm_filter->Instance->FLTCR2 & DFSDM_FLTCR2_CKABIE) != 0U)) | |
2927 { | |
2928 uint32_t reg = 0U; | |
2929 uint32_t channel = 0U; | |
2930 | |
2931 reg = ((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_CKABF) >> DFSDM_FLTISR_CKABF_Pos); | |
2932 | |
2933 while(channel < DFSDM2_CHANNEL_NUMBER) | |
2934 { | |
2935 /* Check if flag is set and corresponding channel is enabled */ | |
2936 if(((reg & 1U) != 0U) && (a_dfsdm2ChannelHandle[channel] != NULL)) | |
2937 { | |
2938 /* Check clock absence has been enabled for this channel */ | |
2939 if((a_dfsdm2ChannelHandle[channel]->Instance->CHCFGR1 & DFSDM_CHCFGR1_CKABEN) != 0U) | |
2940 { | |
2941 /* Clear clock absence flag */ | |
2942 hdfsdm_filter->Instance->FLTICR = (1U << (DFSDM_FLTICR_CLRCKABF_Pos + channel)); | |
2943 | |
2944 /* Call clock absence callback */ | |
2945 HAL_DFSDM_ChannelCkabCallback(a_dfsdm2ChannelHandle[channel]); | |
2946 } | |
2947 } | |
2948 channel++; | |
2949 reg = reg >> 1U; | |
2950 } | |
2951 } | |
2952 #endif /* DFSDM2_Channel0 */ | |
2953 /* Check if short circuit detection occurs */ | |
2954 else if((hdfsdm_filter->Instance == DFSDM1_Filter0) && \ | |
2955 ((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_SCDF) != 0U) && \ | |
2956 ((hdfsdm_filter->Instance->FLTCR2 & DFSDM_FLTCR2_SCDIE) != 0U)) | |
2957 { | |
2958 uint32_t reg = 0U; | |
2959 uint32_t channel = 0U; | |
2960 | |
2961 /* Get channel */ | |
2962 reg = ((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_SCDF) >> DFSDM_FLTISR_SCDF_Pos); | |
2963 while((reg & 1U) == 0U) | |
2964 { | |
2965 channel++; | |
2966 reg = reg >> 1U; | |
2967 } | |
2968 | |
2969 /* Clear short circuit detection flag */ | |
2970 hdfsdm_filter->Instance->FLTICR = (1U << (DFSDM_FLTICR_CLRSCSDF_Pos + channel)); | |
2971 | |
2972 /* Call short circuit detection callback */ | |
2973 HAL_DFSDM_ChannelScdCallback(a_dfsdm1ChannelHandle[channel]); | |
2974 } | |
2975 #if defined (DFSDM2_Channel0) | |
2976 /* Check if short circuit detection occurs */ | |
2977 else if((hdfsdm_filter->Instance == DFSDM2_Filter0) && \ | |
2978 ((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_SCDF) != 0U) && \ | |
2979 ((hdfsdm_filter->Instance->FLTCR2 & DFSDM_FLTCR2_SCDIE) != 0U)) | |
2980 { | |
2981 uint32_t reg = 0U; | |
2982 uint32_t channel = 0U; | |
2983 | |
2984 /* Get channel */ | |
2985 reg = ((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_SCDF) >> DFSDM_FLTISR_SCDF_Pos); | |
2986 while((reg & 1U) == 0U) | |
2987 { | |
2988 channel++; | |
2989 reg = reg >> 1U; | |
2990 } | |
2991 | |
2992 /* Clear short circuit detection flag */ | |
2993 hdfsdm_filter->Instance->FLTICR = (1U << (DFSDM_FLTICR_CLRSCSDF_Pos + channel)); | |
2994 | |
2995 /* Call short circuit detection callback */ | |
2996 HAL_DFSDM_ChannelScdCallback(a_dfsdm2ChannelHandle[channel]); | |
2997 } | |
2998 #endif /* DFSDM2_Channel0 */ | |
2999 } | |
3000 | |
3001 /** | |
3002 * @brief Regular conversion complete callback. | |
3003 * @note In interrupt mode, user has to read conversion value in this function | |
3004 * using HAL_DFSDM_FilterGetRegularValue. | |
3005 * @param hdfsdm_filter DFSDM filter handle. | |
3006 * @retval None | |
3007 */ | |
3008 __weak void HAL_DFSDM_FilterRegConvCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
3009 { | |
3010 /* Prevent unused argument(s) compilation warning */ | |
3011 UNUSED(hdfsdm_filter); | |
3012 /* NOTE : This function should not be modified, when the callback is needed, | |
3013 the HAL_DFSDM_FilterRegConvCpltCallback could be implemented in the user file. | |
3014 */ | |
3015 } | |
3016 | |
3017 /** | |
3018 * @brief Half regular conversion complete callback. | |
3019 * @param hdfsdm_filter DFSDM filter handle. | |
3020 * @retval None | |
3021 */ | |
3022 __weak void HAL_DFSDM_FilterRegConvHalfCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
3023 { | |
3024 /* Prevent unused argument(s) compilation warning */ | |
3025 UNUSED(hdfsdm_filter); | |
3026 /* NOTE : This function should not be modified, when the callback is needed, | |
3027 the HAL_DFSDM_FilterRegConvHalfCpltCallback could be implemented in the user file. | |
3028 */ | |
3029 } | |
3030 | |
3031 /** | |
3032 * @brief Injected conversion complete callback. | |
3033 * @note In interrupt mode, user has to read conversion value in this function | |
3034 * using HAL_DFSDM_FilterGetInjectedValue. | |
3035 * @param hdfsdm_filter DFSDM filter handle. | |
3036 * @retval None | |
3037 */ | |
3038 __weak void HAL_DFSDM_FilterInjConvCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
3039 { | |
3040 /* Prevent unused argument(s) compilation warning */ | |
3041 UNUSED(hdfsdm_filter); | |
3042 /* NOTE : This function should not be modified, when the callback is needed, | |
3043 the HAL_DFSDM_FilterInjConvCpltCallback could be implemented in the user file. | |
3044 */ | |
3045 } | |
3046 | |
3047 /** | |
3048 * @brief Half injected conversion complete callback. | |
3049 * @param hdfsdm_filter DFSDM filter handle. | |
3050 * @retval None | |
3051 */ | |
3052 __weak void HAL_DFSDM_FilterInjConvHalfCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
3053 { | |
3054 /* Prevent unused argument(s) compilation warning */ | |
3055 UNUSED(hdfsdm_filter); | |
3056 /* NOTE : This function should not be modified, when the callback is needed, | |
3057 the HAL_DFSDM_FilterInjConvHalfCpltCallback could be implemented in the user file. | |
3058 */ | |
3059 } | |
3060 | |
3061 /** | |
3062 * @brief Filter analog watchdog callback. | |
3063 * @param hdfsdm_filter DFSDM filter handle. | |
3064 * @param Channel Corresponding channel. | |
3065 * @param Threshold Low or high threshold has been reached. | |
3066 * @retval None | |
3067 */ | |
3068 __weak void HAL_DFSDM_FilterAwdCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, | |
3069 uint32_t Channel, uint32_t Threshold) | |
3070 { | |
3071 /* Prevent unused argument(s) compilation warning */ | |
3072 UNUSED(hdfsdm_filter); | |
3073 UNUSED(Channel); | |
3074 UNUSED(Threshold); | |
3075 | |
3076 /* NOTE : This function should not be modified, when the callback is needed, | |
3077 the HAL_DFSDM_FilterAwdCallback could be implemented in the user file. | |
3078 */ | |
3079 } | |
3080 | |
3081 /** | |
3082 * @brief Error callback. | |
3083 * @param hdfsdm_filter DFSDM filter handle. | |
3084 * @retval None | |
3085 */ | |
3086 __weak void HAL_DFSDM_FilterErrorCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
3087 { | |
3088 /* Prevent unused argument(s) compilation warning */ | |
3089 UNUSED(hdfsdm_filter); | |
3090 /* NOTE : This function should not be modified, when the callback is needed, | |
3091 the HAL_DFSDM_FilterErrorCallback could be implemented in the user file. | |
3092 */ | |
3093 } | |
3094 | |
3095 /** | |
3096 * @} | |
3097 */ | |
3098 | |
3099 /** @defgroup DFSDM_Exported_Functions_Group4_Filter Filter state functions | |
3100 * @brief Filter state functions | |
3101 * | |
3102 @verbatim | |
3103 ============================================================================== | |
3104 ##### Filter state functions ##### | |
3105 ============================================================================== | |
3106 [..] This section provides functions allowing to: | |
3107 (+) Get the DFSDM filter state. | |
3108 (+) Get the DFSDM filter error. | |
3109 @endverbatim | |
3110 * @{ | |
3111 */ | |
3112 | |
3113 /** | |
3114 * @brief This function allows to get the current DFSDM filter handle state. | |
3115 * @param hdfsdm_filter DFSDM filter handle. | |
3116 * @retval DFSDM filter state. | |
3117 */ | |
3118 HAL_DFSDM_Filter_StateTypeDef HAL_DFSDM_FilterGetState(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
3119 { | |
3120 /* Return DFSDM filter handle state */ | |
3121 return hdfsdm_filter->State; | |
3122 } | |
3123 | |
3124 /** | |
3125 * @brief This function allows to get the current DFSDM filter error. | |
3126 * @param hdfsdm_filter DFSDM filter handle. | |
3127 * @retval DFSDM filter error code. | |
3128 */ | |
3129 uint32_t HAL_DFSDM_FilterGetError(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) | |
3130 { | |
3131 return hdfsdm_filter->ErrorCode; | |
3132 } | |
3133 | |
3134 /** | |
3135 * @} | |
3136 */ | |
3137 | |
3138 /** @defgroup DFSDM_Exported_Functions_Group5_Filter MultiChannel operation functions | |
3139 * @brief Filter state functions | |
3140 * | |
3141 @verbatim | |
3142 ============================================================================== | |
3143 ##### Filter MultiChannel operation functions ##### | |
3144 ============================================================================== | |
3145 [..] This section provides functions allowing to: | |
3146 (+) Control the DFSDM Multi channel delay block | |
3147 @endverbatim | |
3148 * @{ | |
3149 */ | |
3150 #if defined(SYSCFG_MCHDLYCR_BSCKSEL) | |
3151 /** | |
3152 * @brief Select the DFSDM2 as clock source for the bitstream clock. | |
3153 * @note The SYSCFG clock marco __HAL_RCC_SYSCFG_CLK_ENABLE() must be called | |
3154 * before HAL_DFSDM_BitstreamClock_Start() | |
3155 */ | |
3156 void HAL_DFSDM_BitstreamClock_Start(void) | |
3157 { | |
3158 uint32_t tmp = 0; | |
3159 | |
3160 tmp = SYSCFG->MCHDLYCR; | |
3161 tmp = (tmp &(~SYSCFG_MCHDLYCR_BSCKSEL)); | |
3162 | |
3163 SYSCFG->MCHDLYCR = (tmp|SYSCFG_MCHDLYCR_BSCKSEL); | |
3164 } | |
3165 | |
3166 /** | |
3167 * @brief Stop the DFSDM2 as clock source for the bitstream clock. | |
3168 * @note The SYSCFG clock marco __HAL_RCC_SYSCFG_CLK_ENABLE() must be called | |
3169 * before HAL_DFSDM_BitstreamClock_Stop() | |
3170 * @retval None | |
3171 */ | |
3172 void HAL_DFSDM_BitstreamClock_Stop(void) | |
3173 { | |
3174 uint32_t tmp = 0U; | |
3175 | |
3176 tmp = SYSCFG->MCHDLYCR; | |
3177 tmp = (tmp &(~SYSCFG_MCHDLYCR_BSCKSEL)); | |
3178 | |
3179 SYSCFG->MCHDLYCR = tmp; | |
3180 } | |
3181 | |
3182 /** | |
3183 * @brief Disable Delay Clock for DFSDM1/2. | |
3184 * @param MCHDLY HAL_MCHDLY_CLOCK_DFSDM2. | |
3185 * HAL_MCHDLY_CLOCK_DFSDM1. | |
3186 * @note The SYSCFG clock marco __HAL_RCC_SYSCFG_CLK_ENABLE() must be called | |
3187 * before HAL_DFSDM_DisableDelayClock() | |
3188 * @retval None | |
3189 */ | |
3190 void HAL_DFSDM_DisableDelayClock(uint32_t MCHDLY) | |
3191 { | |
3192 uint32_t tmp = 0U; | |
3193 | |
3194 assert_param(IS_DFSDM_DELAY_CLOCK(MCHDLY)); | |
3195 | |
3196 tmp = SYSCFG->MCHDLYCR; | |
3197 if(MCHDLY == HAL_MCHDLY_CLOCK_DFSDM2) | |
3198 { | |
3199 tmp = tmp &(~SYSCFG_MCHDLYCR_MCHDLY2EN); | |
3200 } | |
3201 else | |
3202 { | |
3203 tmp = tmp &(~SYSCFG_MCHDLYCR_MCHDLY1EN); | |
3204 } | |
3205 | |
3206 SYSCFG->MCHDLYCR = tmp; | |
3207 } | |
3208 | |
3209 /** | |
3210 * @brief Enable Delay Clock for DFSDM1/2. | |
3211 * @param MCHDLY HAL_MCHDLY_CLOCK_DFSDM2. | |
3212 * HAL_MCHDLY_CLOCK_DFSDM1. | |
3213 * @note The SYSCFG clock marco __HAL_RCC_SYSCFG_CLK_ENABLE() must be called | |
3214 * before HAL_DFSDM_EnableDelayClock() | |
3215 * @retval None | |
3216 */ | |
3217 void HAL_DFSDM_EnableDelayClock(uint32_t MCHDLY) | |
3218 { | |
3219 uint32_t tmp = 0U; | |
3220 | |
3221 assert_param(IS_DFSDM_DELAY_CLOCK(MCHDLY)); | |
3222 | |
3223 tmp = SYSCFG->MCHDLYCR; | |
3224 tmp = tmp & ~MCHDLY; | |
3225 | |
3226 SYSCFG->MCHDLYCR = (tmp|MCHDLY); | |
3227 } | |
3228 | |
3229 /** | |
3230 * @brief Select the source for CKin signals for DFSDM1/2. | |
3231 * @param source DFSDM2_CKIN_PAD. | |
3232 * DFSDM2_CKIN_DM. | |
3233 * DFSDM1_CKIN_PAD. | |
3234 * DFSDM1_CKIN_DM. | |
3235 * @retval None | |
3236 */ | |
3237 void HAL_DFSDM_ClockIn_SourceSelection(uint32_t source) | |
3238 { | |
3239 uint32_t tmp = 0U; | |
3240 | |
3241 assert_param(IS_DFSDM_CLOCKIN_SELECTION(source)); | |
3242 | |
3243 tmp = SYSCFG->MCHDLYCR; | |
3244 | |
3245 if((source == HAL_DFSDM2_CKIN_PAD) || (source == HAL_DFSDM2_CKIN_DM)) | |
3246 { | |
3247 tmp = (tmp & ~SYSCFG_MCHDLYCR_DFSDM2CFG); | |
3248 | |
3249 if(source == HAL_DFSDM2_CKIN_PAD) | |
3250 { | |
3251 source = 0x000000U; | |
3252 } | |
3253 } | |
3254 else | |
3255 { | |
3256 tmp = (tmp & ~SYSCFG_MCHDLYCR_DFSDM1CFG); | |
3257 } | |
3258 | |
3259 SYSCFG->MCHDLYCR = (source|tmp); | |
3260 } | |
3261 | |
3262 /** | |
3263 * @brief Select the source for CKOut signals for DFSDM1/2. | |
3264 * @param source: DFSDM2_CKOUT_DFSDM2. | |
3265 * DFSDM2_CKOUT_M27. | |
3266 * DFSDM1_CKOUT_DFSDM1. | |
3267 * DFSDM1_CKOUT_M27. | |
3268 * @retval None | |
3269 */ | |
3270 void HAL_DFSDM_ClockOut_SourceSelection(uint32_t source) | |
3271 { | |
3272 uint32_t tmp = 0U; | |
3273 | |
3274 assert_param(IS_DFSDM_CLOCKOUT_SELECTION(source)); | |
3275 | |
3276 tmp = SYSCFG->MCHDLYCR; | |
3277 | |
3278 if((source == HAL_DFSDM2_CKOUT_DFSDM2) || (source == HAL_DFSDM2_CKOUT_M27)) | |
3279 { | |
3280 tmp = (tmp & ~SYSCFG_MCHDLYCR_DFSDM2CKOSEL); | |
3281 | |
3282 if(source == HAL_DFSDM2_CKOUT_DFSDM2) | |
3283 { | |
3284 source = 0x000U; | |
3285 } | |
3286 } | |
3287 else | |
3288 { | |
3289 tmp = (tmp & ~SYSCFG_MCHDLYCR_DFSDM1CKOSEL); | |
3290 } | |
3291 | |
3292 SYSCFG->MCHDLYCR = (source|tmp); | |
3293 } | |
3294 | |
3295 /** | |
3296 * @brief Select the source for DataIn0 signals for DFSDM1/2. | |
3297 * @param source DATAIN0_DFSDM2_PAD. | |
3298 * DATAIN0_DFSDM2_DATAIN1. | |
3299 * DATAIN0_DFSDM1_PAD. | |
3300 * DATAIN0_DFSDM1_DATAIN1. | |
3301 * @retval None | |
3302 */ | |
3303 void HAL_DFSDM_DataIn0_SourceSelection(uint32_t source) | |
3304 { | |
3305 uint32_t tmp = 0U; | |
3306 | |
3307 assert_param(IS_DFSDM_DATAIN0_SRC_SELECTION(source)); | |
3308 | |
3309 tmp = SYSCFG->MCHDLYCR; | |
3310 | |
3311 if((source == HAL_DATAIN0_DFSDM2_PAD)|| (source == HAL_DATAIN0_DFSDM2_DATAIN1)) | |
3312 { | |
3313 tmp = (tmp & ~SYSCFG_MCHDLYCR_DFSDM2D0SEL); | |
3314 if(source == HAL_DATAIN0_DFSDM2_PAD) | |
3315 { | |
3316 source = 0x00000U; | |
3317 } | |
3318 } | |
3319 else | |
3320 { | |
3321 tmp = (tmp & ~SYSCFG_MCHDLYCR_DFSDM1D0SEL); | |
3322 } | |
3323 SYSCFG->MCHDLYCR = (source|tmp); | |
3324 } | |
3325 | |
3326 /** | |
3327 * @brief Select the source for DataIn2 signals for DFSDM1/2. | |
3328 * @param source DATAIN2_DFSDM2_PAD. | |
3329 * DATAIN2_DFSDM2_DATAIN3. | |
3330 * DATAIN2_DFSDM1_PAD. | |
3331 * DATAIN2_DFSDM1_DATAIN3. | |
3332 * @retval None | |
3333 */ | |
3334 void HAL_DFSDM_DataIn2_SourceSelection(uint32_t source) | |
3335 { | |
3336 uint32_t tmp = 0U; | |
3337 | |
3338 assert_param(IS_DFSDM_DATAIN2_SRC_SELECTION(source)); | |
3339 | |
3340 tmp = SYSCFG->MCHDLYCR; | |
3341 | |
3342 if((source == HAL_DATAIN2_DFSDM2_PAD)|| (source == HAL_DATAIN2_DFSDM2_DATAIN3)) | |
3343 { | |
3344 tmp = (tmp & ~SYSCFG_MCHDLYCR_DFSDM2D2SEL); | |
3345 if (source == HAL_DATAIN2_DFSDM2_PAD) | |
3346 { | |
3347 source = 0x0000U; | |
3348 } | |
3349 } | |
3350 else | |
3351 { | |
3352 tmp = (tmp & ~SYSCFG_MCHDLYCR_DFSDM1D2SEL); | |
3353 } | |
3354 SYSCFG->MCHDLYCR = (source|tmp); | |
3355 } | |
3356 | |
3357 /** | |
3358 * @brief Select the source for DataIn4 signals for DFSDM2. | |
3359 * @param source DATAIN4_DFSDM2_PAD. | |
3360 * DATAIN4_DFSDM2_DATAIN5 | |
3361 * @retval None | |
3362 */ | |
3363 void HAL_DFSDM_DataIn4_SourceSelection(uint32_t source) | |
3364 { | |
3365 uint32_t tmp = 0U; | |
3366 | |
3367 assert_param(IS_DFSDM_DATAIN4_SRC_SELECTION(source)); | |
3368 | |
3369 tmp = SYSCFG->MCHDLYCR; | |
3370 tmp = (tmp & ~SYSCFG_MCHDLYCR_DFSDM2D4SEL); | |
3371 | |
3372 SYSCFG->MCHDLYCR = (source|tmp); | |
3373 } | |
3374 | |
3375 /** | |
3376 * @brief Select the source for DataIn6 signals for DFSDM2. | |
3377 * @param source DATAIN6_DFSDM2_PAD. | |
3378 * DATAIN6_DFSDM2_DATAIN7. | |
3379 * @retval None | |
3380 */ | |
3381 void HAL_DFSDM_DataIn6_SourceSelection(uint32_t source) | |
3382 { | |
3383 uint32_t tmp = 0U; | |
3384 | |
3385 assert_param(IS_DFSDM_DATAIN6_SRC_SELECTION(source)); | |
3386 | |
3387 tmp = SYSCFG->MCHDLYCR; | |
3388 | |
3389 tmp = (tmp & ~SYSCFG_MCHDLYCR_DFSDM2D6SEL); | |
3390 | |
3391 SYSCFG->MCHDLYCR = (source|tmp); | |
3392 } | |
3393 | |
3394 /** | |
3395 * @brief Configure the distribution of the bitstream clock gated from TIM4_OC | |
3396 * for DFSDM1 or TIM3_OC for DFSDM2 | |
3397 * @param source DFSDM1_CLKIN0_TIM4OC2 | |
3398 * DFSDM1_CLKIN2_TIM4OC2 | |
3399 * DFSDM1_CLKIN1_TIM4OC1 | |
3400 * DFSDM1_CLKIN3_TIM4OC1 | |
3401 * DFSDM2_CLKIN0_TIM3OC4 | |
3402 * DFSDM2_CLKIN4_TIM3OC4 | |
3403 * DFSDM2_CLKIN1_TIM3OC3 | |
3404 * DFSDM2_CLKIN5_TIM3OC3 | |
3405 * DFSDM2_CLKIN2_TIM3OC2 | |
3406 * DFSDM2_CLKIN6_TIM3OC2 | |
3407 * DFSDM2_CLKIN3_TIM3OC1 | |
3408 * DFSDM2_CLKIN7_TIM3OC1 | |
3409 * @retval None | |
3410 */ | |
3411 void HAL_DFSDM_BitStreamClkDistribution_Config(uint32_t source) | |
3412 { | |
3413 uint32_t tmp = 0U; | |
3414 | |
3415 assert_param(IS_DFSDM_BITSTREM_CLK_DISTRIBUTION(source)); | |
3416 | |
3417 tmp = SYSCFG->MCHDLYCR; | |
3418 | |
3419 if ((source == HAL_DFSDM1_CLKIN0_TIM4OC2) || (source == HAL_DFSDM1_CLKIN2_TIM4OC2)) | |
3420 { | |
3421 tmp = (tmp & ~SYSCFG_MCHDLYCR_DFSDM1CK02SEL); | |
3422 } | |
3423 else if ((source == HAL_DFSDM1_CLKIN1_TIM4OC1) || (source == HAL_DFSDM1_CLKIN3_TIM4OC1)) | |
3424 { | |
3425 tmp = (tmp & ~SYSCFG_MCHDLYCR_DFSDM1CK13SEL); | |
3426 } | |
3427 else if ((source == HAL_DFSDM2_CLKIN0_TIM3OC4) || (source == HAL_DFSDM2_CLKIN4_TIM3OC4)) | |
3428 { | |
3429 tmp = (tmp & ~SYSCFG_MCHDLYCR_DFSDM2CK04SEL); | |
3430 } | |
3431 else if ((source == HAL_DFSDM2_CLKIN1_TIM3OC3) || (source == HAL_DFSDM2_CLKIN5_TIM3OC3)) | |
3432 { | |
3433 tmp = (tmp & ~SYSCFG_MCHDLYCR_DFSDM2CK15SEL); | |
3434 | |
3435 }else if ((source == HAL_DFSDM2_CLKIN2_TIM3OC2) || (source == HAL_DFSDM2_CLKIN6_TIM3OC2)) | |
3436 { | |
3437 tmp = (tmp & ~SYSCFG_MCHDLYCR_DFSDM2CK26SEL); | |
3438 } | |
3439 else | |
3440 { | |
3441 tmp = (tmp & ~SYSCFG_MCHDLYCR_DFSDM2CK37SEL); | |
3442 } | |
3443 | |
3444 if((source == HAL_DFSDM1_CLKIN0_TIM4OC2) ||(source == HAL_DFSDM1_CLKIN1_TIM4OC1)|| | |
3445 (source == HAL_DFSDM2_CLKIN0_TIM3OC4) ||(source == HAL_DFSDM2_CLKIN1_TIM3OC3)|| | |
3446 (source == HAL_DFSDM2_CLKIN2_TIM3OC2) ||(source == HAL_DFSDM2_CLKIN3_TIM3OC1)) | |
3447 { | |
3448 source = 0x0000U; | |
3449 } | |
3450 | |
3451 SYSCFG->MCHDLYCR = (source|tmp); | |
3452 } | |
3453 | |
3454 /** | |
3455 * @brief Configure multi channel delay block: Use DFSDM2 audio clock source as input | |
3456 * clock for DFSDM1 and DFSDM2 filters to Synchronize DFSDMx filters. | |
3457 * Set the path of the DFSDM2 clock output (dfsdm2_ckout) to the | |
3458 * DFSDM1/2 CkInx and data inputs channels by configuring following MCHDLY muxes | |
3459 * or demuxes: M1, M2, M3, M4, M5, M6, M7, M8, DM1, DM2, DM3, DM4, DM5, DM6, | |
3460 * M9, M10, M11, M12, M13, M14, M15, M16, M17, M18, M19, M20 based on the | |
3461 * contains of the DFSDM_MultiChannelConfigTypeDef structure | |
3462 * @param mchdlystruct Structure of multi channel configuration | |
3463 * @retval None | |
3464 * @note The SYSCFG clock marco __HAL_RCC_SYSCFG_CLK_ENABLE() must be called | |
3465 * before HAL_DFSDM_ConfigMultiChannelDelay() | |
3466 * @note The HAL_DFSDM_ConfigMultiChannelDelay() function clears the SYSCFG-MCHDLYCR | |
3467 * register before setting the new configuration. | |
3468 */ | |
3469 void HAL_DFSDM_ConfigMultiChannelDelay(DFSDM_MultiChannelConfigTypeDef* mchdlystruct) | |
3470 { | |
3471 uint32_t mchdlyreg = 0U; | |
3472 | |
3473 assert_param(IS_DFSDM_DFSDM1_CLKOUT(mchdlystruct->DFSDM1ClockOut)); | |
3474 assert_param(IS_DFSDM_DFSDM2_CLKOUT(mchdlystruct->DFSDM2ClockOut)); | |
3475 assert_param(IS_DFSDM_DFSDM1_CLKIN(mchdlystruct->DFSDM1ClockIn)); | |
3476 assert_param(IS_DFSDM_DFSDM2_CLKIN(mchdlystruct->DFSDM2ClockIn)); | |
3477 assert_param(IS_DFSDM_DFSDM1_BIT_CLK((mchdlystruct->DFSDM1BitClkDistribution))); | |
3478 assert_param(IS_DFSDM_DFSDM2_BIT_CLK(mchdlystruct->DFSDM2BitClkDistribution)); | |
3479 assert_param(IS_DFSDM_DFSDM1_DATA_DISTRIBUTION(mchdlystruct->DFSDM1DataDistribution)); | |
3480 assert_param(IS_DFSDM_DFSDM2_DATA_DISTRIBUTION(mchdlystruct->DFSDM2DataDistribution)); | |
3481 | |
3482 mchdlyreg = (SYSCFG->MCHDLYCR & 0x80103U); | |
3483 | |
3484 SYSCFG->MCHDLYCR = (mchdlyreg |(mchdlystruct->DFSDM1ClockOut)|(mchdlystruct->DFSDM2ClockOut)| | |
3485 (mchdlystruct->DFSDM1ClockIn)|(mchdlystruct->DFSDM2ClockIn)| | |
3486 (mchdlystruct->DFSDM1BitClkDistribution)| (mchdlystruct->DFSDM2BitClkDistribution)| | |
3487 (mchdlystruct->DFSDM1DataDistribution)| (mchdlystruct->DFSDM2DataDistribution)); | |
3488 | |
3489 } | |
3490 #endif /* SYSCFG_MCHDLYCR_BSCKSEL */ | |
3491 /** | |
3492 * @} | |
3493 */ | |
3494 /** | |
3495 * @} | |
3496 */ | |
3497 /* End of exported functions -------------------------------------------------*/ | |
3498 | |
3499 /* Private functions ---------------------------------------------------------*/ | |
3500 /** @addtogroup DFSDM_Private_Functions DFSDM Private Functions | |
3501 * @{ | |
3502 */ | |
3503 | |
3504 /** | |
3505 * @brief DMA half transfer complete callback for regular conversion. | |
3506 * @param hdma DMA handle. | |
3507 * @retval None | |
3508 */ | |
3509 static void DFSDM_DMARegularHalfConvCplt(DMA_HandleTypeDef *hdma) | |
3510 { | |
3511 /* Get DFSDM filter handle */ | |
3512 DFSDM_Filter_HandleTypeDef* hdfsdm_filter = (DFSDM_Filter_HandleTypeDef*) ((DMA_HandleTypeDef*)hdma)->Parent; | |
3513 | |
3514 /* Call regular half conversion complete callback */ | |
3515 HAL_DFSDM_FilterRegConvHalfCpltCallback(hdfsdm_filter); | |
3516 } | |
3517 | |
3518 /** | |
3519 * @brief DMA transfer complete callback for regular conversion. | |
3520 * @param hdma DMA handle. | |
3521 * @retval None | |
3522 */ | |
3523 static void DFSDM_DMARegularConvCplt(DMA_HandleTypeDef *hdma) | |
3524 { | |
3525 /* Get DFSDM filter handle */ | |
3526 DFSDM_Filter_HandleTypeDef* hdfsdm_filter = (DFSDM_Filter_HandleTypeDef*) ((DMA_HandleTypeDef*)hdma)->Parent; | |
3527 | |
3528 /* Call regular conversion complete callback */ | |
3529 HAL_DFSDM_FilterRegConvCpltCallback(hdfsdm_filter); | |
3530 } | |
3531 | |
3532 /** | |
3533 * @brief DMA half transfer complete callback for injected conversion. | |
3534 * @param hdma DMA handle. | |
3535 * @retval None | |
3536 */ | |
3537 static void DFSDM_DMAInjectedHalfConvCplt(DMA_HandleTypeDef *hdma) | |
3538 { | |
3539 /* Get DFSDM filter handle */ | |
3540 DFSDM_Filter_HandleTypeDef* hdfsdm_filter = (DFSDM_Filter_HandleTypeDef*) ((DMA_HandleTypeDef*)hdma)->Parent; | |
3541 | |
3542 /* Call injected half conversion complete callback */ | |
3543 HAL_DFSDM_FilterInjConvHalfCpltCallback(hdfsdm_filter); | |
3544 } | |
3545 | |
3546 /** | |
3547 * @brief DMA transfer complete callback for injected conversion. | |
3548 * @param hdma DMA handle. | |
3549 * @retval None | |
3550 */ | |
3551 static void DFSDM_DMAInjectedConvCplt(DMA_HandleTypeDef *hdma) | |
3552 { | |
3553 /* Get DFSDM filter handle */ | |
3554 DFSDM_Filter_HandleTypeDef* hdfsdm_filter = (DFSDM_Filter_HandleTypeDef*) ((DMA_HandleTypeDef*)hdma)->Parent; | |
3555 | |
3556 /* Call injected conversion complete callback */ | |
3557 HAL_DFSDM_FilterInjConvCpltCallback(hdfsdm_filter); | |
3558 } | |
3559 | |
3560 /** | |
3561 * @brief DMA error callback. | |
3562 * @param hdma DMA handle. | |
3563 * @retval None | |
3564 */ | |
3565 static void DFSDM_DMAError(DMA_HandleTypeDef *hdma) | |
3566 { | |
3567 /* Get DFSDM filter handle */ | |
3568 DFSDM_Filter_HandleTypeDef* hdfsdm_filter = (DFSDM_Filter_HandleTypeDef*) ((DMA_HandleTypeDef*)hdma)->Parent; | |
3569 | |
3570 /* Update error code */ | |
3571 hdfsdm_filter->ErrorCode = DFSDM_FILTER_ERROR_DMA; | |
3572 | |
3573 /* Call error callback */ | |
3574 HAL_DFSDM_FilterErrorCallback(hdfsdm_filter); | |
3575 } | |
3576 | |
3577 /** | |
3578 * @brief This function allows to get the number of injected channels. | |
3579 * @param Channels bitfield of injected channels. | |
3580 * @retval Number of injected channels. | |
3581 */ | |
3582 static uint32_t DFSDM_GetInjChannelsNbr(uint32_t Channels) | |
3583 { | |
3584 uint32_t nbChannels = 0U; | |
3585 uint32_t tmp; | |
3586 | |
3587 /* Get the number of channels from bitfield */ | |
3588 tmp = (uint32_t) (Channels & DFSDM_LSB_MASK); | |
3589 while(tmp != 0U) | |
3590 { | |
3591 if((tmp & 1U) != 0U) | |
3592 { | |
3593 nbChannels++; | |
3594 } | |
3595 tmp = (uint32_t) (tmp >> 1U); | |
3596 } | |
3597 return nbChannels; | |
3598 } | |
3599 | |
3600 /** | |
3601 * @brief This function allows to get the channel number from channel instance. | |
3602 * @param Instance DFSDM channel instance. | |
3603 * @retval Channel number. | |
3604 */ | |
3605 static uint32_t DFSDM_GetChannelFromInstance(DFSDM_Channel_TypeDef* Instance) | |
3606 { | |
3607 uint32_t channel = 0xFFU; | |
3608 | |
3609 /* Get channel from instance */ | |
3610 #if defined(DFSDM2_Channel0) | |
3611 if((Instance == DFSDM1_Channel0) || (Instance == DFSDM2_Channel0)) | |
3612 { | |
3613 channel = 0U; | |
3614 } | |
3615 else if((Instance == DFSDM1_Channel1) || (Instance == DFSDM2_Channel1)) | |
3616 { | |
3617 channel = 1U; | |
3618 } | |
3619 else if((Instance == DFSDM1_Channel2) || (Instance == DFSDM2_Channel2)) | |
3620 { | |
3621 channel = 2U; | |
3622 } | |
3623 else if((Instance == DFSDM1_Channel3) || (Instance == DFSDM2_Channel3)) | |
3624 { | |
3625 channel = 3U; | |
3626 } | |
3627 else if(Instance == DFSDM2_Channel4) | |
3628 { | |
3629 channel = 4U; | |
3630 } | |
3631 else if(Instance == DFSDM2_Channel5) | |
3632 { | |
3633 channel = 5U; | |
3634 } | |
3635 else if(Instance == DFSDM2_Channel6) | |
3636 { | |
3637 channel = 6U; | |
3638 } | |
3639 else if(Instance == DFSDM2_Channel7) | |
3640 { | |
3641 channel = 7U; | |
3642 } | |
3643 #else | |
3644 if(Instance == DFSDM1_Channel0) | |
3645 { | |
3646 channel = 0U; | |
3647 } | |
3648 else if(Instance == DFSDM1_Channel1) | |
3649 { | |
3650 channel = 1U; | |
3651 } | |
3652 else if(Instance == DFSDM1_Channel2) | |
3653 { | |
3654 channel = 2U; | |
3655 } | |
3656 else if(Instance == DFSDM1_Channel3) | |
3657 { | |
3658 channel = 3U; | |
3659 } | |
3660 #endif /* defined(DFSDM2_Channel0) */ | |
3661 | |
3662 return channel; | |
3663 } | |
3664 | |
3665 /** | |
3666 * @brief This function allows to really start regular conversion. | |
3667 * @param hdfsdm_filter DFSDM filter handle. | |
3668 * @retval None | |
3669 */ | |
3670 static void DFSDM_RegConvStart(DFSDM_Filter_HandleTypeDef* hdfsdm_filter) | |
3671 { | |
3672 /* Check regular trigger */ | |
3673 if(hdfsdm_filter->RegularTrigger == DFSDM_FILTER_SW_TRIGGER) | |
3674 { | |
3675 /* Software start of regular conversion */ | |
3676 hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_RSWSTART; | |
3677 } | |
3678 else /* synchronous trigger */ | |
3679 { | |
3680 /* Disable DFSDM filter */ | |
3681 hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_DFEN); | |
3682 | |
3683 /* Set RSYNC bit in DFSDM_FLTCR1 register */ | |
3684 hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_RSYNC; | |
3685 | |
3686 /* Enable DFSDM filter */ | |
3687 hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_DFEN; | |
3688 | |
3689 /* If injected conversion was in progress, restart it */ | |
3690 if(hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_INJ) | |
3691 { | |
3692 if(hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_SW_TRIGGER) | |
3693 { | |
3694 hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_JSWSTART; | |
3695 } | |
3696 /* Update remaining injected conversions */ | |
3697 hdfsdm_filter->InjConvRemaining = (hdfsdm_filter->InjectedScanMode == ENABLE) ? \ | |
3698 hdfsdm_filter->InjectedChannelsNbr : 1U; | |
3699 } | |
3700 } | |
3701 /* Update DFSDM filter state */ | |
3702 hdfsdm_filter->State = (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_READY) ? \ | |
3703 HAL_DFSDM_FILTER_STATE_REG : HAL_DFSDM_FILTER_STATE_REG_INJ; | |
3704 } | |
3705 | |
3706 /** | |
3707 * @brief This function allows to really stop regular conversion. | |
3708 * @param hdfsdm_filter DFSDM filter handle. | |
3709 * @retval None | |
3710 */ | |
3711 static void DFSDM_RegConvStop(DFSDM_Filter_HandleTypeDef* hdfsdm_filter) | |
3712 { | |
3713 /* Disable DFSDM filter */ | |
3714 hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_DFEN); | |
3715 | |
3716 /* If regular trigger was synchronous, reset RSYNC bit in DFSDM_FLTCR1 register */ | |
3717 if(hdfsdm_filter->RegularTrigger == DFSDM_FILTER_SYNC_TRIGGER) | |
3718 { | |
3719 hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_RSYNC); | |
3720 } | |
3721 | |
3722 /* Enable DFSDM filter */ | |
3723 hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_DFEN; | |
3724 | |
3725 /* If injected conversion was in progress, restart it */ | |
3726 if(hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_REG_INJ) | |
3727 { | |
3728 if(hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_SW_TRIGGER) | |
3729 { | |
3730 hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_JSWSTART; | |
3731 } | |
3732 /* Update remaining injected conversions */ | |
3733 hdfsdm_filter->InjConvRemaining = (hdfsdm_filter->InjectedScanMode == ENABLE) ? \ | |
3734 hdfsdm_filter->InjectedChannelsNbr : 1U; | |
3735 } | |
3736 | |
3737 /* Update DFSDM filter state */ | |
3738 hdfsdm_filter->State = (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_REG) ? \ | |
3739 HAL_DFSDM_FILTER_STATE_READY : HAL_DFSDM_FILTER_STATE_INJ; | |
3740 } | |
3741 | |
3742 /** | |
3743 * @brief This function allows to really start injected conversion. | |
3744 * @param hdfsdm_filter DFSDM filter handle. | |
3745 * @retval None | |
3746 */ | |
3747 static void DFSDM_InjConvStart(DFSDM_Filter_HandleTypeDef* hdfsdm_filter) | |
3748 { | |
3749 /* Check injected trigger */ | |
3750 if(hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_SW_TRIGGER) | |
3751 { | |
3752 /* Software start of injected conversion */ | |
3753 hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_JSWSTART; | |
3754 } | |
3755 else /* external or synchronous trigger */ | |
3756 { | |
3757 /* Disable DFSDM filter */ | |
3758 hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_DFEN); | |
3759 | |
3760 if(hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_SYNC_TRIGGER) | |
3761 { | |
3762 /* Set JSYNC bit in DFSDM_FLTCR1 register */ | |
3763 hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_JSYNC; | |
3764 } | |
3765 else /* external trigger */ | |
3766 { | |
3767 /* Set JEXTEN[1:0] bits in DFSDM_FLTCR1 register */ | |
3768 hdfsdm_filter->Instance->FLTCR1 |= hdfsdm_filter->ExtTriggerEdge; | |
3769 } | |
3770 | |
3771 /* Enable DFSDM filter */ | |
3772 hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_DFEN; | |
3773 | |
3774 /* If regular conversion was in progress, restart it */ | |
3775 if((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_REG) && \ | |
3776 (hdfsdm_filter->RegularTrigger == DFSDM_FILTER_SW_TRIGGER)) | |
3777 { | |
3778 hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_RSWSTART; | |
3779 } | |
3780 } | |
3781 /* Update DFSDM filter state */ | |
3782 hdfsdm_filter->State = (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_READY) ? \ | |
3783 HAL_DFSDM_FILTER_STATE_INJ : HAL_DFSDM_FILTER_STATE_REG_INJ; | |
3784 } | |
3785 | |
3786 /** | |
3787 * @brief This function allows to really stop injected conversion. | |
3788 * @param hdfsdm_filter DFSDM filter handle. | |
3789 * @retval None | |
3790 */ | |
3791 static void DFSDM_InjConvStop(DFSDM_Filter_HandleTypeDef* hdfsdm_filter) | |
3792 { | |
3793 /* Disable DFSDM filter */ | |
3794 hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_DFEN); | |
3795 | |
3796 /* If injected trigger was synchronous, reset JSYNC bit in DFSDM_FLTCR1 register */ | |
3797 if(hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_SYNC_TRIGGER) | |
3798 { | |
3799 hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_JSYNC); | |
3800 } | |
3801 else if(hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_EXT_TRIGGER) | |
3802 { | |
3803 /* Reset JEXTEN[1:0] bits in DFSDM_FLTCR1 register */ | |
3804 hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_JEXTEN); | |
3805 } | |
3806 | |
3807 /* Enable DFSDM filter */ | |
3808 hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_DFEN; | |
3809 | |
3810 /* If regular conversion was in progress, restart it */ | |
3811 if((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_REG_INJ) && \ | |
3812 (hdfsdm_filter->RegularTrigger == DFSDM_FILTER_SW_TRIGGER)) | |
3813 { | |
3814 hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_RSWSTART; | |
3815 } | |
3816 | |
3817 /* Update remaining injected conversions */ | |
3818 hdfsdm_filter->InjConvRemaining = (hdfsdm_filter->InjectedScanMode == ENABLE) ? \ | |
3819 hdfsdm_filter->InjectedChannelsNbr : 1U; | |
3820 | |
3821 /* Update DFSDM filter state */ | |
3822 hdfsdm_filter->State = (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_INJ) ? \ | |
3823 HAL_DFSDM_FILTER_STATE_READY : HAL_DFSDM_FILTER_STATE_REG; | |
3824 } | |
3825 /** | |
3826 * @} | |
3827 */ | |
3828 /* End of private functions --------------------------------------------------*/ | |
3829 | |
3830 /** | |
3831 * @} | |
3832 */ | |
3833 #endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ | |
3834 #endif /* HAL_DFSDM_MODULE_ENABLED */ | |
3835 /** | |
3836 * @} | |
3837 */ | |
3838 | |
3839 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |