打印
[信息]

【实战经验】STM32通用定时器示例详解 —OnePulse

[复制链接]
8297|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 香水城 于 2017-8-16 11:45 编辑

STM32通用定时器 示例详解 —OnePulse

前言
基于学习的目的,详细讲解关于标准外设库中的定时器的17个示例项目函数文件。本次介绍OnePulse。

一、示例详解
基于硬件平台:STM32F100B-EVAL,MCU的型号是STM32F100VBT6。
软件则是其标准外设库。
单脉冲模式(OPM)允许计数器在受到一个激励时启动,在一个可编程的延时后产生一个宽度可编程的脉冲。

1、One Pulse的寄存器配置
软件配置,运行程序可以发现,系统时钟设置为24MHz,定时器使用到的是TIM4;

根据时钟树的图谱及其程序, 该示例选择的是内部时钟源作为定时器的时钟源;TIM4的时钟源来自APB1的分频。



AHB 时钟 (HCLK)在RCC_CFGR寄存器中的分频系数HPRE的值为0,即SYSCLK not divided,即/1,所以HCLK就是24MHz;
APB1的prescaler的系数是PPRE1:0x0,HCLK not divided,即/1,APB1CLK为24MHz;由于APB1的prescaler系数部分频,即/1,所以倍频器不起作用,即为上图中的TIMxCLK = 24Mhz。
二、示例演练

综合上述,本案例中,Timer的时钟源选择的是Internal clock,CK_PSC的时钟频率其实就是时钟树图中的输出TIMxCLK,然后TIMxCLK或CK_PSC经过预分频器,才是最终用于计数的时钟基本单位(clock input,输入时钟)。
另外,

设置PrescalerValue = 0和ClockDivision = 0,不分频,即TIMxCLK = 24Mhz,即TIM1 counter clock at 24 MHz。

OPM = 1,设置为单脉冲模式,在下一次更新事件发生时计数器将停止计数(清零CEN位)。
对于OPM这一位,默认值是0,即更新事件发生时计数器不被停止。所以如果成OPM=0,则相应的波形如下图所示:

即受到外部触发信号的上升沿后,产生的不是一个脉冲,而是多个脉冲,即PWM的波形。从另一方面来说,如果OPM=0,外部的触发信号也就在第一次上升沿的时候用于触发其他通道输出。之后,由于OPM=0,即计数器不停止,则会一直输出PWM波形。
我们接下来看其他的寄存器配置:

SMS = 0x06,从模式选择位,设置为触发模式,在触发TRGI出现上升沿时(但未被复位)计数器启动,只有计数器的启动是受控的。
TS = 0x06,触发选择,设置的是被过滤的定时器输入2(TI2FP2)。

IC2S(CC2S) = 0x01,设置的是CC2通道被配置为输入,IC2映射到TI2上;
CC2P = 0x00,设置的是0,表示无反转,IC2上出现上升沿时发生捕获。
所以结合下图,最终的结果是,选择的TIM4_CH2作为触发输入,其上升沿发生捕获,用于启动TIM4。TIM4_CH2的引脚对应的是PB7。
在程序中,配置的单脉冲模式,TIM4_CH1用于输出,对于其的初始化如下图的代码,这儿并没有类似的 TIM_OCInitStructure.TIM_Channel = TIM_Channel_1;的语句,相应的TIM_OC1Init,这个函数名就是相应的初始化channel_1,如果TIM_OC2Init则是初始化channel_2。


下图的波形时运行源程序,OPM=1的情况下的波形,因为OPM = 1, 在下一次更新事件发生时计数器将停止计数(清零CEN位)。所以只会看到一个脉冲。

上面黄色的线表示PB6,TIM4_CH1; 红色的是PB7,TIM4_CH2;
测量后发现,黄色的脉宽宽度是2.1ms,符合描述。


对于单脉冲,也可以同时触发几路的输出:
原因如下图:

在一般的单脉冲模式中,设置的是,TIMx_SMCR寄存器中的SMS从模式选择位,其中的触发模式,是在触发TRGI出现上升沿时(但未被复位)计数器启动,只有计数器的启动是受控制的。注意这里控制的是计数器的启动,所以从一点上说明了可以同时输出几路波形的可能性。
另一面,从上图的框架中可以看出, 作为定时器通道本身的触发输入,可能的只有两个:TI1FP1和TI2FP2,即TIMx_CH1和TIMx_CH2作为触发输入源的选择。就是输入。
对于输出,按照上面的框图,由于选择了TI1FP1或TI2FP2,接下来走的路径是:Reset,Enable,up\down,Count---->CK_PSC,开始捕捉CNT,从CNT框框中往下的箭头,对于TIMx_CH1, TIMx_CH2, TIMx_CH3, TIMx_CH4,是并行的,也就是可以同时输出几路的波形。
理论上是可以的,那么实际呢,只要在初始化一路通道,波形测试如下,也是可以的。





对应PDF:STM32F1通用定时器示例详解_OnePulse
更多实战经验请看:【ST MCU实战经验汇总贴】





沙发
mmuuss586| | 2016-1-8 13:53 | 只看该作者

不错,单脉冲输出;

使用特权

评论回复
板凳
643757107| | 2016-1-8 18:26 | 只看该作者
Timer的时钟源选择的是Internal clock,CK_PSC的时钟频率其实就是时钟树图中的输出TIMxCLK,然后TIMxCLK或CK_PSC经过预分频器,才是最终用于计数的时钟基本单位(clock input,输入时钟)。香主研究的好深入,跟着学习学习。

使用特权

评论回复
地板
xmshao| | 2016-1-9 12:02 | 只看该作者
谢谢 香主的分享!
STM32定时器值得研究。
顶~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:STM32技术专家

596

主题

17084

帖子

284

粉丝