新手入门
- 积分
- 16
- 金钱
- 16
- 注册时间
- 2025-1-13
- 在线时间
- 4 小时
|
/* SAI Block A采样率设置
* 采样率计算公式(以NOMCK=0,OSR=0为前提):
* Fmclk = 256*Fs = sai_x_ker_ck / MCKDIV[5:0]
* Fs = sai_x_ker_ck / (256 * MCKDIV[5:0])
* Fsck = Fmclk * (FRL[7:0]+1) / 256 = Fs * (FRL[7:0] + 1)
* 其中:
* sai_x_ker_ck = (HSE / PLL2DIVM) * (PLL2DIVN + 1) / (PLL2DIVP + 1)
* HSE:一般为25Mhz
* PLL2DIVM :1~63,表示1~63分频
* PLL2DIVN :3~511,表示4~512倍频
* PLL2DIVP :0~127,表示1~128分频
* MCKDIV :0~63,表示1~63分频,0也是1分频,推荐设置为偶数
* SAI A分频系数表@PLL2DIVM=25,HSE=25Mhz,即vco输入频率为1Mhz
* 表格式:
* 采样率|(PLL2DIVN+1)|(PLL2DIVP+1)|MCKDIV
*/
const uint16_t SAI_PSC_TBL[][5]=
{
{ 800 , 344, 7, 0, 12 }, /* 8Khz采样率 */
{ 1102, 429, 2, 18, 2 }, /* 11.025Khz采样率 */
{ 1600, 344, 7, 0, 6 }, /* 16Khz采样率 */
{ 2205, 429, 2, 18, 1 }, /* 22.05Khz采样率 */
{ 3200, 344, 7, 0, 3 }, /* 32Khz采样率 */
{ 4410, 429, 2, 18, 0 }, /* 44.1Khz采样率 */
{ 4800, 344, 7, 0, 2 }, /* 48Khz采样率 */
{ 8820, 271, 2, 2, 1 }, /* 88.2Khz采样率 */
{ 9600, 344, 7, 0, 1 }, /* 96Khz采样率 */
{ 17640, 271, 2, 2, 0 }, /* 176.4Khz采样率 */
{ 19200, 344, 7, 0, 0 }, /* 192Khz采样率 */
};
/**
* @brief 设置SAIA的采样率(@MCKEN)
* @param samplerate:采样率, 单位:Hz
* @retval 0,设置成功
* 1,无法设置
*/
uint8_t sai1_samplerate_set(uint32_t samplerate)
{
uint8_t i = 0;
RCC_PeriphCLKInitTypeDef rcc_sai1_sture;
for (i = 0; i < (sizeof(SAI_PSC_TBL) / 10); i++) /* 看看改采样率是否可以支持 */
{
if ((samplerate / 10) == SAI_PSC_TBL[0])
{
break;
}
}
if (i == (sizeof(SAI_PSC_TBL) / 10))
{
return 1; /* 搜遍了也找不到 */
}
rcc_sai1_sture.PeriphClockSelection = RCC_PERIPHCLK_SAI1; /* 外设时钟源选择 */
rcc_sai1_sture.Sai1ClockSelection = RCC_SAI1CLKSOURCE_PLL2; /* 设置PLL2 */
rcc_sai1_sture.PLL2.PLL2M = 25; /* 设置PLL2M */
rcc_sai1_sture.PLL2.PLL2N = (uint32_t)SAI_PSC_TBL[1]; /* 设置PLL2N */
rcc_sai1_sture.PLL2.PLL2P = (uint32_t)SAI_PSC_TBL[2]; /* 设置PLL2P */
HAL_RCCEx_PeriphCLKConfig(&rcc_sai1_sture); /* 设置时钟 */
__HAL_SAI_DISABLE(&g_sai1_a_handle); /* 关闭SAI */
g_sai1_a_handle.Init.AudioFrequency = samplerate; /* 设置播放频率 */
HAL_SAI_Init(&g_sai1_a_handle); /* 初始化SAI */
sai1_saia_dma_enable(); /* 开启SAI的DMA功能 */
__HAL_SAI_ENABLE(&g_sai1_a_handle); /* 开启SAI */
return 0;
}暂时怀疑是时钟配置问题,有没有大佬给我点建议
|
|