
在实际产品开发中有时可能需要实现一些指定个数脉冲的输出,这里介绍几种基于STM32定时器的实现方式。 1、 利用RCR寄存器结合单脉冲模式; 2、 利用DMA实时修改CCR寄存器的模式; 3、 利用定时器主从模式; 4、 利用中断对脉冲实现计数模式; ( @ b+ S# m" k0 C! t7 g7 X 一、利用RCR结合单脉冲模式 这种方式仅限于带RCR寄存器的高级定时器,配合单脉冲模式,实现起来非常方便。 基本原理:计数器发生RCR+1个溢出动作后触发更新事件,在单脉冲模式下,定时器发生更新事件时将停止计数并实现指定个数的脉冲输出。 ) x6 n H8 H% ^0 G ![]() 参考配置: ![]() ![]() 6 n+ M. K: u+ }, E% a7 X HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);//TIM1通道1输出一串脉冲。 [/ F* @5 Q4 r6 F9 N ![]() 5 s6 E0 t3 I7 {7 f4 U 二、利用DMA实时修改CCR寄存器的模式; 基本原理:基于定时器事件触发DMA从而动态修改CCR寄存器的值最终实现指定个数的脉冲输出。 ' k+ U& Z+ y: T N2 [ 下面示例使用定时器更新事件触发DMA,输出10个脉宽各不一样的脉冲. uint16_t DataforCCr[]={25,43,18,65,27,44,66,38,76,11,00}; 参考配置: ![]() ! D0 ^6 t1 r" {0 m6 F TIM_CCxChannelCmd(htim3.Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); __HAL_TIM_CLEAR_FLAG(&htim3, TIM_FLAG_UPDATE); __HAL_TIM_ENABLE_DMA(&htim3, TIM_DMA_UPDATE); : k% c# \ }: A7 L0 g) ~; ~ HAL_DMA_Start(&hdma_tim3_up, (uint32_t)DataforCCr, (uint32_t)&htim3.Instance->CCR1, 11); __HAL_TIM_ENABLE(&htim3); * s5 ~+ }$ T5 w9 g* e2 a TIM3->EGR = TIM_EGR_UG; ![]() 眼尖的人可能发现上图中最后有个额外的尖脉冲,那是因为这里是基于更新事件触发DMA,DMA传输新数据过来时有点延迟导致下一个PWM脉冲已经发生作用。这时,我们可以调整触发事件,比方这里将触发事件调整为比较事件,并开启预装功能即可以消除这个问题。上面测试过程是关闭了CCR寄存器的预装功能的。 该方式可以做到非常灵活精准,但要多用个DMA外设。 / R$ R" ~# x: e% _8 J 三、利用定时器主从模式 基本原理:利用两个定时器级联成主从模式,一个定时器输出门控信号,控制另外一个定时器的计数工作。 ![]() 下面TIM4工作在主模式,其OC输出作为触发信号给到TIM8,TIM8工作在门控模式。 TIM_CCxChannelCmd(htim4.Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); __HAL_TIM_ENABLE(&htim4); TIM_CCxChannelCmd(htim8.Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); __HAL_TIM_MOE_ENABLE(&htim8); __HAL_TIM_ENABLE(&htim8); ![]() ![]() 此模式实现起来简单快捷,但当门控信号与从定时器时钟缺乏同步关系时,输出脉冲个数可能有偏差,尤其结尾的电平可能摇摆不定。 / U" {6 T. u, `, S( y+ R 四、利用定时器中断模式
![]() ' K$ {3 i, G" W: q 比如:输出10个脉冲,最后电平停留在高电平。我们可以基于比较事件来对脉冲进行,并开启CCR寄存器的预装功能。若选用PWM1模式,极性选择为高有效,向上计数模式时,则在第10个比较中断里修改CCR=ARR+n[n大于等于1];若选用PWM2模式,极性选择为高有效,则在第10个比较中断里修改CCR=00。 1 |: A3 |# M( I% A 该模式实现起来较为简单,只需对定时器有些基本的了解即可,无需涉及定时器更多知识及DMA方面的应用等。 上面大体介绍了利用STM32定时器实现指定个数脉冲输出的四种模式,各有特色,供君参考。我们实际应用中可以灵活采用。 |
基于定时器捕获测量脉宽的应用示例
狂欢三】STM32C031使用TIM定时器DMA方式实现WS2812彩灯输出(三)
【狂欢三】STM32C031使用TIM定时器DMA方式实现PWM输出(二)
【狂欢三】STM32C031使用TIM定时器PWM输出
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
定时器剩余通道是否可以做PWM输出呢?
基于STM32双定时器+ADC+DMA实战经验分享
基于STM32的定时器触发ADC时可能遇到的情形
【NUCLEO-U545RE-Q评测】5. 基本计时器
基于STM32的定时器不按设定超时产生中断