原文:
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
词条有波形的试音,可以用于验证程序结果
阅读(5633) | 评论(0) | 转发(0) |