测试用的单片机是STM32F103C8T6 @72MHz,使用TIM1的通道1输出PWM。
示波器200MHz带宽(原120MHz软升级)。
TIM1配置:
预分频值:Prescaler(PSC) = 0;
自动装载值:Counter Period(ARR) = 1;
捕获比较寄存器值(设置脉宽):Capture Compare Register(CCR) = 1;
如此设置PWM频率可达72/2=36MHz。
注意:想要提高PWM频率就不要开启对应定时器的中断:
//HAL_TIM_Base_Start_IT(&htim1); //该函数用于开启定时器中断,此时应该屏蔽掉
若开启了定时器中断,预分频值要设置到35以上才能工作,算下来PWM频率就只能输出1MHz或更低;
若在定时器中断回调函数里改变IO电平观察周期,会发现即便设置了更高的定时器频率,IO电平改变周期在4μs以上;
在开启中断事件的定时器上设置周期低于4μs时,会产生很多奇怪问题:
(以下测试用TIM1产生PWM,用TIM2定时器中断事件翻转IO电平)
比如定时器中断开启函数在PWM开启函数之前,定时中断可以翻转电平(周期4μs),但PWM无波形输出:
反过来PWM在定时器中断之前开启,定时器中断可以翻转电平(周期4μs)、PWM可以正常输出波形:
我尝试在开启定时器中断之前用 __HAL_TIM_CLEAR_FLAG(&htim2, TIM_IT_UPDATE); 清除中断标志,问题没有解决。
总结:
(以下数据在 STM32F103 @72MHz 测试,仅供参考)
- 一个定时器只开启PWM功能时,PWM频率最高可达36MHz。
- 一个定时器既开启PWM又开启UpDate中断时,PWM频率最高可达1MHz。
- 一个定时器用于输出PWM、另一个定时器用于中断时还会出现几种情况:
①用于中断的定时器设定周期处于4μs以上时,两个定时器互不冲突正常工作。
②用于中断的定时器设定周期处于4μs以下时:如果定时器中断比PWM先开启了,中断回调周期还是4us但PWM无法输出;如果PWM比定时器先开启,中断回调周期4μs,PWM可以正常输出(频率可达36MHz)。