有人想使用STM32G474芯片做Half模式的PWM输出,发现有点问题,明明配置了定时器A的两路输出, 结果总是只有1路输出。这里简单演示下实现过程。【顺便提醒下,并非STM32G4全系列都内置高精度定时器】 所谓Half模式就是指硬件基于给定的计数周期值自动输出占空比为50%的方波,用户无须对比较寄存器的值再进行设置,这里硬件默认使用比较寄存器1【cmp1】,硬件自动将用户设置的PERIOD值的一半赋给CMP1寄存器。换言之,用户此时无法对CMP1寄存器进行赋值。+ p8 {5 E: Z# d% m; a$ r 另外,对于输出配置必须使用CMP1比较事件和定时器的Period周期事件。' C/ r, a7 ?9 c# f5 |; }7 Y + I$ Y7 G6 T" w0 \5 t- F1 b h 关于HALF模式的原理就介绍到这里,下面就使用STM32G474RE的Nucleo开发板演示下实现过程,主要是软件配置,硬件没啥要处理的,有块开发板就行。) x9 }/ t& K% S; ^5 T& ? * J- Q" k( X( A5 H1 W6 J 先使用STM32CubeMx进行配置【其它RCC等的配置此处就不说了】。 `2 w3 `) Y1 W9 a " w- e O9 X9 r# s 下面截图橙色框中的配置是必须的,有关定时器的时间参数我随便配置的,毕竟这里只是演示一下功能。 7 q1 d* l/ [: m9 v, p! u8 A8 C; h 这里的比较单元1必须使能,使能即可,无须参数配置。 + {) ]" b6 ~4 l0 q8 r4 I ; v. e# T/ S0 ^. b 下面关于TA1/TA2输出的配置,也是必须的关键配置。 至于定时器的其它配置,保持默认即可。配置完成后,生成初始化代码,然后加入合适的用户代码。 0 m% z5 y6 k. ^ HAL_HRTIM_WaveformCountStart(&hhrtim1, HRTIM_TIMERID_TIMER_A); ( _. b/ p# K7 ?2 j e- O 8 I: q. r$ @- B/ \ HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TA1);, S( O! ^1 c9 B* _3 r 6 l u/ A# X# Z HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TA2);3 Q& L4 K) O. o7 L0 v 0 @- E ^, M( p2 T( l 8 A- v% l+ n% U3 ]- E 编译运行看结果:" ?! {/ o* n' V & o5 I& _- M, V9 w0 I* f* H 因为我把TA1/TA2极性选择是相反的,所有此时输出的是两路互补波形,如果二者极性选择一致,输出的就是两路占空比为50%的相同波形。* v, m3 [) K! B8 o9 R/ I, G; ` + X' M' ^% y1 g: N- w$ y1 y 8 m3 H" X6 \/ a9 @' k |
STM32G系列RS485自动收发控制以及自适应波特率实战
【学习指南】基于STM32G474VET6 开发板实验经验分享(三)
【学习指南】基于STM32G474VET6 开发板实验经验分享(二)
【学习指南】基于STM32G474VET6 开发板基础实验经验分享一
【学习指南】基于STM32G474软件平台安装与使用教程
【学习指南】基于STM32G474VET6 开发板硬件资源解析
STM32 Explore | 基于STM32G474的STM32Cube生态系统线下培训
STM32固件库分享,超全系列整理
STM32G47x 双 Bank 模式下在线升级
基于STM32G473ZET6开发板设计经验分享