
有人想使用STM32G474芯片做Half模式的PWM输出,发现有点问题,明明配置了定时器A的两路输出, 结果总是只有1路输出。这里简单演示下实现过程。【顺便提醒下,并非STM32G4全系列都内置高精度定时器】 $ B- X m% n( ^4 e 所谓Half模式就是指硬件基于给定的计数周期值自动输出占空比为50%的方波,用户无须对比较寄存器的值再进行设置,这里硬件默认使用比较寄存器1【cmp1】,硬件自动将用户设置的PERIOD值的一半赋给CMP1寄存器。换言之,用户此时无法对CMP1寄存器进行赋值。 另外,对于输出配置必须使用CMP1比较事件和定时器的Period周期事件。 ![]() 关于HALF模式的原理就介绍到这里,下面就使用STM32G474RE的Nucleo开发板演示下实现过程,主要是软件配置,硬件没啥要处理的,有块开发板就行。0 z- g' V8 r, q" U( O ![]() 9 U% ^% _* q8 X& Q# L/ }$ X 先使用STM32CubeMx进行配置【其它RCC等的配置此处就不说了】。) Q3 ~/ v1 N2 K. P! t2 \ # H* s1 |' v+ K8 u1 O/ A ![]() ( c! r# _8 s+ k1 d3 b 下面截图橙色框中的配置是必须的,有关定时器的时间参数我随便配置的,毕竟这里只是演示一下功能。 ![]() 这里的比较单元1必须使能,使能即可,无须参数配置。- A1 A9 C$ ]/ A" @1 Y9 J ![]() % m* @% M y) J, Q, S( p 下面关于TA1/TA2输出的配置,也是必须的关键配置。 ! B/ p# m% _+ S4 E' c9 @ ![]() % M$ I, R& f- W 至于定时器的其它配置,保持默认即可。配置完成后,生成初始化代码,然后加入合适的用户代码。, M: `* @" J8 e, s/ m2 ? HAL_HRTIM_WaveformCountStart(&hhrtim1, HRTIM_TIMERID_TIMER_A); ) ?2 s- [5 v8 ?# \& n HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TA1);9 D$ v, D0 F* Q$ t( C5 F4 [ HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TA2); {8 M3 B, K# o# o ( \& h7 Y9 C8 `4 [# J x2 P 编译运行看结果: ![]() ( {- x H" H1 q4 ` 因为我把TA1/TA2极性选择是相反的,所有此时输出的是两路互补波形,如果二者极性选择一致,输出的就是两路占空比为50%的相同波形。$ Z$ V1 k- R" R9 @ |