40 #include "stm32l4xx_hal.h" 76 #define SaturaLH(N, L, H) (((N)<(L))?(L):(((N)>(H))?(H):(N))) 78 #define OverSampling(__FREQUENCY__) \ 79 ((__FREQUENCY__ == AUDIO_FREQUENCY_8K) ? 128 \ 80 : (__FREQUENCY__ == AUDIO_FREQUENCY_11K) ? 256 \ 81 : (__FREQUENCY__ == AUDIO_FREQUENCY_16K) ? 128 \ 82 : (__FREQUENCY__ == AUDIO_FREQUENCY_22K) ? 128 \ 83 : (__FREQUENCY__ == AUDIO_FREQUENCY_32K) ? 64 \ 84 : (__FREQUENCY__ == AUDIO_FREQUENCY_44K) ? 64 \ 85 : (__FREQUENCY__ == AUDIO_FREQUENCY_48K) ? 64 \ 86 : (__FREQUENCY__ == AUDIO_FREQUENCY_96K) ? 32 : 32) 88 #define ClockDivider(__FREQUENCY__) \ 89 ((__FREQUENCY__ == AUDIO_FREQUENCY_8K) ? 48 \ 90 : (__FREQUENCY__ == AUDIO_FREQUENCY_11K) ? 4 \ 91 : (__FREQUENCY__ == AUDIO_FREQUENCY_16K) ? 24 \ 92 : (__FREQUENCY__ == AUDIO_FREQUENCY_22K) ? 4 \ 93 : (__FREQUENCY__ == AUDIO_FREQUENCY_32K) ? 24 \ 94 : (__FREQUENCY__ == AUDIO_FREQUENCY_44K) ? 4 \ 95 : (__FREQUENCY__ == AUDIO_FREQUENCY_48K) ? 16 \ 96 : (__FREQUENCY__ == AUDIO_FREQUENCY_96K) ? 16 : 16) 107 DFSDM_Channel_HandleTypeDef haudio_in_dfsdmchannel[MAX_CH_NUMBER];
108 DFSDM_Filter_HandleTypeDef haudio_in_dfsdmfilter[MAX_CH_NUMBER];
109 DMA_HandleTypeDef hdma_dfsdmReg_FLT[MAX_CH_NUMBER];
110 int32_t RecBuff[MAX_CH_NUMBER][MAX_SAMPLES_PER_CH];
111 static uint16_t AudioInVolume = DEFAULT_AUDIO_IN_VOLUME;
122 static uint8_t
DFSDMx_Init(uint32_t AudioFreq, uint32_t ChnlNbr);
180 RCC_PeriphCLKInitTypeDef RCC_ExCLKInitStruct;
181 RCC_ExCLKInitStruct.PLLSAI1.PLLSAI1N = 43;
182 RCC_ExCLKInitStruct.PLLSAI1.PLLSAI1P = 7;
187 RCC_ExCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SAI1;
188 RCC_ExCLKInitStruct.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_SAI1CLK;
189 RCC_ExCLKInitStruct.Sai1ClockSelection = RCC_SAI1CLKSOURCE_PLLSAI1;
190 RCC_ExCLKInitStruct.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_MSI;
191 RCC_ExCLKInitStruct.PLLSAI1.PLLSAI1M = 6;
193 if(HAL_RCCEx_PeriphCLKConfig(&RCC_ExCLKInitStruct) != HAL_OK)
212 SENSORTILE_AudioIn_Handler.
PCM_Data = pbuf;
214 for (counter = SENSORTILE_AudioIn_Handler.
MicChannels; counter > 0; counter --)
216 if (HAL_OK != HAL_DFSDM_FilterRegularStart_DMA(&haudio_in_dfsdmfilter[counter-1],
217 (int32_t*) RecBuff[counter-1],
234 for (counter = SENSORTILE_AudioIn_Handler.
MicChannels; counter > 0; counter --)
236 if (HAL_OK != HAL_DFSDM_FilterRegularStop_DMA(&haudio_in_dfsdmfilter[counter-1]))
254 for (counter = SENSORTILE_AudioIn_Handler.
MicChannels; counter > 0; counter --)
256 if (HAL_OK != HAL_DFSDM_FilterRegularStop_DMA(&haudio_in_dfsdmfilter[counter-1]))
273 for (counter = SENSORTILE_AudioIn_Handler.
MicChannels; counter > 0; counter --)
275 if (HAL_OK != HAL_DFSDM_FilterRegularStart_DMA(&haudio_in_dfsdmfilter[counter-1],
276 (int32_t*) RecBuff[counter-1],
297 AudioInVolume = Volume;
327 uint16_t shift_amount = 0;
328 uint32_t SincOrder = 0;
329 if(OverSampling(AudioFreq) == 32)
332 SincOrder = DFSDM_FILTER_SINC5_ORDER;
334 else if(OverSampling(AudioFreq) == 128)
337 SincOrder = DFSDM_FILTER_SINC4_ORDER;
339 else if(OverSampling(AudioFreq) == 64)
342 SincOrder = DFSDM_FILTER_SINC5_ORDER;
348 haudio_in_dfsdmchannel[0].Init.OutputClock.Activation = ENABLE;
349 haudio_in_dfsdmchannel[0].Init.OutputClock.Selection = DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO;
351 haudio_in_dfsdmchannel[0].Init.OutputClock.Divider = ClockDivider(AudioFreq);
352 haudio_in_dfsdmchannel[0].Init.Input.Multiplexer = DFSDM_CHANNEL_EXTERNAL_INPUTS;
353 haudio_in_dfsdmchannel[0].Init.Input.DataPacking = DFSDM_CHANNEL_STANDARD_MODE;
354 haudio_in_dfsdmchannel[0].Init.Input.Pins = DFSDM_CHANNEL_SAME_CHANNEL_PINS;
355 haudio_in_dfsdmchannel[0].Init.SerialInterface.Type = DFSDM_CHANNEL_SPI_RISING;
356 haudio_in_dfsdmchannel[0].Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_INTERNAL;
357 haudio_in_dfsdmchannel[0].Init.Awd.FilterOrder = DFSDM_CHANNEL_SINC1_ORDER;
358 haudio_in_dfsdmchannel[0].Init.Awd.Oversampling = 10;
359 haudio_in_dfsdmchannel[0].Init.Offset = 0;
360 haudio_in_dfsdmchannel[0].Init.RightBitShift = shift_amount;
361 haudio_in_dfsdmchannel[0].Instance = DFSDM_Channel5;
363 if(HAL_DFSDM_ChannelGetState(&haudio_in_dfsdmchannel[0]) == HAL_DFSDM_CHANNEL_STATE_RESET)
366 GPIO_InitTypeDef GPIO_InitStruct;
369 AUDIO_IN_DFSDM_CLK_ENABLE();
371 AUDIO_IN_DFSDM_CKOUT_GPIO_CLK_ENABLE();
372 AUDIO_IN_DFSDM_CH12_DATAIN_GPIO_CLK_ENABLE();
375 GPIO_InitStruct.Pin = AUDIO_IN_DFSDM_CKOUT_PIN;
376 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
377 GPIO_InitStruct.Pull = GPIO_NOPULL;
378 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
379 GPIO_InitStruct.Alternate = AUDIO_IN_DFSDM_CKOUT_DATIN_AF;
380 HAL_GPIO_Init(AUDIO_IN_DFSDM_CKOUT_GPIO_PORT, &GPIO_InitStruct);
382 GPIO_InitStruct.Pin = AUDIO_IN_DFSDM_CH12_DATIN_PIN;
383 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
384 GPIO_InitStruct.Pull = GPIO_NOPULL;
385 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
386 GPIO_InitStruct.Alternate = AUDIO_IN_DFSDM_CKOUT_DATIN_AF;
387 HAL_GPIO_Init(AUDIO_IN_DFSDM_CH12_DATIN_GPIO_PORT, &GPIO_InitStruct);
390 if(HAL_OK != HAL_DFSDM_ChannelInit(&haudio_in_dfsdmchannel[0]))
396 haudio_in_dfsdmfilter[0].Init.RegularParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
397 haudio_in_dfsdmfilter[0].Init.RegularParam.FastMode = ENABLE;
398 haudio_in_dfsdmfilter[0].Init.RegularParam.DmaMode = ENABLE;
399 haudio_in_dfsdmfilter[0].Init.InjectedParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
400 haudio_in_dfsdmfilter[0].Init.InjectedParam.ScanMode = DISABLE;
401 haudio_in_dfsdmfilter[0].Init.InjectedParam.DmaMode = DISABLE;
402 haudio_in_dfsdmfilter[0].Init.InjectedParam.ExtTrigger = DFSDM_FILTER_EXT_TRIG_TIM8_TRGO;
403 haudio_in_dfsdmfilter[0].Init.InjectedParam.ExtTriggerEdge = DFSDM_FILTER_EXT_TRIG_BOTH_EDGES;
404 haudio_in_dfsdmfilter[0].Init.FilterParam.SincOrder = SincOrder;
406 haudio_in_dfsdmfilter[0].Init.FilterParam.Oversampling = OverSampling(AudioFreq);
407 haudio_in_dfsdmfilter[0].Init.FilterParam.IntOversampling = 1;
408 haudio_in_dfsdmfilter[0].Instance = AUDIO_IN_DFSDM_1st_FILTER;
410 if(HAL_DFSDM_FilterGetState(&haudio_in_dfsdmfilter[0]) == HAL_DFSDM_FILTER_STATE_RESET)
416 if(HAL_OK != HAL_DFSDM_FilterInit(&haudio_in_dfsdmfilter[0]))
422 if(HAL_OK != HAL_DFSDM_FilterConfigRegChannel(&haudio_in_dfsdmfilter[0], DFSDM_CHANNEL_5, DFSDM_CONTINUOUS_CONV_ON))
433 haudio_in_dfsdmchannel[0].Init.OutputClock.Activation = ENABLE;
434 haudio_in_dfsdmchannel[0].Init.OutputClock.Selection = DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO;
436 haudio_in_dfsdmchannel[0].Init.OutputClock.Divider = ClockDivider(AudioFreq);
437 haudio_in_dfsdmchannel[0].Init.Input.Multiplexer = DFSDM_CHANNEL_EXTERNAL_INPUTS;
438 haudio_in_dfsdmchannel[0].Init.Input.DataPacking = DFSDM_CHANNEL_STANDARD_MODE;
439 haudio_in_dfsdmchannel[0].Init.Input.Pins = DFSDM_CHANNEL_SAME_CHANNEL_PINS;
440 haudio_in_dfsdmchannel[0].Init.SerialInterface.Type = DFSDM_CHANNEL_SPI_RISING;
441 haudio_in_dfsdmchannel[0].Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_INTERNAL;
442 haudio_in_dfsdmchannel[0].Init.Awd.FilterOrder = DFSDM_CHANNEL_SINC1_ORDER;
443 haudio_in_dfsdmchannel[0].Init.Awd.Oversampling = 10;
444 haudio_in_dfsdmchannel[0].Init.Offset = 0;
445 haudio_in_dfsdmchannel[0].Init.RightBitShift = shift_amount;
446 haudio_in_dfsdmchannel[0].Instance = DFSDM_Channel6;
448 if(HAL_DFSDM_ChannelGetState(&haudio_in_dfsdmchannel[0]) == HAL_DFSDM_CHANNEL_STATE_RESET)
451 GPIO_InitTypeDef GPIO_InitStruct;
454 AUDIO_IN_DFSDM_CLK_ENABLE();
456 AUDIO_IN_DFSDM_CKOUT_GPIO_CLK_ENABLE();
457 AUDIO_IN_DFSDM_CH12_EXT_DATAIN_GPIO_CLK_ENABLE();
460 GPIO_InitStruct.Pin = AUDIO_IN_DFSDM_CKOUT_PIN;
461 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
462 GPIO_InitStruct.Pull = GPIO_NOPULL;
463 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
464 GPIO_InitStruct.Alternate = AUDIO_IN_DFSDM_CKOUT_DATIN_AF;
465 HAL_GPIO_Init(AUDIO_IN_DFSDM_CKOUT_GPIO_PORT, &GPIO_InitStruct);
467 GPIO_InitStruct.Pin = AUDIO_IN_DFSDM_CH12_EXT_DATIN_PIN;
468 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
469 GPIO_InitStruct.Pull = GPIO_NOPULL;
470 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
471 GPIO_InitStruct.Alternate = AUDIO_IN_DFSDM_CKOUT_DATIN_AF;
472 HAL_GPIO_Init(AUDIO_IN_DFSDM_CH12_EXT_DATIN_GPIO_PORT, &GPIO_InitStruct);
475 if(HAL_OK != HAL_DFSDM_ChannelInit(&haudio_in_dfsdmchannel[0]))
481 haudio_in_dfsdmfilter[0].Init.RegularParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
482 haudio_in_dfsdmfilter[0].Init.RegularParam.FastMode = ENABLE;
483 haudio_in_dfsdmfilter[0].Init.RegularParam.DmaMode = ENABLE;
484 haudio_in_dfsdmfilter[0].Init.InjectedParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
485 haudio_in_dfsdmfilter[0].Init.InjectedParam.ScanMode = DISABLE;
486 haudio_in_dfsdmfilter[0].Init.InjectedParam.DmaMode = DISABLE;
487 haudio_in_dfsdmfilter[0].Init.InjectedParam.ExtTrigger = DFSDM_FILTER_EXT_TRIG_TIM8_TRGO;
488 haudio_in_dfsdmfilter[0].Init.InjectedParam.ExtTriggerEdge = DFSDM_FILTER_EXT_TRIG_BOTH_EDGES;
489 haudio_in_dfsdmfilter[0].Init.FilterParam.SincOrder = SincOrder;
491 haudio_in_dfsdmfilter[0].Init.FilterParam.Oversampling = OverSampling(AudioFreq);
492 haudio_in_dfsdmfilter[0].Init.FilterParam.IntOversampling = 1;
493 haudio_in_dfsdmfilter[0].Instance = AUDIO_IN_DFSDM_1st_FILTER;
495 if(HAL_DFSDM_FilterGetState(&haudio_in_dfsdmfilter[0]) == HAL_DFSDM_FILTER_STATE_RESET)
501 if(HAL_OK != HAL_DFSDM_FilterInit(&haudio_in_dfsdmfilter[0]))
507 if(HAL_OK != HAL_DFSDM_FilterConfigRegChannel(&haudio_in_dfsdmfilter[0], DFSDM_CHANNEL_6, DFSDM_CONTINUOUS_CONV_ON))
513 haudio_in_dfsdmchannel[1].Init.OutputClock.Activation = ENABLE;
514 haudio_in_dfsdmchannel[1].Init.OutputClock.Selection = DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO;
516 haudio_in_dfsdmchannel[1].Init.OutputClock.Divider = ClockDivider(AudioFreq);
517 haudio_in_dfsdmchannel[1].Init.Input.Multiplexer = DFSDM_CHANNEL_EXTERNAL_INPUTS;
518 haudio_in_dfsdmchannel[1].Init.Input.DataPacking = DFSDM_CHANNEL_STANDARD_MODE;
519 haudio_in_dfsdmchannel[1].Init.Input.Pins = DFSDM_CHANNEL_FOLLOWING_CHANNEL_PINS;
520 haudio_in_dfsdmchannel[1].Init.SerialInterface.Type = DFSDM_CHANNEL_SPI_FALLING;
521 haudio_in_dfsdmchannel[1].Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_INTERNAL;
522 haudio_in_dfsdmchannel[1].Init.Awd.FilterOrder = DFSDM_CHANNEL_SINC1_ORDER;
523 haudio_in_dfsdmchannel[1].Init.Awd.Oversampling = 10;
524 haudio_in_dfsdmchannel[1].Init.Offset = 0;
525 haudio_in_dfsdmchannel[1].Init.RightBitShift = shift_amount;
526 haudio_in_dfsdmchannel[1].Instance = DFSDM_Channel5;
529 if(HAL_OK != HAL_DFSDM_ChannelInit(&haudio_in_dfsdmchannel[1]))
534 haudio_in_dfsdmfilter[1].Init.RegularParam.Trigger = DFSDM_FILTER_SYNC_TRIGGER;
535 haudio_in_dfsdmfilter[1].Init.RegularParam.FastMode = ENABLE;
536 haudio_in_dfsdmfilter[1].Init.RegularParam.DmaMode = ENABLE;
537 haudio_in_dfsdmfilter[1].Init.InjectedParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
538 haudio_in_dfsdmfilter[1].Init.InjectedParam.ScanMode = ENABLE;
539 haudio_in_dfsdmfilter[1].Init.InjectedParam.DmaMode = ENABLE;
540 haudio_in_dfsdmfilter[1].Init.InjectedParam.ExtTrigger = DFSDM_FILTER_EXT_TRIG_TIM8_TRGO;
543 haudio_in_dfsdmfilter[1].Init.InjectedParam.ExtTriggerEdge = DFSDM_FILTER_EXT_TRIG_RISING_EDGE;
547 haudio_in_dfsdmfilter[1].Init.InjectedParam.ExtTriggerEdge = DFSDM_FILTER_EXT_TRIG_BOTH_EDGES;
549 haudio_in_dfsdmfilter[1].Init.FilterParam.SincOrder = SincOrder;
551 haudio_in_dfsdmfilter[1].Init.FilterParam.Oversampling = OverSampling(AudioFreq);
552 haudio_in_dfsdmfilter[1].Init.FilterParam.IntOversampling = 1;
553 haudio_in_dfsdmfilter[1].Instance = AUDIO_IN_DFSDM_2st_FILTER;
555 if(HAL_DFSDM_FilterGetState(&haudio_in_dfsdmfilter[1]) == HAL_DFSDM_FILTER_STATE_RESET)
561 if(HAL_OK != HAL_DFSDM_FilterInit(&haudio_in_dfsdmfilter[1]))
567 if(HAL_OK != HAL_DFSDM_FilterConfigRegChannel(&haudio_in_dfsdmfilter[1], DFSDM_CHANNEL_5, DFSDM_CONTINUOUS_CONV_ON))
576 haudio_in_dfsdmchannel[2].Init.OutputClock.Activation = ENABLE;
577 haudio_in_dfsdmchannel[2].Init.OutputClock.Selection = DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO;
579 haudio_in_dfsdmchannel[2].Init.OutputClock.Divider = ClockDivider(AudioFreq);
580 haudio_in_dfsdmchannel[2].Init.Input.Multiplexer = DFSDM_CHANNEL_EXTERNAL_INPUTS;
581 haudio_in_dfsdmchannel[2].Init.Input.DataPacking = DFSDM_CHANNEL_STANDARD_MODE;
582 haudio_in_dfsdmchannel[2].Init.Input.Pins = DFSDM_CHANNEL_SAME_CHANNEL_PINS;
583 haudio_in_dfsdmchannel[2].Init.SerialInterface.Type = DFSDM_CHANNEL_SPI_RISING;
584 haudio_in_dfsdmchannel[2].Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_INTERNAL;
585 haudio_in_dfsdmchannel[2].Init.Awd.FilterOrder = DFSDM_CHANNEL_SINC1_ORDER;
586 haudio_in_dfsdmchannel[2].Init.Awd.Oversampling = 10;
587 haudio_in_dfsdmchannel[2].Init.Offset = 0;
588 haudio_in_dfsdmchannel[2].Init.RightBitShift = shift_amount;
589 haudio_in_dfsdmchannel[2].Instance = DFSDM_Channel4;
591 if(HAL_DFSDM_ChannelGetState(&haudio_in_dfsdmchannel[2]) == HAL_DFSDM_CHANNEL_STATE_RESET)
595 GPIO_InitTypeDef GPIO_InitStruct;
597 AUDIO_IN_DFSDM_CH34_EXT_DATAIN_GPIO_CLK_ENABLE();
599 GPIO_InitStruct.Pin = AUDIO_IN_DFSDM_CH34_EXT_DATIN_PIN;
600 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
601 GPIO_InitStruct.Pull = GPIO_NOPULL;
602 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
603 GPIO_InitStruct.Alternate = AUDIO_IN_DFSDM_CKOUT_DATIN_AF;
604 HAL_GPIO_Init(AUDIO_IN_DFSDM_CH34_EXT_DATIN_GPIO_PORT, &GPIO_InitStruct);
608 if(HAL_OK != HAL_DFSDM_ChannelInit(&haudio_in_dfsdmchannel[2]))
614 haudio_in_dfsdmfilter[2].Init.RegularParam.Trigger = DFSDM_FILTER_SYNC_TRIGGER;
615 haudio_in_dfsdmfilter[2].Init.RegularParam.FastMode = ENABLE;
616 haudio_in_dfsdmfilter[2].Init.RegularParam.DmaMode = ENABLE;
617 haudio_in_dfsdmfilter[2].Init.InjectedParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
618 haudio_in_dfsdmfilter[2].Init.InjectedParam.ScanMode = DISABLE;
619 haudio_in_dfsdmfilter[2].Init.InjectedParam.DmaMode = DISABLE;
620 haudio_in_dfsdmfilter[2].Init.InjectedParam.ExtTrigger = DFSDM_FILTER_EXT_TRIG_TIM8_TRGO;
621 haudio_in_dfsdmfilter[2].Init.InjectedParam.ExtTriggerEdge = DFSDM_FILTER_EXT_TRIG_BOTH_EDGES;
622 haudio_in_dfsdmfilter[2].Init.FilterParam.SincOrder = SincOrder;
624 haudio_in_dfsdmfilter[2].Init.FilterParam.Oversampling = OverSampling(AudioFreq);
625 haudio_in_dfsdmfilter[2].Init.FilterParam.IntOversampling = 1;
626 haudio_in_dfsdmfilter[2].Instance = AUDIO_IN_DFSDM_3rd_FILTER;
628 if(HAL_DFSDM_FilterGetState(&haudio_in_dfsdmfilter[2]) == HAL_DFSDM_FILTER_STATE_RESET)
634 if(HAL_OK != HAL_DFSDM_FilterInit(&haudio_in_dfsdmfilter[2]))
640 if(HAL_OK != HAL_DFSDM_FilterConfigRegChannel(&haudio_in_dfsdmfilter[2], DFSDM_CHANNEL_4, DFSDM_CONTINUOUS_CONV_ON))
646 haudio_in_dfsdmchannel[3].Init.OutputClock.Activation = ENABLE;
647 haudio_in_dfsdmchannel[3].Init.OutputClock.Selection = DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO;
649 haudio_in_dfsdmchannel[3].Init.OutputClock.Divider = ClockDivider(AudioFreq);
650 haudio_in_dfsdmchannel[3].Init.Input.Multiplexer = DFSDM_CHANNEL_EXTERNAL_INPUTS;
651 haudio_in_dfsdmchannel[3].Init.Input.DataPacking = DFSDM_CHANNEL_STANDARD_MODE;
652 haudio_in_dfsdmchannel[3].Init.Input.Pins = DFSDM_CHANNEL_FOLLOWING_CHANNEL_PINS;
653 haudio_in_dfsdmchannel[3].Init.SerialInterface.Type = DFSDM_CHANNEL_SPI_FALLING;
654 haudio_in_dfsdmchannel[3].Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_INTERNAL;
655 haudio_in_dfsdmchannel[3].Init.Awd.FilterOrder = DFSDM_CHANNEL_SINC1_ORDER;
656 haudio_in_dfsdmchannel[3].Init.Awd.Oversampling = 10;
657 haudio_in_dfsdmchannel[3].Init.Offset = 0;
658 haudio_in_dfsdmchannel[3].Init.RightBitShift = shift_amount;
659 haudio_in_dfsdmchannel[3].Instance = DFSDM_Channel3;
661 if(HAL_OK != HAL_DFSDM_ChannelInit(&haudio_in_dfsdmchannel[3]))
667 haudio_in_dfsdmfilter[3].Init.RegularParam.Trigger = DFSDM_FILTER_SYNC_TRIGGER;
668 haudio_in_dfsdmfilter[3].Init.RegularParam.FastMode = ENABLE;
669 haudio_in_dfsdmfilter[3].Init.RegularParam.DmaMode = ENABLE;
670 haudio_in_dfsdmfilter[3].Init.InjectedParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
671 haudio_in_dfsdmfilter[3].Init.InjectedParam.ScanMode = DISABLE;
672 haudio_in_dfsdmfilter[3].Init.InjectedParam.DmaMode = DISABLE;
673 haudio_in_dfsdmfilter[3].Init.InjectedParam.ExtTrigger = DFSDM_FILTER_EXT_TRIG_TIM8_TRGO;
674 haudio_in_dfsdmfilter[3].Init.InjectedParam.ExtTriggerEdge = DFSDM_FILTER_EXT_TRIG_BOTH_EDGES;
675 haudio_in_dfsdmfilter[3].Init.FilterParam.SincOrder = SincOrder;
677 haudio_in_dfsdmfilter[3].Init.FilterParam.Oversampling = OverSampling(AudioFreq);
678 haudio_in_dfsdmfilter[3].Init.FilterParam.IntOversampling = 1;
679 haudio_in_dfsdmfilter[3].Instance = AUDIO_IN_DFSDM_4th_FILTER;
681 if(HAL_DFSDM_FilterGetState(&haudio_in_dfsdmfilter[3]) == HAL_DFSDM_FILTER_STATE_RESET)
687 if(HAL_OK != HAL_DFSDM_FilterInit(&haudio_in_dfsdmfilter[3]))
693 if(HAL_OK != HAL_DFSDM_FilterConfigRegChannel(&haudio_in_dfsdmfilter[3], DFSDM_CHANNEL_3, DFSDM_CONTINUOUS_CONV_ON))
713 DMA_HandleTypeDef *hdma_dfsdmReg=NULL;
716 AUDIO_IN_DFSDM_CLK_ENABLE();
718 AUDIO_IN_DFSDM_DMA_CLK_ENABLE() ;
720 if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_1st_FILTER)
722 hdma_dfsdmReg = &hdma_dfsdmReg_FLT[0];
724 else if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_2st_FILTER)
726 hdma_dfsdmReg = &hdma_dfsdmReg_FLT[1];
728 else if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_3rd_FILTER)
730 hdma_dfsdmReg = &hdma_dfsdmReg_FLT[2];
732 else if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_4th_FILTER)
734 hdma_dfsdmReg = &hdma_dfsdmReg_FLT[3];
738 hdma_dfsdmReg->Init.Request = DMA_REQUEST_0;
739 hdma_dfsdmReg->Init.Direction = DMA_PERIPH_TO_MEMORY;
740 hdma_dfsdmReg->Init.PeriphInc = DMA_PINC_DISABLE;
741 hdma_dfsdmReg->Init.MemInc = DMA_MINC_ENABLE;
742 hdma_dfsdmReg->Init.PeriphDataAlignment = AUDIO_IN_DFSDM_DMA_PERIPH_DATA_SIZE;
743 hdma_dfsdmReg->Init.MemDataAlignment = AUDIO_IN_DFSDM_DMA_MEM_DATA_SIZE;
744 hdma_dfsdmReg->Init.Mode = DMA_CIRCULAR;
745 hdma_dfsdmReg->Init.Priority = DMA_PRIORITY_HIGH;
747 if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_1st_FILTER)
749 hdma_dfsdmReg->Instance = AUDIO_IN_DFSDM_DMA_1st_CHANNEL;
751 else if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_2st_FILTER)
753 hdma_dfsdmReg->Instance = AUDIO_IN_DFSDM_DMA_2nd_CHANNEL;
755 else if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_3rd_FILTER)
757 hdma_dfsdmReg->Instance = AUDIO_IN_DFSDM_DMA_3rd_CHANNEL;
759 else if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_4th_FILTER)
761 hdma_dfsdmReg->Instance = AUDIO_IN_DFSDM_DMA_4th_CHANNEL;
765 __HAL_LINKDMA(hdfsdm_filter, hdmaReg, *hdma_dfsdmReg);
768 __HAL_DMA_RESET_HANDLE_STATE(hdma_dfsdmReg);
771 HAL_DMA_Init(hdma_dfsdmReg);
774 if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_1st_FILTER)
776 HAL_NVIC_SetPriority(AUDIO_IN_DFSDM_DMA_1st_CH_IRQn,
777 AUDIO_IN_IRQ_PREPRIO, 0);
778 HAL_NVIC_EnableIRQ(AUDIO_IN_DFSDM_DMA_1st_CH_IRQn);
791 for (index = 0; index < SENSORTILE_AudioIn_Handler.
MicChannels; index ++)
793 if(HAL_OK != HAL_DFSDM_FilterDeInit(&haudio_in_dfsdmfilter[index]))
797 if(HAL_OK != HAL_DFSDM_ChannelDeInit(&haudio_in_dfsdmchannel[index]))
815 GPIO_InitTypeDef GPIO_InitStruct;
818 GPIO_InitStruct.Pin = AUDIO_IN_DFSDM_CKOUT_PIN;
819 HAL_GPIO_DeInit(AUDIO_IN_DFSDM_CKOUT_GPIO_PORT, GPIO_InitStruct.Pin);
821 GPIO_InitStruct.Pin = AUDIO_IN_DFSDM_CH12_DATIN_PIN;
822 HAL_GPIO_DeInit(AUDIO_IN_DFSDM_CH12_DATIN_GPIO_PORT, GPIO_InitStruct.Pin);
832 DMA_HandleTypeDef *hdma_dfsdmReg = NULL;
834 if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_1st_FILTER)
836 hdma_dfsdmReg = &hdma_dfsdmReg_FLT[0];
838 else if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_2st_FILTER)
840 hdma_dfsdmReg = &hdma_dfsdmReg_FLT[1];
842 else if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_3rd_FILTER)
844 hdma_dfsdmReg = &hdma_dfsdmReg_FLT[2];
846 else if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_4th_FILTER)
848 hdma_dfsdmReg = &hdma_dfsdmReg_FLT[3];
852 HAL_DMA_DeInit(hdma_dfsdmReg);
865 if (hdfsdm_filter == &haudio_in_dfsdmfilter[0])
867 for(j=0; j < SENSORTILE_AudioIn_Handler.
MicChannels; j ++)
869 for (i = 0; i < SENSORTILE_AudioIn_Handler.
Sampling_Freq / 1000; i++)
871 SENSORTILE_AudioIn_Handler.
HP_Filters[j].Z = ((RecBuff[j][i + SENSORTILE_AudioIn_Handler.
Sampling_Freq / 1000] >> 8) * AudioInVolume) >> 7;
872 SENSORTILE_AudioIn_Handler.
HP_Filters[j].oldOut = (0xFC * (SENSORTILE_AudioIn_Handler.
HP_Filters[j].oldOut + SENSORTILE_AudioIn_Handler.
HP_Filters[j].Z - SENSORTILE_AudioIn_Handler.
HP_Filters[j].oldIn)) / 256;
874 SENSORTILE_AudioIn_Handler.
PCM_Data[i * SENSORTILE_AudioIn_Handler.
MicChannels + j] = SaturaLH(SENSORTILE_AudioIn_Handler.
HP_Filters[j].oldOut, -32760, 32760);
889 if (hdfsdm_filter == &haudio_in_dfsdmfilter[0])
891 for(j=0; j < SENSORTILE_AudioIn_Handler.
MicChannels; j ++)
893 for (i = 0; i < SENSORTILE_AudioIn_Handler.
Sampling_Freq / 1000; i++)
895 SENSORTILE_AudioIn_Handler.
HP_Filters[j].Z = ((RecBuff[j][i] >> 8) * AudioInVolume) >> 7;
896 SENSORTILE_AudioIn_Handler.
HP_Filters[j].oldOut = (0xFC * (SENSORTILE_AudioIn_Handler.
HP_Filters[j].oldOut + SENSORTILE_AudioIn_Handler.
HP_Filters[j].Z - SENSORTILE_AudioIn_Handler.
HP_Filters[j].oldIn)) / 256;
898 SENSORTILE_AudioIn_Handler.
PCM_Data[i * SENSORTILE_AudioIn_Handler.
MicChannels + j] = SaturaLH(SENSORTILE_AudioIn_Handler.
HP_Filters[j].oldOut, -32760, 32760);
static uint8_t DFSDMx_DeInit(void)
De-initializes the Digital Filter for Sigma-Delta Modulators interface (DFSDM).
static void DFSDMx_ChannelMspDeInit(DFSDM_Channel_HandleTypeDef *hdfsdm_channel)
DeInitializes the DFSDM channel MSP.
This file contains definitions for SensorTile_audio_in.c driver.
uint8_t BSP_AUDIO_IN_Init(uint32_t AudioFreq, uint32_t BitRes, uint32_t ChnlNbr)
Initializes audio acquisition.
Microphone internal structure definition.
uint8_t BSP_AUDIO_IN_SetVolume(uint8_t Volume)
Controls the audio in volume level.
static void DFSDMx_FilterMspDeInit(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)
DeInitializes the DFSDM filter MSP.
void HAL_DFSDM_FilterRegConvHalfCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)
Half regular conversion complete callback.
uint8_t BSP_AUDIO_IN_Pause(void)
Pauses the audio file stream.
__weak uint8_t BSP_AUDIO_IN_ClockConfig(uint32_t AudioFreq, void *Params)
Clock Config.
uint8_t BSP_AUDIO_IN_Stop(void)
Stops audio recording.
uint8_t BSP_AUDIO_IN_DeInit(void)
DeInitializes the audio peripheral.
static uint8_t DFSDMx_Init(uint32_t AudioFreq, uint32_t ChnlNbr)
Initializes the Digital Filter for Sigma-Delta Modulators interface (DFSDM).
__weak void BSP_AUDIO_IN_Error_Callback(void)
Audio IN Error callback function.
__weak void BSP_AUDIO_IN_TransferComplete_CallBack(void)
User callback when record buffer is filled.
static void DFSDMx_FilterMspInit(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)
Initializes the DFSDM filter MSP.
HP_FilterState_TypeDef HP_Filters[4]
__weak void BSP_AUDIO_IN_HalfTransfer_CallBack(void)
User callback when record buffer is half filled.
uint8_t BSP_AUDIO_IN_Resume(void)
Resumes the audio file stream.
uint8_t BSP_AUDIO_IN_Record(uint16_t *pbuf, uint32_t size)
Starts audio recording.
void HAL_DFSDM_FilterRegConvCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)
Regular conversion complete callback.