You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32F103C8如何将8kHz音频采样率提升至11kHz或16kHz

采样率调整方法

你的音频采样率完全由TIM3的计数间隔决定,当前8kHz的配置逻辑是TIM3每125μs触发一次ADC采样,修改对应参数即可实现更高采样率:

1. 核心计算公式

STM32F103C8默认TIM3挂载在APB1总线,若你使用默认72MHz系统时钟,TIM3的工作时钟为72MHz,采样率计算公式为:
采样率Fs = 72000000 / ( (预分频值PSC + 1) * (自动重装值ARR + 1) )

2. 具体修改步骤

  • 修改采样长度宏定义:要存储1秒的音频数据,11kHz采样将#define SAMP 8000改为#define SAMP 11025,16kHz采样改为#define SAMP 16000
  • 调整TIM3配置参数:
    • 16kHz采样参考配置:htim3.Init.Prescaler = 9-1,htim3.Init.Period = 500-1,代入公式计算得72M/(9*500)=16000Hz,无误差
    • 11.025kHz采样参考配置:htim3.Init.Prescaler = 2-1,htim3.Init.Period = 3265-1,计算得72M/(2*3265)≈11025Hz,误差小于0.01%,完全满足普通音频需求
  • 修改采样触发判断阈值:把代码里while((__HAL_TIM_GET_COUNTER(&htim3))<124)的124改为你设置的ARR值(比如16kHz就改成499,11kHz就改成3264)

3. 注意事项

  • 不要把大容量采样数组定义在main函数的栈空间里:STM32F103C8只有20KB RAM,16kHz采样的uint16数组占32KB,超出栈容量会跑飞,建议把uint16_t dat[SAMP]改成全局变量,或者缩短采样时长(比如采0.5秒就把SAMP设为8000)
  • 现有串口输出逻辑要调整:你当前每发一个采样值加1ms延迟,16000个点发完需要16秒,建议去掉HAL_Delay(1),同时把串口波特率调高到115200以上,避免输出速度跟不上采样速度
  • ADC转换速度足够支撑16kHz采样:STM32F1的ADC单次转换最长仅需1.17μs,远小于16kHz对应的62.5μs采样间隔,无需调整ADC配置
// 16kHz采样修改后的核心代码示例
#define SAMP 16000 // 采样长度修改为16000对应1秒16kHz采样

// TIM3配置修改
htim3.Instance = TIM3;
htim3.Init.Prescaler = 9-1; // 预分频改为9
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 500-1; // 自动重装值改为500
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
{
  Error_Handler();
}

// 采样触发判断修改
for(k=0;k<SAMP;k++)
{
    while((__HAL_TIM_GET_COUNTER(&htim3))<499); // 阈值改为ARR-1即499
    HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
    dat[k] = HAL_ADC_GetValue(&hadc1);
}

内容的提问来源于stack exchange,提问作者Jason

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:42:02