硬汉嵌入式论坛

 找回密码
 立即注册
查看: 921|回复: 1
收起左侧

[SAI/I2S] STM32H7 HAL库,I2S 采样频率的设置问疑问。

[复制链接]

26

主题

23

回帖

101

积分

初级会员

积分
101
发表于 2022-4-27 09:15:10 | 显示全部楼层 |阅读模式
我用这个SystemClock_Config() 设置不同的主频后,然后 I2Sxext_Mode_Config() 设置采样频率。是否设置不同的主频时,只要给 I2Sxext_Mode_Config() 的参数_usAudioFreq不变,实际设置的采样频率的就不变?




void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};

  /** Supply configuration update enable
  */
  HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
  /** Configure the main internal regulator output voltage
  */
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);

  while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
  /** Macro to configure the PLL clock source
  */
  __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);
  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 5;
  RCC_OscInitStruct.PLL.PLLN = 40;        //112  80   ********不同的主频***********
  RCC_OscInitStruct.PLL.PLLP = 2;
  RCC_OscInitStruct.PLL.PLLQ = 2;
  RCC_OscInitStruct.PLL.PLLR = 2;
  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
  RCC_OscInitStruct.PLL.PLLFRACN = 0;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
                              |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7) != HAL_OK)
  {
    Error_Handler();
  }
}




void I2Sxext_Mode_Config(const uint16_t _usStandard, const uint16_t _usWordLen,const uint32_t _usAudioFreq)
{
        /* PLL时钟根据AudioFreq设置 (44.1khz vs 48khz groups) */
  BSP_AUDIO_OUT_ClockConfig(&I2Sext_InitStructure,_usAudioFreq, NULL); /* Clock config is shared between AUDIO IN and OUT */

        /* 打开 I2S2 APB1 时钟 */
        WM8978_CLK_ENABLE();

        /* 复位 SPI1 外设到缺省状态 */
        HAL_I2S_DeInit(&I2Sext_InitStructure);

        /* I2S2 外设配置 */
        I2Sext_InitStructure.Instance = WM8978_I2Sx_SPI;
        I2Sext_InitStructure.Init.Mode = I2S_MODE_MASTER_RX;                        /* 配置I2S工作模式 */
        I2Sext_InitStructure.Init.Standard = _usStandard;                                /* 接口标准 */
        I2Sext_InitStructure.Init.DataFormat = _usWordLen;                                /* 数据格式,16bit */
        I2Sext_InitStructure.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE;        /* 主时钟模式 */
        I2Sext_InitStructure.Init.AudioFreq = _usAudioFreq;                        /* 音频采样频率 */
        I2Sext_InitStructure.Init.CPOL = I2S_CPOL_LOW;  
        if(HAL_I2S_Init(&I2Sext_InitStructure) != HAL_OK)
  {
      printf("I2S初始化失败\r\n");
  }
}



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106882
QQ
发表于 2022-4-27 09:35:24 | 显示全部楼层
这个要看HAL库代码是否做处理了,

像串口,不同主频下,串口波特率有做适配,你也可以实际测试下就知道了,或者分析HAL源码。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-8 19:02 , Processed in 0.147927 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表