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