在 stm32f769i-Discovery 上使用 BSP 库进行录音时出现问题

Posted

技术标签:

【中文标题】在 stm32f769i-Discovery 上使用 BSP 库进行录音时出现问题【英文标题】:Problem when use BSP library to audio record on stm32f769i-Discovery 【发布时间】:2021-04-12 09:46:02 【问题描述】:

我正在与stm32f769 合作,使用stm32f769 的mems 传感器和电路板支持包库进行记录。但是我在使用BSP_AUDIO_IN_Record 函数时遇到了问题。我意识到当执行完成并且没有保存声音值时,HAL_DFSDM_FilterRegConvCpltCallbackHAL_DFSDM_FilterRegConvHalfCpltCallback 函数没有被调用,但是应用程序仍然可以使用 ST 的模板正常工作。

我该如何解决这个问题?

我的代码:

int main(void)

  /* Enable I-Cache---------------------------------------------------------*/
  
SCB_EnableICache();

  /* Enable D-Cache---------------------------------------------------------*/
  
SCB_EnableDCache();

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  
/* USER CODE BEGIN 2 */
    
BSP_AUDIO_IN_Init(BSP_AUDIO_FREQUENCY_16K, DEFAULT_AUDIO_IN_BIT_RESOLUTION, DEFAULT_AUDIO_IN_CHANNEL_NBR);
    
BSP_AUDIO_IN_AllocScratch (Scratch_, SCRATCH_BUFF_SIZE);
    
BSP_AUDIO_IN_Record((uint16_t*)&BufferCtl.pcm_buff[0], AUDIO_IN_PCM_BUFFER_SIZE);
    
BufferCtl.fptr = 1;
    
BufferCtl.pcm_ptr = 0;
    
BufferCtl.offset = 0;
    
BufferCtl.wr_state = BUFFER_EMPTY;

  while (1)
  

  

和图书馆:

stm32f769i_discovery.c stm32f769i_discovery.h stm32f769i_discovery_audio.c stm32f769i_discovery_audio.h wm8994.c wm8994.h

【问题讨论】:

【参考方案1】:

也许您忘记实现 IRQ 功能?它们在某些用例(例如您自己的用例)中是强制性的,并且它们必须实现相关外围驱动程序的正确HAL_xxx_IRQHandler()。这些 IRQ 处理函数正在处理和调用正确的回调函数。

查看STM32 HAL示例中的文件stm32f7xx_it.c。您可以在下面看到来自Audio_playback_and_record STM32 HAL 示例的此类文件的代码片段。

/* SAI handler declared in "stm32f769i_eval_audio.c" file */
extern SAI_HandleTypeDef haudio_out_sai;

extern DFSDM_Filter_HandleTypeDef       haudio_in_dfsdm_leftfilter;
extern DFSDM_Filter_HandleTypeDef       haudio_in_dfsdm_rightfilter;

// ...
// ...

/**
  * @brief This function handles DMA2 Stream 4 interrupt request.
  * @param None
  * @retval None
  */
void AUDIO_SAIx_DMAx_IRQHandler(void)

  HAL_DMA_IRQHandler(haudio_out_sai.hdmatx);


/**
  * @brief This function handles DMA2 Stream 0 interrupt request.
  * @param None
  * @retval None
  */
void AUDIO_DFSDM_DMAx_LEFT_IRQHandler(void)

  HAL_DMA_IRQHandler(haudio_in_dfsdm_leftfilter.hdmaReg);


/**
  * @brief This function handles DMA2 Stream 0 interrupt request.
  * @param None
  * @retval None
  */
void AUDIO_DFSDM_DMAx_RIGHT_IRQHandler(void)

  HAL_DMA_IRQHandler(haudio_in_dfsdm_rightfilter.hdmaReg);

另一个问题可能是您检查录音是否真的发生的方法。在您提供的代码中,我找不到类似的东西,所以如果您不提供更多详细信息,我将无法帮助您。

【讨论】:

以上是关于在 stm32f769i-Discovery 上使用 BSP 库进行录音时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

stm32f769ni-discovery编译例程需要修改

如何使用随附的原始 DEMO 代码重新编程 stm32F769 DISCO 板?

STM32学习笔记:开篇准备

STM32与FreeRTOS实现低功耗

STM32(在线使用 Mbed)在较高的模拟输入频率下显示延迟

stm32f405和stm32f407的区别