
有人想使用STM32G474芯片做Half模式的PWM输出,发现有点问题,明明配置了定时器A的两路输出, 结果总是只有1路输出。这里简单演示下实现过程。【顺便提醒下,并非STM32G4全系列都内置高精度定时器】, j/ C$ a/ J7 Y8 j% `; p , X) J! V$ y; U2 M8 u1 X 所谓Half模式就是指硬件基于给定的计数周期值自动输出占空比为50%的方波,用户无须对比较寄存器的值再进行设置,这里硬件默认使用比较寄存器1【cmp1】,硬件自动将用户设置的PERIOD值的一半赋给CMP1寄存器。换言之,用户此时无法对CMP1寄存器进行赋值。' P" R3 U# }: n" x/ g9 D 另外,对于输出配置必须使用CMP1比较事件和定时器的Period周期事件。( N9 z4 T- a6 `4 L' q ![]() 7 s2 z3 ~! l: ~2 Q 关于HALF模式的原理就介绍到这里,下面就使用STM32G474RE的Nucleo开发板演示下实现过程,主要是软件配置,硬件没啥要处理的,有块开发板就行。, c6 a( b) ~' t g3 p8 P : | R& e. ^$ F) B- ]0 ]- ^* D ![]() / k* t! w5 `' h 先使用STM32CubeMx进行配置【其它RCC等的配置此处就不说了】。/ M9 j |3 h3 J0 X! l( e % b' N5 K! m# W: \' [ ![]() & O5 W" u# u7 A' A* s. x2 ?! x. v: b 下面截图橙色框中的配置是必须的,有关定时器的时间参数我随便配置的,毕竟这里只是演示一下功能。 3 t$ k7 L" H5 {0 U L ![]() 2 M t( C9 E9 k: K5 ] 这里的比较单元1必须使能,使能即可,无须参数配置。* v' ]) a- N7 q" }' A# l ![]() : M+ F8 a' a# r$ U9 ]% A8 c( g" c 下面关于TA1/TA2输出的配置,也是必须的关键配置。" f9 s o! g( @, X/ F( o ![]() 0 y* |/ h1 O' g# S0 c& o 至于定时器的其它配置,保持默认即可。配置完成后,生成初始化代码,然后加入合适的用户代码。6 c: p9 P2 v" ~3 [0 z) ]! k% Q HAL_HRTIM_WaveformCountStart(&hhrtim1, HRTIM_TIMERID_TIMER_A); / K% q+ t j5 u* Z; z2 M5 o+ M6 c HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TA1);: k- i4 _( e" H 3 W" ^ ]9 x# t; c/ j9 c3 N8 e: ` HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TA2); 3 o; O9 ^% x, n8 P" @8 j6 e 4 r9 j& e. H* l% p# V# Y 编译运行看结果: - X( P, r e$ O ]9 k2 X( W ![]() 因为我把TA1/TA2极性选择是相反的,所有此时输出的是两路互补波形,如果二者极性选择一致,输出的就是两路占空比为50%的相同波形。 o: }; q0 D: N- c |