打印
[STM32H7]

各位老大有没有使用STM32 CUBEMX中使用SAI生成TDM音频接口

[复制链接]
520|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
njchenmin|  楼主 | 2024-1-16 09:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
需要接一个四输入的音频ADC,以前用F413,L452都没有问题,但使用H750自动生成代码,启动后中断一次,中断后出现传输错误,全部清除状态,在中断前,测试各个时钟全部正确。硬件是买的核心板应该没问题。使用ST的工程,他里面只有SAI作为PDM麦克风输入的程序,也是正常的,不知道出现什么问题。
代码初始化代码如下:
static void MX_SAI4_Init(void)
{

  /* USER CODE BEGIN SAI4_Init 0 */

  /* USER CODE END SAI4_Init 0 */

  /* USER CODE BEGIN SAI4_Init 1 */

  /* USER CODE END SAI4_Init 1 */
  hsai_BlockA4.Instance = SAI4_Block_A;
  hsai_BlockA4.Init.Protocol = SAI_FREE_PROTOCOL;
  hsai_BlockA4.Init.AudioMode = SAI_MODEMASTER_RX;
  hsai_BlockA4.Init.DataSize = SAI_DATASIZE_16;
  hsai_BlockA4.Init.FirstBit = SAI_FIRSTBIT_MSB;
  hsai_BlockA4.Init.ClockStrobing = SAI_CLOCKSTROBING_FALLINGEDGE;
  hsai_BlockA4.Init.Synchro = SAI_ASYNCHRONOUS;
  hsai_BlockA4.Init.OutputDrive = SAI_OUTPUTDRIVE_DISABLE;
  hsai_BlockA4.Init.NoDivider = SAI_MASTERDIVIDER_ENABLE;
  hsai_BlockA4.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_EMPTY;
  hsai_BlockA4.Init.AudioFrequency = SAI_AUDIO_FREQUENCY_48K;
  hsai_BlockA4.Init.SynchroExt = SAI_SYNCEXT_DISABLE;
  hsai_BlockA4.Init.MonoStereoMode = SAI_STEREOMODE;
  hsai_BlockA4.Init.CompandingMode = SAI_NOCOMPANDING;
  hsai_BlockA4.Init.PdmInit.Activation = ENABLE;
  hsai_BlockA4.Init.PdmInit.MicPairsNbr = 2;
  hsai_BlockA4.Init.PdmInit.ClockEnable = SAI_PDM_CLOCK1_ENABLE;
  hsai_BlockA4.FrameInit.FrameLength = 64;
  hsai_BlockA4.FrameInit.ActiveFrameLength = 1;
  hsai_BlockA4.FrameInit.FSDefinition = SAI_FS_STARTFRAME;
  hsai_BlockA4.FrameInit.FSPolarity = SAI_FS_ACTIVE_HIGH;
  hsai_BlockA4.FrameInit.FSOffset = SAI_FS_FIRSTBIT;
  hsai_BlockA4.SlotInit.FirstBitOffset = 0;
  hsai_BlockA4.SlotInit.SlotSize = SAI_SLOTSIZE_DATASIZE;
  hsai_BlockA4.SlotInit.SlotNumber = 4;
  hsai_BlockA4.SlotInit.SlotActive = 0x0000000F;
  if (HAL_SAI_Init(&hsai_BlockA4) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN SAI4_Init 2 */

  /* USER CODE END SAI4_Init 2 */

}


void HAL_SAI_MspInit(SAI_HandleTypeDef* hsai)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
/* SAI4 */
    if(hsai->Instance==SAI4_Block_A)
    {
    /* Peripheral clock enable */

  /** Initializes the peripherals clock
  */
    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SAI4A;
    PeriphClkInitStruct.PLL2.PLL2M = 11;
    PeriphClkInitStruct.PLL2.PLL2N = 346;
    PeriphClkInitStruct.PLL2.PLL2P = 32;
    PeriphClkInitStruct.PLL2.PLL2Q = 2;
    PeriphClkInitStruct.PLL2.PLL2R = 2;
    PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;
    PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
    PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
    PeriphClkInitStruct.Sai4AClockSelection = RCC_SAI4ACLKSOURCE_PLL2;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    {
      Error_Handler();
    }
   

    if (SAI4_client == 0)
    {
       __HAL_RCC_SAI4_CLK_ENABLE();
    }
    SAI4_client ++;

    /**SAI4_A_Block_A GPIO Configuration
    PE2     ------> SAI4_MCLK_A
    PE4     ------> SAI4_FS_A
    PE5     ------> SAI4_SCK_A
    PE6     ------> SAI4_SD_A
    */
    GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF8_SAI4;
    HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

      /* Peripheral DMA init*/

    hdma_sai4_a.Instance = BDMA_Channel0;
    hdma_sai4_a.Init.Request = BDMA_REQUEST_SAI4_A;
    hdma_sai4_a.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_sai4_a.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_sai4_a.Init.MemInc = DMA_MINC_ENABLE;
    hdma_sai4_a.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    hdma_sai4_a.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    hdma_sai4_a.Init.Mode = DMA_CIRCULAR;
    hdma_sai4_a.Init.Priority = DMA_PRIORITY_LOW;
    if (HAL_DMA_Init(&hdma_sai4_a) != HAL_OK)
    {
      Error_Handler();
    }

    /* Several peripheral DMA handle pointers point to the same DMA handle.
     Be aware that there is only one channel to perform all the requested DMAs. */
    __HAL_LINKDMA(hsai,hdmarx,hdma_sai4_a);

    __HAL_LINKDMA(hsai,hdmatx,hdma_sai4_a);

    }
}

void BDMA_Channel0_IRQHandler(void)
{
  /* USER CODE BEGIN BDMA_Channel0_IRQn 0 */

  /* USER CODE END BDMA_Channel0_IRQn 0 */
  HAL_DMA_IRQHandler(&hdma_sai4_a);
  /* USER CODE BEGIN BDMA_Channel0_IRQn 1 */

  /* USER CODE END BDMA_Channel0_IRQn 1 */
}

使用特权

评论回复
评论
21小跑堂 2024-2-4 14:05 回复TA
下次发完主题帖可以给自己回个帖顶一顶,这样更容易被大家看到,因为更新快,被压下去了,被看到的几率小 
沙发
夜阑风雨| | 2024-3-21 08:47 | 只看该作者
确保音频ADC所需的时钟配置正确。这包括主时钟、PLL配置、外设时钟等

使用特权

评论回复
板凳
远山寻你| | 2024-3-21 11:00 | 只看该作者
在使用H750时,时钟配置可能与之前的F413、L452有所不同,需要特别注意

使用特权

评论回复
地板
淡漠安然| | 2024-3-21 13:00 | 只看该作者
检查中断服务程序是否正确配置。在H750上,中断处理可能有一些特殊的要求或者配置方式,需要确保中断服务程序正确地处理了音频ADC的中断。

使用特权

评论回复
5
别乱了阵脚| | 2024-3-21 15:00 | 只看该作者
音频ADC通常会使用DMA进行数据传输,确保DMA配置正确,包括DMA通道选择、传输方向、传输大小等

使用特权

评论回复
6
冰春彩落下| | 2024-3-21 19:00 | 只看该作者
确保音频ADC的电源和地线连接正确,以及供电稳定

使用特权

评论回复
7
一秒落纱| | 2024-3-21 21:00 | 只看该作者
H750与之前的F413、L452可能有一些不同的特性或者寄存器配置,需要查阅H750的参考手册或者技术资料,确保针对H750的特性进行正确的配置。

使用特权

评论回复
8
江河千里| | 2024-3-22 01:00 | 只看该作者
一般正点原子应该是有相关的例程的吧,你可以看看的

使用特权

评论回复
9
暖了夏天蓝了海| | 2024-3-22 05:00 | 只看该作者
Cubemx直接配置PDM接口的话,可以去B站看看视频,有cubemx配置麦克风操作的视频

使用特权

评论回复
10
光辉梦境| | 2024-3-22 05:00 | 只看该作者
还是先看看硬件,硬件是开发板么?还是自己设计的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

345

帖子

1

粉丝