1 /**
2   ******************************************************************************
3   * @file    stm32h7rsxx_hal_mdf.h
4   * @author  MCD Application Team
5   * @brief   Header file of MDF HAL module.
6   ******************************************************************************
7   * @attention
8   *
9   * Copyright (c) 2022 STMicroelectronics.
10   * All rights reserved.
11   *
12   * This software is licensed under terms that can be found in the LICENSE file
13   * in the root directory of this software component.
14   * If no LICENSE file comes with this software, it is provided AS-IS.
15   *
16   ******************************************************************************
17   */
18 
19 /* Define to prevent recursive inclusion -------------------------------------*/
20 #ifndef STM32H7RSxx_HAL_MDF_H
21 #define STM32H7RSxx_HAL_MDF_H
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 /* Includes ------------------------------------------------------------------*/
28 #include "stm32h7rsxx_hal_def.h"
29 
30 /** @addtogroup STM32H7RSxx_HAL_Driver
31   * @{
32   */
33 
34 /** @addtogroup MDF
35   * @{
36   */
37 
38 /* Exported types ------------------------------------------------------------*/
39 /** @defgroup MDF_Exported_Types  MDF Exported Types
40   * @{
41   */
42 
43 /**
44   * @brief  HAL MDF states definition
45   */
46 typedef enum
47 {
48   HAL_MDF_STATE_RESET       = 0x00U, /*!< MDF not initialized */
49   HAL_MDF_STATE_READY       = 0x01U, /*!< MDF initialized and ready for use */
50   HAL_MDF_STATE_ACQUISITION = 0x02U, /*!< MDF acquisition in progress */
51   HAL_MDF_STATE_ERROR       = 0xFFU  /*!< MDF state error */
52 } HAL_MDF_StateTypeDef;
53 
54 /**
55   * @brief  MDF clock trigger structure definition
56   */
57 typedef struct
58 {
59   FunctionalState Activation;  /*!< Output clock trigger enable/disable */
60   uint32_t        Source;      /*!< Output clock trigger source.
61                                     This parameter can be a value of @ref MDF_ClockTriggerSource */
62   uint32_t        Edge;        /*!< Output clock trigger edge.
63                                     This parameter can be a value of @ref MDF_ClockTriggerEdge */
64 } MDF_ClockTriggerTypeDef;
65 
66 /**
67   * @brief  MDF output clock structure definition
68   */
69 typedef struct
70 {
71   FunctionalState         Activation; /*!< Output clock enable/disable */
72   uint32_t                Pins;       /*!< Output clock pins.
73                                            This parameter can be a value of @ref MDF_OuputClockPins */
74   uint32_t                Divider;    /*!< Output clock divider.
75                                            This parameter must be a number between Min_Data = 1 and Max_Data = 16 */
76   MDF_ClockTriggerTypeDef Trigger;    /*!< Output clock trigger parameters */
77 } MDF_OutputClockTypeDef;
78 
79 /**
80   * @brief  MDF common parameters structure definition
81   */
82 typedef struct
83 {
84   uint32_t               ProcClockDivider;   /*!< Processing clock divider.
85                                                   This parameter must be a number between Min_Data = 1
86                                                   and Max_Data = 128 */
87   MDF_OutputClockTypeDef OutputClock;        /*!< Output clock parameters */
88 } MDF_CommonParamTypeDef;
89 
90 /**
91   * @brief  MDF serial interface structure definition
92   */
93 typedef struct
94 {
95   FunctionalState  Activation;  /*!< Serial interface enable/disable */
96   uint32_t         Mode;        /*!< Serial interface mode.
97                                      This parameter can be a value of @ref MDF_SitfMode */
98   uint32_t         ClockSource; /*!< Serial interface clock source.
99                                      This parameter can be a value of @ref MDF_SitfClockSource */
100   uint32_t         Threshold;   /*!< SPI threshold for clock absence detection or Manchester symbol threshold.
101                                      This parameter must be a number between Min_Data = 4 and Max_Data = 31 */
102 } MDF_SerialInterfaceTypeDef;
103 
104 /**
105   * @brief  MDF init structure definition
106   */
107 typedef struct
108 {
109   MDF_CommonParamTypeDef      CommonParam;      /*!< MDF common parameters */
110   MDF_SerialInterfaceTypeDef  SerialInterface;  /*!< MDF serial interface parameters */
111   uint32_t                    FilterBistream;   /*!< MDF filter bitstream selection.
112                                                      This parameter can be a value of @ref MDF_FilterBitstream */
113 } MDF_InitTypeDef;
114 
115 /**
116   * @brief  MDF handle structure definition
117   */
118 #if (USE_HAL_MDF_REGISTER_CALLBACKS == 1)
119 typedef struct __MDF_HandleTypeDef
120 #else
121 typedef struct
122 #endif /* USE_HAL_MDF_REGISTER_CALLBACKS */
123 {
124   MDF_Filter_TypeDef        *Instance;  /*!< MDF instance */
125   MDF_InitTypeDef            Init;      /*!< MDF init parameters */
126   DMA_HandleTypeDef         *hdma;      /*!< Pointer on DMA handler for acquisitions */
127   __IO HAL_MDF_StateTypeDef  State;     /*!< MDF state */
128   __IO uint32_t              ErrorCode; /*!< MDF error code */
129 #if (USE_HAL_MDF_REGISTER_CALLBACKS == 1)
130   void (*AcqCpltCallback)(struct __MDF_HandleTypeDef *hmdf);      /*!< MDF acquisition complete callback */
131   void (*AcqHalfCpltCallback)(struct __MDF_HandleTypeDef *hmdf);  /*!< MDF acquisition half complete callback */
132   void (*SndLvCallback)(struct __MDF_HandleTypeDef *hmdf,
133                         uint32_t SoundLevel,
134                         uint32_t AmbientNoise);                   /*!< MDF sound level callback */
135   void (*SadCallback)(struct __MDF_HandleTypeDef *hmdf);          /*!< MDF sound activity detector callback */
136   void (*ErrorCallback)(struct __MDF_HandleTypeDef *hmdf);        /*!< MDF error callback */
137   void (*MspInitCallback)(struct __MDF_HandleTypeDef *hmdf);      /*!< MDF MSP init callback */
138   void (*MspDeInitCallback)(struct __MDF_HandleTypeDef *hmdf);    /*!< MDF MSP de-init callback */
139 #endif /* USE_HAL_MDF_REGISTER_CALLBACKS */
140 } MDF_HandleTypeDef;
141 
142 #if (USE_HAL_MDF_REGISTER_CALLBACKS == 1)
143 /**
144   * @brief  MDF callback ID enumeration definition
145   */
146 typedef enum
147 {
148   HAL_MDF_ACQ_COMPLETE_CB_ID     = 0x01U, /*!< MDF acquisition complete callback ID */
149   HAL_MDF_ACQ_HALFCOMPLETE_CB_ID = 0x02U, /*!< MDF acquisition half complete callback ID */
150   HAL_MDF_SNDLVL_CB_ID           = 0x03U, /*!< MDF sound level callback ID */
151   HAL_MDF_SAD_CB_ID              = 0x04U, /*!< MDF sound activity detector callback ID */
152   HAL_MDF_ERROR_CB_ID            = 0x05U, /*!< MDF error callback ID */
153   HAL_MDF_MSPINIT_CB_ID          = 0x06U, /*!< MDF MSP init callback ID */
154   HAL_MDF_MSPDEINIT_CB_ID        = 0x07U  /*!< MDF MSP de-init callback ID */
155 } HAL_MDF_CallbackIDTypeDef;
156 
157 /**
158   * @brief  MDF callback pointers definition
159   */
160 typedef void (*pMDF_CallbackTypeDef)(MDF_HandleTypeDef *hmdf);
161 typedef void (*pMDF_SndLvlCallbackTypeDef)(MDF_HandleTypeDef *hmdf, uint32_t SoundLevel, uint32_t AmbientNoise);
162 #endif /* USE_HAL_MDF_REGISTER_CALLBACKS */
163 
164 /**
165   * @brief  MDF reshape filter structure definition
166   */
167 typedef struct
168 {
169   FunctionalState  Activation;       /*!< Reshape filter enable/disable */
170   uint32_t         DecimationRatio;  /*!< Reshape filter decimation ratio.
171                                           This parameter can be a value of @ref MDF_ReshapeDecimationRatio */
172 } MDF_ReshapeFilterTypeDef;
173 
174 /**
175   * @brief  MDF high pass filter structure definition
176   */
177 typedef struct
178 {
179   FunctionalState  Activation;       /*!< High pass filter enable/disable */
180   uint32_t         CutOffFrequency;  /*!< High pass filter cut-off frequency.
181                                           This parameter can be a value of @ref MDF_HighPassCutOffFreq */
182 } MDF_HighPassFilterTypeDef;
183 
184 /**
185   * @brief  MDF sound activity structure definition
186   */
187 typedef struct
188 {
189   FunctionalState  Activation;            /*!< Sound activity detector enable/disable */
190   uint32_t         Mode;                  /*!< Sound activity detector mode.
191                                                This parameter can be a value of @ref MDF_SadMode */
192   uint32_t         FrameSize;             /*!< Size of one frame to compute short-term signal level.
193                                                This parameter can be a value of @ref MDF_SadFrameSize */
194   FunctionalState  Hysteresis;            /*!< Hysteresis enable/disable.
195                                                @note This parameter is not used if Mode is set
196                                                      to MDF_SAD_AMBIENT_NOISE_ESTIMATOR */
197   uint32_t         SoundTriggerEvent;     /*!< Sound trigger event configuration.
198                                                This parameter can be a value of @ref MDF_SadSoundTriggerEvent */
199   uint32_t         DataMemoryTransfer;    /*!< Data memory transfer mode.
200                                                This parameter can be a value of @ref MDF_SadDataMemoryTransfer */
201   uint32_t         MinNoiseLevel;         /*!< Minimum noise level.
202                                                This parameter must be a number between Min_Data = 0
203                                                and Max_Data = 8191 */
204   uint32_t         HangoverWindow;        /*!< Hangover time window in frames.
205                                                This parameter can be a value of @ref MDF_SadHangoverWindow */
206   uint32_t         LearningFrames;        /*!< Number of learning frames for the first estimation of noise level.
207                                                This parameter can be a value of @ref MDF_SadLearningFrames */
208   uint32_t         AmbientNoiseSlope;     /*!< Ambient noise slope control.
209                                                This parameter must be a number between Min_Data = 0 and Max_Data = 7.
210                                                @note This parameter is not used if Mode is set
211                                                      to MDF_SAD_SOUND_DETECTOR */
212   uint32_t         SignalNoiseThreshold;  /*!< Signal to noise threshold.
213                                                This parameter can be a value of @ref MDF_SadSignalNoiseThreshold */
214   FunctionalState  SoundLevelInterrupt;   /*!< Sound level interrupt enable/disable.
215                                                @note This interrupt is mainly used for debug purpose */
216 } MDF_SoundActivityTypeDef;
217 
218 /**
219   * @brief  MDF filter trigger structure definition
220   */
221 typedef struct
222 {
223   uint32_t  Source;  /*!< Filter trigger source.
224                           This parameter can be a value of @ref MDF_FilterTriggerSource */
225   uint32_t  Edge;    /*!< Filter trigger edge.
226                           This parameter can be a value of @ref MDF_FilterTriggerEdge */
227 } MDF_FilterTriggerTypeDef;
228 
229 /**
230   * @brief  MDF filter configuration structure definition
231   */
232 typedef struct
233 {
234   uint32_t                  DataSource;      /*!< Filter data source.
235                                                   This parameter can be a value of @ref MDF_DataSource */
236   uint32_t                  Delay;           /*!< Delay to apply on data source in number of samples.
237                                                   This parameter must be a number between Min_Data = 0
238                                                   and Max_Data = 127 */
239   uint32_t                  CicMode;         /*!< CIC filter mode.
240                                                   This parameter can be a value of @ref MDF_CicMode */
241   uint32_t                  DecimationRatio; /*!< Filter decimation ratio.
242                                                   This parameter must be a number between Min_Data = 2
243                                                   and Max_Data = 512 */
244   int32_t                   Gain;            /*!< Filter gain in step of around 3db (from -48db to 72dB).
245                                                   This parameter must be a number between Min_Data = -16
246                                                   and Max_Data = 24 */
247   MDF_ReshapeFilterTypeDef  ReshapeFilter;   /*!< Reshape filter configuration */
248   MDF_HighPassFilterTypeDef HighPassFilter;  /*!< High pass filter configuration */
249   MDF_SoundActivityTypeDef  SoundActivity;   /*!< Sound activity detector configuration */
250   uint32_t                  AcquisitionMode; /*!< Filter acquisition mode.
251                                                   This parameter can be a value of @ref MDF_AcquisitionMode */
252   uint32_t                  FifoThreshold;   /*!< Filter RXFIFO threshold.
253                                                   This parameter can be a value of @ref MDF_FifoThreshold */
254   uint32_t                  DiscardSamples;  /*!< Number of samples to discard after filter enable.
255                                                   This parameter must be a number between Min_Data = 0
256                                                   and Max_Data = 255 */
257   MDF_FilterTriggerTypeDef  Trigger;         /*!< Filter trigger configuration.
258                                                   @note This parameter is not used if AcquisitionMode is set
259                                                         to MDF_MODE_ASYNC_CONT or MDF_MODE_ASYNC_SINGLE */
260 } MDF_FilterConfigTypeDef;
261 
262 /**
263   * @brief  MDF DMA configuration structure definition
264   */
265 typedef struct
266 {
267   uint32_t         Address;     /*!< DMA destination address */
268   uint32_t         DataLength;  /*!< Length of data to transfer in bytes */
269   FunctionalState  MsbOnly;     /*!< Transfer only the 16MSB of the acquistion data */
270 } MDF_DmaConfigTypeDef;
271 
272 /**
273   * @}
274   */
275 
276 /* Exported constants --------------------------------------------------------*/
277 /** @defgroup MDF_Exported_Constants  MDF Exported Constants
278   * @{
279   */
280 
281 /** @defgroup MDF_ErrorCode MDF error code
282   * @{
283   */
284 #define MDF_ERROR_NONE                  0x00000000U /*!< No error */
285 #define MDF_ERROR_ACQUISITION_OVERFLOW  0x00000001U /*!< Overflow occurs during acquisition */
286 #define MDF_ERROR_RSF_OVERRUN           0x00000002U /*!< Overrun occurs on reshape filter */
287 #define MDF_ERROR_CLOCK_ABSENCE         0x00000004U /*!< Clock absence detection occurs */
288 #define MDF_ERROR_SATURATION            0x00000010U /*!< Saturation detection occurs */
289 #define MDF_ERROR_DMA                   0x00000040U /*!< DMA error occurs */
290 #if (USE_HAL_MDF_REGISTER_CALLBACKS == 1)
291 #define MDF_ERROR_INVALID_CALLBACK      0x00000080U /*!< Invalid callback error occurs */
292 #endif /* USE_HAL_MDF_REGISTER_CALLBACKS */
293 /**
294   * @}
295   */
296 
297 /** @defgroup MDF_ClockTriggerSource MDF output clock trigger source
298   * @{
299   */
300 #define MDF_CLOCK_TRIG_TRGO    0x00000000U
301 #define MDF_CLOCK_TRIG_EXTI15  MDF_CKGCR_TRGSRC_1
302 /**
303   * @}
304   */
305 
306 /** @defgroup MDF_ClockTriggerEdge MDF output clock trigger edge
307   * @{
308   */
309 #define MDF_CLOCK_TRIG_RISING_EDGE   0x00000000U        /*!< Rising edge */
310 #define MDF_CLOCK_TRIG_FALLING_EDGE  MDF_CKGCR_TRGSENS  /*!< Falling edge */
311 /**
312   * @}
313   */
314 
315 /** @defgroup MDF_OuputClockPins MDF output clock pins
316   * @{
317   */
318 #define MDF_OUTPUT_CLOCK_0    MDF_CKGCR_CCK0DIR      /*!< MDF_CCK0 is used as output clock */
319 #define MDF_OUTPUT_CLOCK_1    MDF_CKGCR_CCK1DIR      /*!< MDF_CCK1 is used as output clock */
320 #define MDF_OUTPUT_CLOCK_ALL (MDF_CKGCR_CCK0DIR | \
321                               MDF_CKGCR_CCK1DIR)     /*!< MDF_CCK0 and MDF_CCK1 are used as output clock */
322 /**
323   * @}
324   */
325 
326 /** @defgroup MDF_SitfMode MDF serial interface mode
327   * @{
328   */
329 #define MDF_SITF_LF_MASTER_SPI_MODE       0x00000000U           /*!< Low frequency master SPI mode */
330 #define MDF_SITF_NORMAL_SPI_MODE          MDF_SITFCR_SITFMOD_0  /*!< Normal SPI mode */
331 #define MDF_SITF_MANCHESTER_FALLING_MODE  MDF_SITFCR_SITFMOD_1  /*!< Manchester mode rising edge logic 0
332                                                                      and falling edge logic 1 */
333 #define MDF_SITF_MANCHESTER_RISING_MODE   MDF_SITFCR_SITFMOD    /*!< Manchester mode rising edge logic 1
334                                                                      and falling edge logic 0 */
335 /**
336   * @}
337   */
338 
339 /** @defgroup MDF_SitfClockSource MDF serial interface clock source
340   * @{
341   */
342 #define MDF_SITF_CCK0_SOURCE  0x00000000U          /*!< Common clock 0 source */
343 #define MDF_SITF_CCK1_SOURCE  MDF_SITFCR_SCKSRC_0  /*!< Common clock 1 source */
344 /**
345   * @}
346   */
347 
348 /** @defgroup MDF_FilterBitstream MDF filter bitstream
349   * @{
350   */
351 #define MDF_BITSTREAM0_RISING   0x00000000U
352 #define MDF_BITSTREAM0_FALLING  MDF_BSMXCR_BSSEL_0
353 /**
354   * @}
355   */
356 
357 /** @defgroup MDF_ReshapeDecimationRatio MDF reshape filter decimation ratio
358   * @{
359   */
360 #define MDF_RSF_DECIMATION_RATIO_4  0x00000000U          /*!< Reshape filter decimation ratio is 4 */
361 #define MDF_RSF_DECIMATION_RATIO_1  MDF_DFLTRSFR_RSFLTD  /*!< Reshape filter decimation ratio is 1 */
362 /**
363   * @}
364   */
365 
366 /** @defgroup MDF_HighPassCutOffFreq MDF high pass filter cut-off frequency
367   * @{
368   */
369 #define MDF_HPF_CUTOFF_0_000625FPCM  0x00000000U          /*!< Cut-off frequency of 0.000625xFpcm */
370 #define MDF_HPF_CUTOFF_0_00125FPCM   MDF_DFLTRSFR_HPFC_0  /*!< Cut-off frequency of 0.00125xFpcm */
371 #define MDF_HPF_CUTOFF_0_0025FPCM    MDF_DFLTRSFR_HPFC_1  /*!< Cut-off frequency of 0.0025xFpcm */
372 #define MDF_HPF_CUTOFF_0_0095FPCM    MDF_DFLTRSFR_HPFC    /*!< Cut-off frequency of 0.0095xFpcm */
373 /**
374   * @}
375   */
376 
377 /** @defgroup MDF_SadMode MDF sound activity detector mode
378   * @{
379   */
380 #define MDF_SAD_VOICE_ACTIVITY_DETECTOR  0x00000000U         /*!< Voice activity detector */
381 #define MDF_SAD_SOUND_DETECTOR           MDF_SADCR_SADMOD_0  /*!< Sound detector */
382 #define MDF_SAD_AMBIENT_NOISE_DETECTOR   MDF_SADCR_SADMOD    /*!< Ambient noise detector */
383 /**
384   * @}
385   */
386 
387 /** @defgroup MDF_SadFrameSize MDF sound activity detector frame size
388   * @{
389   */
390 #define MDF_SAD_8_PCM_SAMPLES    0x00000000U                               /*!< Frame size of 8 PCM samples */
391 #define MDF_SAD_16_PCM_SAMPLES   MDF_SADCR_FRSIZE_0                        /*!< Frame size of 16 PCM samples */
392 #define MDF_SAD_32_PCM_SAMPLES   MDF_SADCR_FRSIZE_1                        /*!< Frame size of 32 PCM samples */
393 #define MDF_SAD_64_PCM_SAMPLES  (MDF_SADCR_FRSIZE_0 | MDF_SADCR_FRSIZE_1)  /*!< Frame size of 64 PCM samples */
394 #define MDF_SAD_128_PCM_SAMPLES  MDF_SADCR_FRSIZE_2                        /*!< Frame size of 128 PCM samples */
395 #define MDF_SAD_256_PCM_SAMPLES (MDF_SADCR_FRSIZE_0 | MDF_SADCR_FRSIZE_2)  /*!< Frame size of 256 PCM samples */
396 #define MDF_SAD_512_PCM_SAMPLES  MDF_SADCR_FRSIZE                          /*!< Frame size of 512 PCM samples */
397 /**
398   * @}
399   */
400 
401 /** @defgroup MDF_SadSoundTriggerEvent MDF sound activity detector trigger event
402   * @{
403   */
404 #define MDF_SAD_ENTER_DETECT       0x00000000U       /*!< Event when SAD enters in detect state */
405 #define MDF_SAD_ENTER_EXIT_DETECT  MDF_SADCR_DETCFG  /*!< Event when SAD enters or exits from detect state */
406 /**
407   * @}
408   */
409 
410 /** @defgroup MDF_SadDataMemoryTransfer MDF sound activity detector data memory transfer mode
411   * @{
412   */
413 #define MDF_SAD_NO_MEMORY_TRANSFER         0x00000000U         /*!< No memory transfer */
414 #define MDF_SAD_MEMORY_TRANSFER_IN_DETECT  MDF_SADCR_DATCAP_0  /*!< Memory transfer only in detect state */
415 #define MDF_SAD_MEMORY_TRANSFER_ALWAYS     MDF_SADCR_DATCAP    /*!< Memory transfer always */
416 /**
417   * @}
418   */
419 
420 /** @defgroup MDF_SadHangoverWindow MDF sound activity detector data hangover time window
421   * @{
422   */
423 #define MDF_SAD_HANGOVER_4_FRAMES    0x00000000U              /*!< Hangover window of 4 frames */
424 #define MDF_SAD_HANGOVER_8_FRAMES    MDF_SADCFGR_HGOVR_0      /*!< Hangover window of 8 frames */
425 #define MDF_SAD_HANGOVER_16_FRAMES   MDF_SADCFGR_HGOVR_1      /*!< Hangover window of 16 frames */
426 #define MDF_SAD_HANGOVER_32_FRAMES  (MDF_SADCFGR_HGOVR_0 | \
427                                      MDF_SADCFGR_HGOVR_1)     /*!< Hangover window of 32 frames */
428 #define MDF_SAD_HANGOVER_64_FRAMES   MDF_SADCFGR_HGOVR_2      /*!< Hangover window of 64 frames */
429 #define MDF_SAD_HANGOVER_128_FRAMES (MDF_SADCFGR_HGOVR_0 | \
430                                      MDF_SADCFGR_HGOVR_2)     /*!< Hangover window of 128 frames */
431 #define MDF_SAD_HANGOVER_256_FRAMES (MDF_SADCFGR_HGOVR_1 | \
432                                      MDF_SADCFGR_HGOVR_2)     /*!< Hangover window of 256 frames */
433 #define MDF_SAD_HANGOVER_512_FRAMES (MDF_SADCFGR_HGOVR_0 | \
434                                      MDF_SADCFGR_HGOVR_1 | \
435                                      MDF_SADCFGR_HGOVR_2)     /*!< Hangover window of 512 frames */
436 /**
437   * @}
438   */
439 
440 /** @defgroup MDF_SadLearningFrames MDF sound activity detector data learning frames
441   * @{
442   */
443 #define MDF_SAD_LEARNING_2_FRAMES   0x00000000U                                 /*!< 2 learning frames */
444 #define MDF_SAD_LEARNING_4_FRAMES   MDF_SADCFGR_LFRNB_0                         /*!< 4 learning frames */
445 #define MDF_SAD_LEARNING_8_FRAMES   MDF_SADCFGR_LFRNB_1                         /*!< 8 learning frames */
446 #define MDF_SAD_LEARNING_16_FRAMES (MDF_SADCFGR_LFRNB_0 | MDF_SADCFGR_LFRNB_1)  /*!< 16 learning frames */
447 #define MDF_SAD_LEARNING_32_FRAMES  MDF_SADCFGR_LFRNB                           /*!< 32 learning frames */
448 /**
449   * @}
450   */
451 
452 /** @defgroup MDF_SadSignalNoiseThreshold MDF sound activity detector data signal to noise threshold
453   * @{
454   */
455 #define MDF_SAD_SIGNAL_NOISE_3_5DB   0x00000000U              /*!< Signal to noise threshold is 3.5dB */
456 #define MDF_SAD_SIGNAL_NOISE_6DB     MDF_SADCFGR_SNTHR_0      /*!< Signal to noise threshold is 6dB */
457 #define MDF_SAD_SIGNAL_NOISE_9_5DB   MDF_SADCFGR_SNTHR_1      /*!< Signal to noise threshold is 9.5dB */
458 #define MDF_SAD_SIGNAL_NOISE_12DB   (MDF_SADCFGR_SNTHR_0 | \
459                                      MDF_SADCFGR_SNTHR_1)     /*!< Signal to noise threshold is 12dB */
460 #define MDF_SAD_SIGNAL_NOISE_15_6DB  MDF_SADCFGR_SNTHR_2      /*!< Signal to noise threshold is 15.6dB */
461 #define MDF_SAD_SIGNAL_NOISE_18DB   (MDF_SADCFGR_SNTHR_0 | \
462                                      MDF_SADCFGR_SNTHR_2)     /*!< Signal to noise threshold is 18dB */
463 #define MDF_SAD_SIGNAL_NOISE_21_6DB (MDF_SADCFGR_SNTHR_1 | \
464                                      MDF_SADCFGR_SNTHR_2)     /*!< Signal to noise threshold is 21.6dB */
465 #define MDF_SAD_SIGNAL_NOISE_24_1DB (MDF_SADCFGR_SNTHR_0 | \
466                                      MDF_SADCFGR_SNTHR_1 | \
467                                      MDF_SADCFGR_SNTHR_2)     /*!< Signal to noise threshold is 24.1dB */
468 #define MDF_SAD_SIGNAL_NOISE_27_6DB  MDF_SADCFGR_SNTHR_3      /*!< Signal to noise threshold is 27.6dB */
469 #define MDF_SAD_SIGNAL_NOISE_30_1DB (MDF_SADCFGR_SNTHR_0 | \
470                                      MDF_SADCFGR_SNTHR_3)     /*!< Signal to noise threshold is 30.1dB */
471 /**
472   * @}
473   */
474 
475 /** @defgroup MDF_FilterTriggerSource MDF filter trigger source
476   * @{
477   */
478 #define MDF_FILTER_TRIG_TRGO    0x00000000U
479 #define MDF_FILTER_TRIG_EXTI15  MDF_DFLTCR_TRGSRC_1
480 /**
481   * @}
482   */
483 
484 /** @defgroup MDF_FilterTriggerEdge MDF filter trigger edge
485   * @{
486   */
487 #define MDF_FILTER_TRIG_RISING_EDGE   0x00000000U         /*!< Rising edge */
488 #define MDF_FILTER_TRIG_FALLING_EDGE  MDF_DFLTCR_TRGSENS  /*!< Falling edge */
489 /**
490   * @}
491   */
492 
493 /** @defgroup MDF_DataSource MDF data source
494   * @{
495   */
496 #define MDF_DATA_SOURCE_BSMX     0x00000000U            /*!< Data from bitstream matrix */
497 #define MDF_DATA_SOURCE_ADCITF1  MDF_DFLTCICR_DATSRC_1  /*!< Data from ADC interface 1 */
498 #define MDF_DATA_SOURCE_ADCITF2  MDF_DFLTCICR_DATSRC    /*!< Data from ADC interface 2 */
499 /**
500   * @}
501   */
502 
503 /** @defgroup MDF_CicMode MDF CIC mode
504   * @{
505   */
506 #define MDF_ONE_FILTER_SINC4  MDF_DFLTCICR_CICMOD_2      /*!< One filter in Sinc4 order */
507 #define MDF_ONE_FILTER_SINC5 (MDF_DFLTCICR_CICMOD_0 | \
508                               MDF_DFLTCICR_CICMOD_2)     /*!< One filter in Sinc5 order */
509 /**
510   * @}
511   */
512 
513 /** @defgroup MDF_AcquisitionMode MDF acquisition mode
514   * @{
515   */
516 #define MDF_MODE_ASYNC_CONT     0x00000000U              /*!< Asynchronous, continuous acquisition mode */
517 #define MDF_MODE_ASYNC_SINGLE   MDF_DFLTCR_ACQMOD_0      /*!< Asynchronous, single-shot acquisition mode.
518                                                               @note Not available with SAD usage */
519 #define MDF_MODE_SYNC_CONT      MDF_DFLTCR_ACQMOD_1      /*!< Synchronous, continuous acquisition mode */
520 #define MDF_MODE_SYNC_SINGLE   (MDF_DFLTCR_ACQMOD_0 | \
521                                 MDF_DFLTCR_ACQMOD_1)     /*!< Synchronous, single-shot acquisition mode.
522                                                               @note Not available with SAD usage */
523 #define MDF_MODE_WINDOW_CONT    MDF_DFLTCR_ACQMOD_2      /*!< Window, continuous acquisition mode.
524                                                               @note Not available with SAD usage */
525 /**
526   * @}
527   */
528 
529 /** @defgroup MDF_FifoThreshold MDF RXFIFO threshold
530   * @{
531   */
532 #define MDF_FIFO_THRESHOLD_NOT_EMPTY  0x00000000U     /*!< Event generated when RXFIFO is not empty */
533 #define MDF_FIFO_THRESHOLD_HALF_FULL  MDF_DFLTCR_FTH  /*!< Event generated when RXFIFO is half_full */
534 /**
535   * @}
536   */
537 
538 /**
539   * @}
540   */
541 
542 /* Exported macro ------------------------------------------------------------*/
543 /** @defgroup MDF_Exported_Macros  MDF Exported Macros
544   * @{
545   */
546 
547 /** @brief  Reset MDF handle state.
548   * @param  __HANDLE__ MDF handle.
549   * @retval None
550   */
551 #if (USE_HAL_MDF_REGISTER_CALLBACKS == 1)
552 #define __HAL_MDF_RESET_HANDLE_STATE(__HANDLE__) do{                                             \
553                                                       (__HANDLE__)->State = HAL_MDF_STATE_RESET; \
554                                                       (__HANDLE__)->MspInitCallback = NULL;      \
555                                                       (__HANDLE__)->MspDeInitCallback = NULL;    \
556                                                     } while(0)
557 #else /* USE_HAL_MDF_REGISTER_CALLBACKS */
558 #define __HAL_MDF_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_MDF_STATE_RESET)
559 #endif /* USE_HAL_MDF_REGISTER_CALLBACKS */
560 
561 /**
562   * @}
563   */
564 
565 /* Exported functions --------------------------------------------------------*/
566 /** @addtogroup MDF_Exported_Functions
567   * @{
568   */
569 
570 /* Initialization and de-initialization functions  ****************************/
571 /** @addtogroup MDF_Exported_Functions_Group1
572   * @{
573   */
574 HAL_StatusTypeDef HAL_MDF_Init(MDF_HandleTypeDef *hmdf);
575 HAL_StatusTypeDef HAL_MDF_DeInit(MDF_HandleTypeDef *hmdf);
576 void              HAL_MDF_MspInit(MDF_HandleTypeDef *hmdf);
577 void              HAL_MDF_MspDeInit(MDF_HandleTypeDef *hmdf);
578 #if (USE_HAL_MDF_REGISTER_CALLBACKS == 1)
579 HAL_StatusTypeDef HAL_MDF_RegisterCallback(MDF_HandleTypeDef        *hmdf,
580                                            HAL_MDF_CallbackIDTypeDef CallbackID,
581                                            pMDF_CallbackTypeDef      pCallback);
582 HAL_StatusTypeDef HAL_MDF_UnRegisterCallback(MDF_HandleTypeDef        *hmdf,
583                                              HAL_MDF_CallbackIDTypeDef CallbackID);
584 HAL_StatusTypeDef HAL_MDF_RegisterSndLvlCallback(MDF_HandleTypeDef         *hmdf,
585                                                  pMDF_SndLvlCallbackTypeDef pCallback);
586 HAL_StatusTypeDef HAL_MDF_UnRegisterSndLvlCallback(MDF_HandleTypeDef *hmdf);
587 #endif /* USE_HAL_MDF_REGISTER_CALLBACKS */
588 /**
589   * @}
590   */
591 
592 /* Acquisition functions  *****************************************************/
593 /** @addtogroup MDF_Exported_Functions_Group2
594   * @{
595   */
596 HAL_StatusTypeDef HAL_MDF_AcqStart(MDF_HandleTypeDef *hmdf, const MDF_FilterConfigTypeDef *pFilterConfig);
597 HAL_StatusTypeDef HAL_MDF_PollForAcq(MDF_HandleTypeDef *hmdf, uint32_t Timeout);
598 HAL_StatusTypeDef HAL_MDF_GetAcqValue(const MDF_HandleTypeDef *hmdf, int32_t *pValue);
599 HAL_StatusTypeDef HAL_MDF_AcqStop(MDF_HandleTypeDef *hmdf);
600 HAL_StatusTypeDef HAL_MDF_AcqStart_IT(MDF_HandleTypeDef *hmdf, const MDF_FilterConfigTypeDef *pFilterConfig);
601 HAL_StatusTypeDef HAL_MDF_AcqStop_IT(MDF_HandleTypeDef *hmdf);
602 HAL_StatusTypeDef HAL_MDF_AcqStart_DMA(MDF_HandleTypeDef *hmdf, const MDF_FilterConfigTypeDef *pFilterConfig,
603                                        const MDF_DmaConfigTypeDef *pDmaConfig);
604 HAL_StatusTypeDef HAL_MDF_AcqStop_DMA(MDF_HandleTypeDef *hmdf);
605 HAL_StatusTypeDef HAL_MDF_GenerateTrgo(const MDF_HandleTypeDef *hmdf);
606 HAL_StatusTypeDef HAL_MDF_SetDelay(MDF_HandleTypeDef *hmdf, uint32_t Delay);
607 HAL_StatusTypeDef HAL_MDF_GetDelay(const MDF_HandleTypeDef *hmdf, uint32_t *pDelay);
608 HAL_StatusTypeDef HAL_MDF_SetGain(MDF_HandleTypeDef *hmdf, int32_t Gain);
609 HAL_StatusTypeDef HAL_MDF_GetGain(const MDF_HandleTypeDef *hmdf, int32_t *pGain);
610 HAL_StatusTypeDef HAL_MDF_PollForSndLvl(MDF_HandleTypeDef *hmdf, uint32_t Timeout, uint32_t *pSoundLevel,
611                                         uint32_t *pAmbientNoise);
612 HAL_StatusTypeDef HAL_MDF_PollForSad(MDF_HandleTypeDef *hmdf, uint32_t Timeout);
613 void              HAL_MDF_AcqCpltCallback(MDF_HandleTypeDef *hmdf);
614 void              HAL_MDF_AcqHalfCpltCallback(MDF_HandleTypeDef *hmdf);
615 void              HAL_MDF_SndLvlCallback(MDF_HandleTypeDef *hmdf, uint32_t SoundLevel, uint32_t AmbientNoise);
616 void              HAL_MDF_SadCallback(MDF_HandleTypeDef *hmdf);
617 /**
618   * @}
619   */
620 
621 /* Clock absence detection functions  *****************************************/
622 /** @addtogroup MDF_Exported_Functions_Group3
623   * @{
624   */
625 HAL_StatusTypeDef HAL_MDF_PollForCkab(MDF_HandleTypeDef *hmdf, uint32_t Timeout);
626 HAL_StatusTypeDef HAL_MDF_CkabStart_IT(MDF_HandleTypeDef *hmdf);
627 HAL_StatusTypeDef HAL_MDF_CkabStop_IT(MDF_HandleTypeDef *hmdf);
628 /**
629   * @}
630   */
631 
632 /* Generic functions  *********************************************************/
633 /** @addtogroup MDF_Exported_Functions_Group4
634   * @{
635   */
636 void                 HAL_MDF_IRQHandler(MDF_HandleTypeDef *hmdf);
637 void                 HAL_MDF_ErrorCallback(MDF_HandleTypeDef *hmdf);
638 HAL_MDF_StateTypeDef HAL_MDF_GetState(const MDF_HandleTypeDef *hmdf);
639 uint32_t             HAL_MDF_GetError(const MDF_HandleTypeDef *hmdf);
640 /**
641   * @}
642   */
643 
644 /**
645   * @}
646   */
647 
648 /* Private macros ------------------------------------------------------------*/
649 /** @defgroup MDF_Private_Macros  MDF Private Macros
650   * @{
651   */
652 #define IS_MDF_FILTER_BITSTREAM(PARAM) (((PARAM) == MDF_BITSTREAM0_RISING) || \
653                                         ((PARAM) == MDF_BITSTREAM0_FALLING))
654 
655 #define IS_MDF_PROC_CLOCK_DIVIDER(PARAM) ((1U <= (PARAM)) && ((PARAM) <= 128U))
656 
657 #define IS_MDF_OUTPUT_CLOCK_PINS(PARAM) (((PARAM) == MDF_OUTPUT_CLOCK_0) || \
658                                          ((PARAM) == MDF_OUTPUT_CLOCK_1) || \
659                                          ((PARAM) == MDF_OUTPUT_CLOCK_ALL))
660 
661 #define IS_MDF_OUTPUT_CLOCK_DIVIDER(PARAM) ((1U <= (PARAM)) && ((PARAM) <= 16U))
662 
663 #define IS_MDF_OUTPUT_CLOCK_TRIGGER_SOURCE(PARAM) (((PARAM) == MDF_CLOCK_TRIG_TRGO) || \
664                                                    ((PARAM) == MDF_CLOCK_TRIG_EXTI15))
665 
666 #define IS_MDF_OUTPUT_CLOCK_TRIGGER_EDGE(PARAM) (((PARAM) == MDF_CLOCK_TRIG_RISING_EDGE) || \
667                                                  ((PARAM) == MDF_CLOCK_TRIG_FALLING_EDGE))
668 
669 #define IS_MDF_SITF_MODE(PARAM) (((PARAM) == MDF_SITF_LF_MASTER_SPI_MODE)      || \
670                                  ((PARAM) == MDF_SITF_NORMAL_SPI_MODE)         || \
671                                  ((PARAM) == MDF_SITF_MANCHESTER_FALLING_MODE) || \
672                                  ((PARAM) == MDF_SITF_MANCHESTER_RISING_MODE))
673 
674 #define IS_MDF_SITF_CLOCK_SOURCE(PARAM) (((PARAM) == MDF_SITF_CCK0_SOURCE) || \
675                                          ((PARAM) == MDF_SITF_CCK1_SOURCE))
676 
677 #define IS_MDF_SITF_THRESHOLD(PARAM) ((4U <= (PARAM)) && ((PARAM) <= 31U))
678 
679 #define IS_MDF_CIC_MODE(PARAM) (((PARAM) == MDF_ONE_FILTER_SINC4) || \
680                                 ((PARAM) == MDF_ONE_FILTER_SINC5))
681 
682 #define IS_MDF_ACQUISITION_MODE(PARAM) (((PARAM) == MDF_MODE_ASYNC_CONT)   || \
683                                         ((PARAM) == MDF_MODE_ASYNC_SINGLE) || \
684                                         ((PARAM) == MDF_MODE_SYNC_CONT)    || \
685                                         ((PARAM) == MDF_MODE_SYNC_SINGLE)  || \
686                                         ((PARAM) == MDF_MODE_WINDOW_CONT))
687 
688 #define IS_MDF_DISCARD_SAMPLES(PARAM) ((PARAM) <= 255U)
689 
690 #define IS_MDF_FIFO_THRESHOLD(PARAM) (((PARAM) == MDF_FIFO_THRESHOLD_NOT_EMPTY) || \
691                                       ((PARAM) == MDF_FIFO_THRESHOLD_HALF_FULL))
692 
693 #define IS_MDF_TRIGGER_SOURCE(PARAM) (((PARAM) == MDF_FILTER_TRIG_TRGO) || \
694                                       ((PARAM) == MDF_FILTER_TRIG_EXTI15))
695 
696 #define IS_MDF_TRIGGER_EDGE(PARAM) (((PARAM) == MDF_FILTER_TRIG_RISING_EDGE) || \
697                                     ((PARAM) == MDF_FILTER_TRIG_FALLING_EDGE))
698 
699 #define IS_MDF_DATA_SOURCE(PARAM) (((PARAM) == MDF_DATA_SOURCE_BSMX)    || \
700                                    ((PARAM) == MDF_DATA_SOURCE_ADCITF1) || \
701                                    ((PARAM) == MDF_DATA_SOURCE_ADCITF2))
702 
703 #define IS_MDF_DECIMATION_RATIO(PARAM) ((2U <= (PARAM)) && ((PARAM) <= 512U))
704 
705 #define IS_MDF_GAIN(PARAM) ((-16 <= (PARAM)) && ((PARAM) <= 24))
706 
707 #define IS_MDF_DELAY(PARAM) ((PARAM) <= 127U)
708 
709 #define IS_MDF_RSF_DECIMATION_RATIO(PARAM) (((PARAM) == MDF_RSF_DECIMATION_RATIO_4) || \
710                                             ((PARAM) == MDF_RSF_DECIMATION_RATIO_1))
711 
712 #define IS_MDF_HPF_CUTOFF_FREQ(PARAM) (((PARAM) == MDF_HPF_CUTOFF_0_000625FPCM) || \
713                                        ((PARAM) == MDF_HPF_CUTOFF_0_00125FPCM)  || \
714                                        ((PARAM) == MDF_HPF_CUTOFF_0_0025FPCM)   || \
715                                        ((PARAM) == MDF_HPF_CUTOFF_0_0095FPCM))
716 
717 #define IS_MDF_SAD_MODE(PARAM) (((PARAM) == MDF_SAD_VOICE_ACTIVITY_DETECTOR) || \
718                                 ((PARAM) == MDF_SAD_SOUND_DETECTOR)          || \
719                                 ((PARAM) == MDF_SAD_AMBIENT_NOISE_DETECTOR))
720 
721 #define IS_MDF_SAD_FRAME_SIZE(PARAM) (((PARAM) == MDF_SAD_8_PCM_SAMPLES)   || \
722                                       ((PARAM) == MDF_SAD_16_PCM_SAMPLES)  || \
723                                       ((PARAM) == MDF_SAD_32_PCM_SAMPLES)  || \
724                                       ((PARAM) == MDF_SAD_64_PCM_SAMPLES)  || \
725                                       ((PARAM) == MDF_SAD_128_PCM_SAMPLES) || \
726                                       ((PARAM) == MDF_SAD_256_PCM_SAMPLES) || \
727                                       ((PARAM) == MDF_SAD_512_PCM_SAMPLES))
728 
729 #define IS_MDF_SAD_SOUND_TRIGGER(PARAM) (((PARAM) == MDF_SAD_ENTER_DETECT) || \
730                                          ((PARAM) == MDF_SAD_ENTER_EXIT_DETECT))
731 
732 #define IS_MDF_SAD_DATA_MEMORY_TRANSFER(PARAM) (((PARAM) == MDF_SAD_NO_MEMORY_TRANSFER)        || \
733                                                 ((PARAM) == MDF_SAD_MEMORY_TRANSFER_IN_DETECT) || \
734                                                 ((PARAM) == MDF_SAD_MEMORY_TRANSFER_ALWAYS))
735 
736 #define IS_MDF_SAD_MIN_NOISE_LEVEL(PARAM) ((PARAM) <= 8191U)
737 
738 #define IS_MDF_SAD_HANGOVER_WINDOW(PARAM) (((PARAM) == MDF_SAD_HANGOVER_4_FRAMES)   || \
739                                            ((PARAM) == MDF_SAD_HANGOVER_8_FRAMES)   || \
740                                            ((PARAM) == MDF_SAD_HANGOVER_16_FRAMES)  || \
741                                            ((PARAM) == MDF_SAD_HANGOVER_32_FRAMES)  || \
742                                            ((PARAM) == MDF_SAD_HANGOVER_64_FRAMES)  || \
743                                            ((PARAM) == MDF_SAD_HANGOVER_128_FRAMES) || \
744                                            ((PARAM) == MDF_SAD_HANGOVER_256_FRAMES) || \
745                                            ((PARAM) == MDF_SAD_HANGOVER_512_FRAMES))
746 
747 #define IS_MDF_SAD_LEARNING_FRAMES(PARAM) (((PARAM) == MDF_SAD_LEARNING_2_FRAMES)  || \
748                                            ((PARAM) == MDF_SAD_LEARNING_4_FRAMES)  || \
749                                            ((PARAM) == MDF_SAD_LEARNING_8_FRAMES)  || \
750                                            ((PARAM) == MDF_SAD_LEARNING_16_FRAMES) || \
751                                            ((PARAM) == MDF_SAD_LEARNING_32_FRAMES))
752 
753 #define IS_MDF_SAD_AMBIENT_NOISE_SLOPE(PARAM) ((PARAM) <= 7U)
754 
755 #define IS_MDF_SAD_SIGNAL_NOISE_THRESHOLD(PARAM) (((PARAM) == MDF_SAD_SIGNAL_NOISE_3_5DB)  || \
756                                                   ((PARAM) == MDF_SAD_SIGNAL_NOISE_6DB)    || \
757                                                   ((PARAM) == MDF_SAD_SIGNAL_NOISE_9_5DB)  || \
758                                                   ((PARAM) == MDF_SAD_SIGNAL_NOISE_12DB)   || \
759                                                   ((PARAM) == MDF_SAD_SIGNAL_NOISE_15_6DB) || \
760                                                   ((PARAM) == MDF_SAD_SIGNAL_NOISE_18DB)   || \
761                                                   ((PARAM) == MDF_SAD_SIGNAL_NOISE_21_6DB) || \
762                                                   ((PARAM) == MDF_SAD_SIGNAL_NOISE_24_1DB) || \
763                                                   ((PARAM) == MDF_SAD_SIGNAL_NOISE_27_6DB) || \
764                                                   ((PARAM) == MDF_SAD_SIGNAL_NOISE_30_1DB))
765 /**
766   * @}
767   */
768 
769 /**
770   * @}
771   */
772 
773 /**
774   * @}
775   */
776 
777 #ifdef __cplusplus
778 }
779 #endif
780 
781 #endif /* STM32H7RSxx_HAL_MDF_H */
782