一,起因与需求背景:
现有一个需求通过pwm输入捕获测量pwm占空比,采集磁编码器绝对位置;
使用gd32H7固件库配置定时器外设时碰到以下问题,导致外设一直配置不通;
1.demo只配置一个通道
根据stm32单片机固件库经验,外部输入信号输入单片机会被分为两路单独捕获,计算周期和占空比,但是gd32h7固件库仅配置了一个通道,然后读取时直接读取了两个通道的数据;
2.使用timer2的1通道另一个通道怎么选
固件库参考例程里面外部信号连接的时TIMER1的TIMER_CH_0,默认使用的另一个通道为TIMER_CH_1,那我们在使用其他通道时应该怎么选择另一个通道,这里固件库没有太多参考价值;
3.通道配置顺序变化就无法进中断
4.定时器捕获后定时器不复位,后续捕获值很大
工程实际连接的时定时器2的ch1通道,由于没有太多参考例程,于是根据经验把ch0和ch1都配置了(这里时问题的关键,后面发现只需要配置一个通道),发现两个通道都能捕获了,但是一个周期后没有触发定时器复位,这就导致两个通道的捕获值一直递增,直到到达设定的溢出值自动重装定时器;
二,事情经过与问题解决
这里说到官方技术支持还是很给力的;
1.这条代码的作用是选择定时器2(TIMER2)的输入触发源。具体来说:
timer_input_trigger_source_select(TIMER2, TIMER_SMCFG_TRGSEL_CI1FE1);
这行代码将定时器2的输入触发源设置为 CI1FE1,这意味着定时器将根据通道1的输入信号的上升沿或下降沿来触发计数。这通常用于捕获外部信号的变化,以便进行频率和占空比的测量。在上下文中,这个设置是为了配置定时器以便能够正确地捕获PWM信号的输入,从而计算频率和占空比。
这里需要与外部输入信号对应起来,否则就算定时器能捕获到数据,但是没法触发相应事件,与下文触发定时器复位密切相关,这也是为什么“定时器捕获后定时器不复位,后续捕获值很大”的原因;
timer_slave_mode_select(TIMER2, TIMER_SLAVE_MODE_RESTART);
这句代码的作用是选择定时器2(TIMER2)的从模式,具体如下:将定时器2设置为“重启”从模式(TIMER_SLAVE_MODE_RESTART)。在这种模式下,当接收到触发信号时,定时器将重新开始计数。这通常用于同步多个定时器或在特定事件发生时重新启动计数。这个设置有助于确保定时器能够在接收到外部信号时正确地重新开始计数,从而实现精确的时间测量和信号捕获。
2.其他相关设置
注意一下,串口打印的占空比实际上是低电平的占空比;
示波器显示的占空比实际上是正电平的占空比;
三,相关参考内容
GD32 定时器输入捕获模式测量PWM占空比和频率_根据定时器测量占空比的原理-优快云博客