Skip to content

Commit f9909c5

Browse files
committed
Add support to 11kHz 22kHz and 44kHz sampling rate
1 parent a216699 commit f9909c5

File tree

1 file changed

+33
-11
lines changed

1 file changed

+33
-11
lines changed

libraries/PDM/src/stm32/audio.c

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,11 @@ static uint8_t get_mck_div(uint32_t frequency)
8989
{
9090
switch(frequency){
9191
case AUDIO_FREQUENCY_8K: return 48; //SCK_x = sai_x_ker_ck/48 = 1024KHz Ffs = SCK_x/64 = 16KHz stereo
92+
case AUDIO_FREQUENCY_11K: return 8; //SCK_x = sai_x_ker_ck/8 = 1411KHz Ffs = SCK_x/64 = 22KHz stereo
9293
case AUDIO_FREQUENCY_16K: return 24; //SCK_x = sai_x_ker_ck/24 = 2048KHz Ffs = SCK_x/64 = 32KHz stereo
94+
case AUDIO_FREQUENCY_22K: return 4; //SCK_x = sai_x_ker_ck/4 = 2822KHz Ffs = SCK_x/64 = 44KHz stereo
9395
case AUDIO_FREQUENCY_32K: return 12; //SCK_x = sai_x_ker_ck/12 = 4096KHz Ffs = SCK_x/64 = 64KHz stereo
96+
case AUDIO_FREQUENCY_44K: return 2; //SCK_x = sai_x_ker_ck/2 = 5644KHz Ffs = SCK_x/64 = 88KHz stereo
9497
case AUDIO_FREQUENCY_48K: return 8; //SCK_x = sai_x_ker_ck/8 = 6144KHz Ffs = SCK_x/64 = 96KHz stereo
9598
case AUDIO_FREQUENCY_64K: return 6; //SCK_x = sai_x_ker_ck/6 = 8192KHz Ffs = SCK_x/64 = 128KHz stereo
9699
case AUDIO_FREQUENCY_96K: return 4; //SCK_x = sai_x_ker_ck/4 = 12288KHz Ffs = SCK_x/64 = 192KHz stereo
@@ -141,26 +144,45 @@ int py_audio_init(size_t channels, uint32_t frequency, int gain_db, float highpa
141144

142145
HAL_RCCEx_GetPeriphCLKConfig(&rcc_ex_clk_init_struct);
143146

144-
/* SAI clock config:
145-
PLL2_VCO Input = HSE_VALUE/PLL2M = 1 Mhz
146-
PLL2_VCO Output = PLL2_VCO Input * PLL2N = 344 Mhz
147-
sai_x_ker_ck = PLL2_VCO Output/PLL2P = 344/7 = 49.142 Mhz */
148-
rcc_ex_clk_init_struct.PeriphClockSelection = RCC_PERIPHCLK_SAI4A;
149-
rcc_ex_clk_init_struct.Sai4AClockSelection = RCC_SAI4ACLKSOURCE_PLL2;
150-
rcc_ex_clk_init_struct.PLL2.PLL2P = 7;
151-
rcc_ex_clk_init_struct.PLL2.PLL2Q = 1;
152-
rcc_ex_clk_init_struct.PLL2.PLL2R = 1;
153-
rcc_ex_clk_init_struct.PLL2.PLL2N = 344;
154-
rcc_ex_clk_init_struct.PLL2.PLL2M = isBoardRev2() ? 25 : 27;
147+
if((frequency == AUDIO_FREQUENCY_11K) || (frequency == AUDIO_FREQUENCY_22K) || (frequency == AUDIO_FREQUENCY_44K))
148+
{
149+
/* SAI clock config:
150+
PLL2_VCO Input = HSE_VALUE/PLL2M = 1 Mhz
151+
PLL2_VCO Output = PLL2_VCO Input * PLL2N = 429 Mhz
152+
SAI_CLK_x = PLL2_VCO Output/PLL2P = 429/38 = 11.289 Mhz */
153+
rcc_ex_clk_init_struct.PeriphClockSelection = RCC_PERIPHCLK_SAI4A;
154+
rcc_ex_clk_init_struct.Sai4AClockSelection = RCC_SAI4ACLKSOURCE_PLL2;
155+
rcc_ex_clk_init_struct.PLL2.PLL2P = 38;
156+
rcc_ex_clk_init_struct.PLL2.PLL2Q = 1;
157+
rcc_ex_clk_init_struct.PLL2.PLL2R = 1;
158+
rcc_ex_clk_init_struct.PLL2.PLL2N = 429;
159+
rcc_ex_clk_init_struct.PLL2.PLL2M = isBoardRev2() ? 25 : 27;
160+
161+
} else {
162+
/* SAI clock config:
163+
PLL2_VCO Input = HSE_VALUE/PLL2M = 1 Mhz
164+
PLL2_VCO Output = PLL2_VCO Input * PLL2N = 344 Mhz
165+
sai_x_ker_ck = PLL2_VCO Output/PLL2P = 344/7 = 49.142 Mhz */
166+
rcc_ex_clk_init_struct.PeriphClockSelection = RCC_PERIPHCLK_SAI4A;
167+
rcc_ex_clk_init_struct.Sai4AClockSelection = RCC_SAI4ACLKSOURCE_PLL2;
168+
rcc_ex_clk_init_struct.PLL2.PLL2P = 7;
169+
rcc_ex_clk_init_struct.PLL2.PLL2Q = 1;
170+
rcc_ex_clk_init_struct.PLL2.PLL2R = 1;
171+
rcc_ex_clk_init_struct.PLL2.PLL2N = 344;
172+
rcc_ex_clk_init_struct.PLL2.PLL2M = isBoardRev2() ? 25 : 27;
173+
}
155174

156175
HAL_RCCEx_PeriphCLKConfig(&rcc_ex_clk_init_struct);
157176

158177
sai_init();
159178

160179
// Sanity checks
161180
if ((frequency != AUDIO_FREQUENCY_8K) &&
181+
(frequency != AUDIO_FREQUENCY_11K) &&
162182
(frequency != AUDIO_FREQUENCY_16K) &&
183+
(frequency != AUDIO_FREQUENCY_22K) &&
163184
(frequency != AUDIO_FREQUENCY_32K) &&
185+
(frequency != AUDIO_FREQUENCY_44K) &&
164186
(frequency != AUDIO_FREQUENCY_48K) &&
165187
(frequency != AUDIO_FREQUENCY_64K) &&
166188
(frequency != AUDIO_FREQUENCY_96K)){

0 commit comments

Comments
 (0)