如何配置STM32F703的I2S主时钟?44.1kHz采样率时钟调整异常
STM32F703 I2S MCLK频率不随PLLI2SDivQ变化的排查与解决
核心问题分析
你遇到的MCLK始终等于PLLI2SR输出(112.896MHz),说明修改PLLI2SDivQ的配置没有作用到MCLK的时钟路径上,大概率是时钟源选择错误或PLL配置未生效导致的。
分步排查与解决
1. 确保PLLI2SDivQ配置生效
STM32的PLL参数修改必须先关闭对应PLL,修改后重新使能,否则寄存器变更不会生效:
- 禁用PLLI2S,等待就绪位清零;
- 修改
RCC_PLLI2SCFGR寄存器的PLLI2SDIVQ位(注意:寄存器存储值为分频比-2,比如分频比5对应写入5-2=3); - 重新使能PLLI2S,等待就绪位置位;
- 可通过调试器读取
RCC_PLLI2SCFGR寄存器值,确认配置是否写入成功。
2. 确认I2S时钟源选择为PLLI2SQ
PLLI2SDivQ是对PLLI2SQ分频,而非PLLI2SR。如果I2S时钟源直接选了PLLI2SR,修改PLLI2SDivQ自然不会影响MCLK:
- 检查
RCC_DCKCFGR1寄存器的I2SxSEL位(x为对应I2S外设编号):- 取值
11时,时钟源为PLLI2SQ(经过PLLI2SDivQ分频后的时钟); - 若当前是
10(PLLI2SR),需改为11。
- 取值
3. 验证I2S外设的MCLK输出配置
即使时钟源正确,还需确保I2S外设正确输出MCLK:
- 开启
I2Sx_CR2寄存器的MCKOE位,使能MCLK引脚输出; - 根据目标MCLK频率(比如44.1kHz采样率常用的256×fₛ=11.2896MHz),配置
DIV和ODD位调整分频比:- 若PLLI2SQ输出已经是11.2896MHz(即
PLLI2SDivQ=10时112.896/10=11.2896),则无需额外分频,直接输出即可。
- 若PLLI2SQ输出已经是11.2896MHz(即
4. 硬件引脚验证
确认示波器测量的是正确的I2S MCLK引脚(比如I2S1的MCLK为PB6或PE2),引脚已配置为对应复用功能(如AF5),且无其他外设占用该引脚。
配置示例(寄存器级)
// 关闭PLLI2S RCC->CR &= ~RCC_CR_PLLI2SON; while((RCC->CR & RCC_CR_PLLI2SRDY)); // 等待PLLI2S关闭 // 设置PLLI2SDivQ为5(分频比5) RCC->PLLI2SCFGR &= ~RCC_PLLI2SCFGR_PLLI2SDIVQ; RCC->PLLI2SCFGR |= (5-2) << RCC_PLLI2SCFGR_PLLI2SDIVQ_Pos; // 重新开启PLLI2S RCC->CR |= RCC_CR_PLLI2SON; while(!(RCC->CR & RCC_CR_PLLI2SRDY)); // 等待PLLI2S就绪 // 设置I2S1时钟源为PLLI2SQ RCC->DCKCFGR1 &= ~RCC_DCKCFGR1_I2S1SEL; RCC->DCKCFGR1 |= RCC_DCKCFGR1_I2S1SEL_1 | RCC_DCKCFGR1_I2S1SEL_0; // 开启I2S1 MCLK输出 I2S1->CR2 |= SPI_CR2_MCKOE;
内容的提问来源于stack exchange,提问作者Nima Aghayan
相关产品推荐
相关产品推荐

