STSW-STLKT01: Drivers/BSP/SensorTile/SensorTile_audio_in.c Source File

STSW-STLKT01

STSW-STLKT01
SensorTile_audio_in.c
Go to the documentation of this file.
1 
39 /* Includes ------------------------------------------------------------------*/
40 #include "stm32l4xx_hal.h"
41 #include "SensorTile_audio_in.h"
42 
76 #define SaturaLH(N, L, H) (((N)<(L))?(L):(((N)>(H))?(H):(N)))
77 
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)
87 
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)
97 
106 static SENSORTILE_AudioIn_HandlerTypeDef SENSORTILE_AudioIn_Handler;
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;
112 
121 static void DFSDMx_FilterMspInit(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);
122 static uint8_t DFSDMx_Init(uint32_t AudioFreq, uint32_t ChnlNbr);
123 static uint8_t DFSDMx_DeInit(void);
124 static void DFSDMx_ChannelMspDeInit(DFSDM_Channel_HandleTypeDef *hdfsdm_channel);
125 static void DFSDMx_FilterMspDeInit(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);
126 
146 uint8_t BSP_AUDIO_IN_Init(uint32_t AudioFreq, uint32_t BitRes, uint32_t ChnlNbr)
147 {
148 
149  /*Set Structure for internal state*/
150  SENSORTILE_AudioIn_Handler.MicChannels = ChnlNbr;
151  SENSORTILE_AudioIn_Handler.Sampling_Freq = AudioFreq;
152 
153  /*PLL and Clocks config*/
154  BSP_AUDIO_IN_ClockConfig(SENSORTILE_AudioIn_Handler.Sampling_Freq, NULL);
155 
156  /*DFSDM configuration*/
157  return DFSDMx_Init(AudioFreq, ChnlNbr);
158 }
159 
164 uint8_t BSP_AUDIO_IN_DeInit(void)
165 {
166  return DFSDMx_DeInit();
167 }
168 
169 
178 __weak uint8_t BSP_AUDIO_IN_ClockConfig(uint32_t AudioFreq, void *Params)
179 {
180  RCC_PeriphCLKInitTypeDef RCC_ExCLKInitStruct;
181  RCC_ExCLKInitStruct.PLLSAI1.PLLSAI1N = 43;
182  RCC_ExCLKInitStruct.PLLSAI1.PLLSAI1P = 7;
183 
184  /* Configure PLLSAI */
185  /* Please note that some of these parameters must be consistent with
186  the xonfiguration of the main PLL */
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;
192 
193  if(HAL_RCCEx_PeriphCLKConfig(&RCC_ExCLKInitStruct) != HAL_OK)
194  {
195  return AUDIO_ERROR;
196  }
197 
198  return AUDIO_OK;
199 }
200 
209 uint8_t BSP_AUDIO_IN_Record(uint16_t* pbuf, uint32_t size)
210 {
211  int32_t counter = 0;
212  SENSORTILE_AudioIn_Handler.PCM_Data = pbuf;
213 
214  for (counter = SENSORTILE_AudioIn_Handler.MicChannels; counter > 0; counter --)
215  {
216  if (HAL_OK != HAL_DFSDM_FilterRegularStart_DMA(&haudio_in_dfsdmfilter[counter-1],
217  (int32_t*) RecBuff[counter-1],
218  SENSORTILE_AudioIn_Handler.Sampling_Freq / 1000 * 2))
219  {
220  return AUDIO_ERROR;
221  }
222  }
223  return AUDIO_OK;
224 }
225 
231 uint8_t BSP_AUDIO_IN_Stop(void)
232 {
233  int32_t counter = 0;
234  for (counter = SENSORTILE_AudioIn_Handler.MicChannels; counter > 0; counter --)
235  {
236  if (HAL_OK != HAL_DFSDM_FilterRegularStop_DMA(&haudio_in_dfsdmfilter[counter-1]))
237  {
238  return AUDIO_ERROR;
239  }
240  }
241  /* Return 0 if all operations are OK */
242  return AUDIO_OK;
243 }
244 
245 
251 uint8_t BSP_AUDIO_IN_Pause(void)
252 {
253  int32_t counter = 0;
254  for (counter = SENSORTILE_AudioIn_Handler.MicChannels; counter > 0; counter --)
255  {
256  if (HAL_OK != HAL_DFSDM_FilterRegularStop_DMA(&haudio_in_dfsdmfilter[counter-1]))
257  {
258  return AUDIO_ERROR;
259  }
260  }
261  /* Return 0 if all operations are OK */
262  return AUDIO_OK;
263 }
264 
270 uint8_t BSP_AUDIO_IN_Resume(void)
271 {
272  int32_t counter = 0;
273  for (counter = SENSORTILE_AudioIn_Handler.MicChannels; counter > 0; counter --)
274  {
275  if (HAL_OK != HAL_DFSDM_FilterRegularStart_DMA(&haudio_in_dfsdmfilter[counter-1],
276  (int32_t*) RecBuff[counter-1],
277  SENSORTILE_AudioIn_Handler.Sampling_Freq / 1000 * 2))
278  {
279  return AUDIO_ERROR;
280  }
281  }
282  return AUDIO_OK;
283 }
284 
285 
295 uint8_t BSP_AUDIO_IN_SetVolume(uint8_t Volume)
296 {
297  AudioInVolume = Volume;
298  return AUDIO_OK;
299 }
300 
306 __weak void BSP_AUDIO_IN_Error_Callback(void)
307 {
308  /* This function is called when an Interrupt due to transfer error on or peripheral
309  error occurs. */
310 }
311 
325 static uint8_t DFSDMx_Init(uint32_t AudioFreq, uint32_t ChnlNbr)
326 {
327  uint16_t shift_amount = 0;
328  uint32_t SincOrder = 0;
329  if(OverSampling(AudioFreq) == 32)
330  {
331  shift_amount = 5;
332  SincOrder = DFSDM_FILTER_SINC5_ORDER;
333  }
334  else if(OverSampling(AudioFreq) == 128)
335  {
336  shift_amount = 8;
337  SincOrder = DFSDM_FILTER_SINC4_ORDER;
338  }
339  else if(OverSampling(AudioFreq) == 64)
340  {
341  shift_amount = 10;
342  SincOrder = DFSDM_FILTER_SINC5_ORDER;
343  }
344 
345  if (ChnlNbr == 1)
346  {
347  /*####AUDIO CH 1: DFSDM CHANNEL 2####*/
348  haudio_in_dfsdmchannel[0].Init.OutputClock.Activation = ENABLE;
349  haudio_in_dfsdmchannel[0].Init.OutputClock.Selection = DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO;
350  /* Set the DFSDM clock OUT audio frequency configuration */
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;
362 
363  if(HAL_DFSDM_ChannelGetState(&haudio_in_dfsdmchannel[0]) == HAL_DFSDM_CHANNEL_STATE_RESET)
364  {
365  /* Init the DFSDM Channel */
366  GPIO_InitTypeDef GPIO_InitStruct;
367 
368  /* Enable DFSDM clock */
369  AUDIO_IN_DFSDM_CLK_ENABLE();
370  /* Enable GPIO clock */
371  AUDIO_IN_DFSDM_CKOUT_GPIO_CLK_ENABLE();
372  AUDIO_IN_DFSDM_CH12_DATAIN_GPIO_CLK_ENABLE();
373 
374  /* DFSDM pins configuration: DFSDM_CKOUT, DMIC_DATIN pins ------------------*/
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);
381 
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);
388  }
389 
390  if(HAL_OK != HAL_DFSDM_ChannelInit(&haudio_in_dfsdmchannel[0]))
391  {
392  return AUDIO_ERROR;
393  }
394 
395  /*####AUDIO CH 1: FILTER 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;
405  /* Set the DFSDM Filters Oversampling to have correct sample rate */
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;
409 
410  if(HAL_DFSDM_FilterGetState(&haudio_in_dfsdmfilter[0]) == HAL_DFSDM_FILTER_STATE_RESET)
411  {
412  /* Init the DFSDM Filter */
413  DFSDMx_FilterMspInit(&haudio_in_dfsdmfilter[0]);
414  }
415 
416  if(HAL_OK != HAL_DFSDM_FilterInit(&haudio_in_dfsdmfilter[0]))
417  {
418  return AUDIO_ERROR;
419  }
420 
421  /* Configure injected channel */
422  if(HAL_OK != HAL_DFSDM_FilterConfigRegChannel(&haudio_in_dfsdmfilter[0], DFSDM_CHANNEL_5, DFSDM_CONTINUOUS_CONV_ON))
423  {
424  return AUDIO_ERROR;
425  }
426  }
427  else {
428 
429  if (ChnlNbr >= 2)
430  {
431 
432  /*####AUDIO CH 1: DFSDM CHANNEL 2####*/
433  haudio_in_dfsdmchannel[0].Init.OutputClock.Activation = ENABLE;
434  haudio_in_dfsdmchannel[0].Init.OutputClock.Selection = DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO;
435  /* Set the DFSDM clock OUT audio frequency configuration */
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;
447 
448  if(HAL_DFSDM_ChannelGetState(&haudio_in_dfsdmchannel[0]) == HAL_DFSDM_CHANNEL_STATE_RESET)
449  {
450  /* Init the DFSDM Channel msp */
451  GPIO_InitTypeDef GPIO_InitStruct;
452 
453  /* Enable DFSDM clock */
454  AUDIO_IN_DFSDM_CLK_ENABLE();
455  /* Enable GPIO clock */
456  AUDIO_IN_DFSDM_CKOUT_GPIO_CLK_ENABLE();
457  AUDIO_IN_DFSDM_CH12_EXT_DATAIN_GPIO_CLK_ENABLE();
458 
459  /* DFSDM pins configuration: DFSDM_CKOUT, DMIC_DATIN pins ------------------*/
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);
466 
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);
473  }
474 
475  if(HAL_OK != HAL_DFSDM_ChannelInit(&haudio_in_dfsdmchannel[0]))
476  {
477  return AUDIO_ERROR;
478  }
479 
480  /*####AUDIO CH 1: FILTER 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;
490  /* Set the DFSDM Filters Oversampling to have correct sample rate */
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;
494 
495  if(HAL_DFSDM_FilterGetState(&haudio_in_dfsdmfilter[0]) == HAL_DFSDM_FILTER_STATE_RESET)
496  {
497  /* Init the DFSDM Filter */
498  DFSDMx_FilterMspInit(&haudio_in_dfsdmfilter[0]);
499  }
500 
501  if(HAL_OK != HAL_DFSDM_FilterInit(&haudio_in_dfsdmfilter[0]))
502  {
503  return AUDIO_ERROR;
504  }
505 
506  /* Configure injected channel */
507  if(HAL_OK != HAL_DFSDM_FilterConfigRegChannel(&haudio_in_dfsdmfilter[0], DFSDM_CHANNEL_6, DFSDM_CONTINUOUS_CONV_ON))
508  {
509  return AUDIO_ERROR;
510  }
511 
512  /*####AUDIO CH 2: DFSDM CHANNEL 1####*/
513  haudio_in_dfsdmchannel[1].Init.OutputClock.Activation = ENABLE;
514  haudio_in_dfsdmchannel[1].Init.OutputClock.Selection = DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO;
515  /* Set the DFSDM clock OUT audio frequency configuration */
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;
527 
528 
529  if(HAL_OK != HAL_DFSDM_ChannelInit(&haudio_in_dfsdmchannel[1]))
530  {
531  return AUDIO_ERROR;
532  }
533  /*####AUDIO CH 2: FILTER 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;
541  if (ChnlNbr == 1)
542  {
543  haudio_in_dfsdmfilter[1].Init.InjectedParam.ExtTriggerEdge = DFSDM_FILTER_EXT_TRIG_RISING_EDGE;
544  }
545  else
546  {
547  haudio_in_dfsdmfilter[1].Init.InjectedParam.ExtTriggerEdge = DFSDM_FILTER_EXT_TRIG_BOTH_EDGES;
548  }
549  haudio_in_dfsdmfilter[1].Init.FilterParam.SincOrder = SincOrder;
550  /* Set the DFSDM Filters Oversampling to have correct sample rate */
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;
554 
555  if(HAL_DFSDM_FilterGetState(&haudio_in_dfsdmfilter[1]) == HAL_DFSDM_FILTER_STATE_RESET)
556  {
557  /* Init the DFSDM Filter */
558  DFSDMx_FilterMspInit(&haudio_in_dfsdmfilter[1]);
559  }
560 
561  if(HAL_OK != HAL_DFSDM_FilterInit(&haudio_in_dfsdmfilter[1]))
562  {
563  return AUDIO_ERROR;
564  }
565 
566  /* Configure injected channel */
567  if(HAL_OK != HAL_DFSDM_FilterConfigRegChannel(&haudio_in_dfsdmfilter[1], DFSDM_CHANNEL_5, DFSDM_CONTINUOUS_CONV_ON))
568  {
569  return AUDIO_ERROR;
570  }
571  }
572 
573  if (ChnlNbr >= 4)
574  {
575  /*####AUDIO CH 3: CHANNEL 7####*/
576  haudio_in_dfsdmchannel[2].Init.OutputClock.Activation = ENABLE;
577  haudio_in_dfsdmchannel[2].Init.OutputClock.Selection = DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO;
578  /* Set the DFSDM clock OUT audio frequency configuration */
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;
590 
591  if(HAL_DFSDM_ChannelGetState(&haudio_in_dfsdmchannel[2]) == HAL_DFSDM_CHANNEL_STATE_RESET)
592  {
593  /* Init the DFSDM Channel */
594 
595  GPIO_InitTypeDef GPIO_InitStruct;
596 
597  AUDIO_IN_DFSDM_CH34_EXT_DATAIN_GPIO_CLK_ENABLE();
598 
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);
605 
606 
607  }
608  if(HAL_OK != HAL_DFSDM_ChannelInit(&haudio_in_dfsdmchannel[2]))
609  {
610  return AUDIO_ERROR;
611  }
612 
613  /*####AUDIO CH 3: FILTER 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;
623  /* Set the DFSDM Filters Oversampling to have correct sample rate */
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;
627 
628  if(HAL_DFSDM_FilterGetState(&haudio_in_dfsdmfilter[2]) == HAL_DFSDM_FILTER_STATE_RESET)
629  {
630  /* Init the DFSDM Filter */
631  DFSDMx_FilterMspInit(&haudio_in_dfsdmfilter[2]);
632  }
633 
634  if(HAL_OK != HAL_DFSDM_FilterInit(&haudio_in_dfsdmfilter[2]))
635  {
636  return AUDIO_ERROR;
637  }
638 
639  /* Configure injected channel */
640  if(HAL_OK != HAL_DFSDM_FilterConfigRegChannel(&haudio_in_dfsdmfilter[2], DFSDM_CHANNEL_4, DFSDM_CONTINUOUS_CONV_ON))
641  {
642  return AUDIO_ERROR;
643  }
644 
645  /*####AUDIO CH 4: CHANNEL 6####*/
646  haudio_in_dfsdmchannel[3].Init.OutputClock.Activation = ENABLE;
647  haudio_in_dfsdmchannel[3].Init.OutputClock.Selection = DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO;
648  /* Set the DFSDM clock OUT audio frequency configuration */
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;
660 
661  if(HAL_OK != HAL_DFSDM_ChannelInit(&haudio_in_dfsdmchannel[3]))
662  {
663  return AUDIO_ERROR;
664  }
665 
666  /*####AUDIO CH 4: FILTER 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;
676  /* Set the DFSDM Filters Oversampling to have correct sample rate */
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;
680 
681  if(HAL_DFSDM_FilterGetState(&haudio_in_dfsdmfilter[3]) == HAL_DFSDM_FILTER_STATE_RESET)
682  {
683  /* Init the DFSDM Filter */
684  DFSDMx_FilterMspInit(&haudio_in_dfsdmfilter[3]);
685  }
686 
687  if(HAL_OK != HAL_DFSDM_FilterInit(&haudio_in_dfsdmfilter[3]))
688  {
689  return AUDIO_ERROR;
690  }
691 
692  /* Configure injected channel */
693  if(HAL_OK != HAL_DFSDM_FilterConfigRegChannel(&haudio_in_dfsdmfilter[3], DFSDM_CHANNEL_3, DFSDM_CONTINUOUS_CONV_ON))
694  {
695  return AUDIO_ERROR;
696  }
697  }
698  }
699 
700 
701 
702 
703  return AUDIO_OK;
704 }
705 
711 static void DFSDMx_FilterMspInit(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)
712 {
713  DMA_HandleTypeDef *hdma_dfsdmReg=NULL;
714 
715  /* Enable DFSDM clock */
716  AUDIO_IN_DFSDM_CLK_ENABLE();
717  /* Enable the DMA clock */
718  AUDIO_IN_DFSDM_DMA_CLK_ENABLE() ;
719 
720  if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_1st_FILTER)
721  {
722  hdma_dfsdmReg = &hdma_dfsdmReg_FLT[0];
723  }
724  else if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_2st_FILTER)
725  {
726  hdma_dfsdmReg = &hdma_dfsdmReg_FLT[1];
727  }
728  else if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_3rd_FILTER)
729  {
730  hdma_dfsdmReg = &hdma_dfsdmReg_FLT[2];
731  }
732  else if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_4th_FILTER)
733  {
734  hdma_dfsdmReg = &hdma_dfsdmReg_FLT[3];
735  }
736 
737  /* Configure the hdma_dfsdmReg handle parameters */
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;
746 
747  if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_1st_FILTER)
748  {
749  hdma_dfsdmReg->Instance = AUDIO_IN_DFSDM_DMA_1st_CHANNEL;
750  }
751  else if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_2st_FILTER)
752  {
753  hdma_dfsdmReg->Instance = AUDIO_IN_DFSDM_DMA_2nd_CHANNEL;
754  }
755  else if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_3rd_FILTER)
756  {
757  hdma_dfsdmReg->Instance = AUDIO_IN_DFSDM_DMA_3rd_CHANNEL;
758  }
759  else if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_4th_FILTER)
760  {
761  hdma_dfsdmReg->Instance = AUDIO_IN_DFSDM_DMA_4th_CHANNEL;
762  }
763 
764  /* Associate the DMA handle */
765  __HAL_LINKDMA(hdfsdm_filter, hdmaReg, *hdma_dfsdmReg);
766 
767  /* Reset DMA handle state */
768  __HAL_DMA_RESET_HANDLE_STATE(hdma_dfsdmReg);
769 
770  /* Configure the DMA Channel */
771  HAL_DMA_Init(hdma_dfsdmReg);
772 
773  /* DMA IRQ Channel configuration */
774  if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_1st_FILTER)
775  {
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);
779  }
780 }
781 
786 static uint8_t DFSDMx_DeInit(void)
787 {
788  /* De-initializes the DFSDM filters to allow access to DFSDM internal registers */
789  uint16_t index = 0;
790 
791  for (index = 0; index < SENSORTILE_AudioIn_Handler.MicChannels; index ++)
792  {
793  if(HAL_OK != HAL_DFSDM_FilterDeInit(&haudio_in_dfsdmfilter[index]))
794  {
795  return AUDIO_ERROR;
796  }
797  if(HAL_OK != HAL_DFSDM_ChannelDeInit(&haudio_in_dfsdmchannel[index]))
798  {
799  return AUDIO_ERROR;
800  }
801  DFSDMx_FilterMspDeInit(&haudio_in_dfsdmfilter[index]);
802  DFSDMx_ChannelMspDeInit(&haudio_in_dfsdmchannel[index]);
803  }
804 
805  return AUDIO_OK;
806 }
807 
813 static void DFSDMx_ChannelMspDeInit(DFSDM_Channel_HandleTypeDef *hdfsdm_channel)
814 {
815  GPIO_InitTypeDef GPIO_InitStruct;
816 
817  /* DFSDM pins configuration: DFSDM_CKOUT, DMIC_DATIN pins ------------------*/
818  GPIO_InitStruct.Pin = AUDIO_IN_DFSDM_CKOUT_PIN;
819  HAL_GPIO_DeInit(AUDIO_IN_DFSDM_CKOUT_GPIO_PORT, GPIO_InitStruct.Pin);
820 
821  GPIO_InitStruct.Pin = AUDIO_IN_DFSDM_CH12_DATIN_PIN;
822  HAL_GPIO_DeInit(AUDIO_IN_DFSDM_CH12_DATIN_GPIO_PORT, GPIO_InitStruct.Pin);
823 }
824 
830 static void DFSDMx_FilterMspDeInit(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)
831 {
832  DMA_HandleTypeDef *hdma_dfsdmReg = NULL;
833 
834  if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_1st_FILTER)
835  {
836  hdma_dfsdmReg = &hdma_dfsdmReg_FLT[0];
837  }
838  else if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_2st_FILTER)
839  {
840  hdma_dfsdmReg = &hdma_dfsdmReg_FLT[1];
841  }
842  else if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_3rd_FILTER)
843  {
844  hdma_dfsdmReg = &hdma_dfsdmReg_FLT[2];
845  }
846  else if (hdfsdm_filter->Instance == AUDIO_IN_DFSDM_4th_FILTER)
847  {
848  hdma_dfsdmReg = &hdma_dfsdmReg_FLT[3];
849  }
850 
851  /* Configure the DMA Channel */
852  HAL_DMA_DeInit(hdma_dfsdmReg);
853 }
854 
861 void HAL_DFSDM_FilterRegConvCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)
862 {
863  uint32_t i, j = 0;
864 
865  if (hdfsdm_filter == &haudio_in_dfsdmfilter[0])
866  {
867  for(j=0; j < SENSORTILE_AudioIn_Handler.MicChannels; j ++)
868  {
869  for (i = 0; i < SENSORTILE_AudioIn_Handler.Sampling_Freq / 1000; i++)
870  {
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;
873  SENSORTILE_AudioIn_Handler.HP_Filters[j].oldIn = SENSORTILE_AudioIn_Handler.HP_Filters[j].Z;
874  SENSORTILE_AudioIn_Handler.PCM_Data[i * SENSORTILE_AudioIn_Handler.MicChannels + j] = SaturaLH(SENSORTILE_AudioIn_Handler.HP_Filters[j].oldOut, -32760, 32760);
875  }
876  }
878  }
879 }
880 
886 void HAL_DFSDM_FilterRegConvHalfCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)
887 {
888  uint32_t i, j = 0;
889  if (hdfsdm_filter == &haudio_in_dfsdmfilter[0])
890  {
891  for(j=0; j < SENSORTILE_AudioIn_Handler.MicChannels; j ++)
892  {
893  for (i = 0; i < SENSORTILE_AudioIn_Handler.Sampling_Freq / 1000; i++)
894  {
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;
897  SENSORTILE_AudioIn_Handler.HP_Filters[j].oldIn = SENSORTILE_AudioIn_Handler.HP_Filters[j].Z;
898  SENSORTILE_AudioIn_Handler.PCM_Data[i * SENSORTILE_AudioIn_Handler.MicChannels + j] = SaturaLH(SENSORTILE_AudioIn_Handler.HP_Filters[j].oldOut, -32760, 32760);
899  }
900  }
902  }
903 }
904 
911  /* This function should be implemented by the user application.
912  It is called into this driver when the current buffer is filled
913  to prepare the next buffer pointer and its size. */
914 }
915 
922  /* This function should be implemented by the user application.
923  It is called into this driver when the current buffer is filled
924  to prepare the next buffer pointer and its size. */
925 }
926 
943 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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.
Generated by   doxygen 1.8.13