本文讨论I2S的音频输出不同的波形 I2S的时钟设可以基于系统时钟或者PLL3的输出,使用PLL3可以利用PLL3MUL进行更多的调节 由于主板设计音频模块需要MCK主时钟的输出,根据参考手册中的公式,可以反向计算I2SDIV和PLL3MUL值的组合,以达到更精确的目的 参考手册中的16位数据公式与实际芯片不符,参考32位公式,更正为 FS = I2SxCLK / [(16*2)*((2*I2SDIV)+ODD)*4)] I2SDIV = (I2SxCLK / FS*(16*2*4) - ODD) / 2 I2SxCLK 是PLL3的输出时钟 PLL3MUL为16x,I2SDIV为6,ODD为1时,FS输出为最近似48000Hz的48077Hz rcc->cfgr2 |= 0x0003E744; // I2S2=PLL3 PLL3=16x PREDIV1SRC=PLL2 PLL2MUL=x9 PREDIV2=/5 PREDEV1=/5 spi2->i2spr = 0x0306; // 48000khz mck=1 odd=0 div=0x02 I2S的16位设置为SPI输出双字节为一个声道的一帧,左右声道互相交替 while ((spi2->sr & 0x2)==0x0); spi2->dr = lch[ii]; while ((spi2->sr & 0x2)==0x0); spi2->dr = rch[ii]; 标准音频率为440Hz,数据缓冲的帧数为48000/440=111 生成4种波形 正弦波 waveform_gen_sine 三角波 waveform_gen_triangle 锯齿波 waveform_gen_sawtooth 直方波 waveform_gen_square Wikipedia的Waveform词条有波形的试音,可以用于验证程序结果 |