STM32F1定时器学习笔记(标准库)

1.定时器分类:基本定时器(TIM6/TIM7)、通用定时器(TIM2/3/4/5)、高级定时器(TIM1/8)

2.基本定时器知识点:

        框图:

        信号流向(绿色线):基本定时器时钟源只能来自内部时钟(CK_INT,CK_INT来自APB1总线分频后提供,APB1预分频系数为1,频率为36M,否则为72M),时钟频率来到预分频器分频(1-65536),最终流到计数器的频率为CK_CNT=CK_INT/(PSC+1),当CNT计数器的值和自动重装载寄存器值相等时会产生溢出中断,产生一次中断时间为(1/CK_CNT) *ARR。举例:时钟72M,现在需要定时1ms时间,那么就设置PSC=71,ARR=1000,因为计数器CNT频率为72/71+1=1M,计一个数就是1/1000000秒,计一千个数是(1/1000000)*1000=0.001秒,换算毫秒就是1ms(类似于一个可以装1000滴水的容器,如果我每1ms往里滴一滴水,那1s就装满,1us滴一滴水,那就是1ms装满)

        基本定时器初始化结构体为:TIM_TimeBaseInitTypeDef,其中结构体成员TIM_Prescaler为预分频器、TIM_Period为定时器周期、只需要设置此两项即可,结构体其他成员不用设置(TIM_CounterMode为计数模式---基本定时器默认只有向上,不设置此项、TIM_ClockDivision时钟分频---基本定时器没有、TIM_RepetitionCounter为重复计算器---基本定时器没有)。

 基本定时器初始化步骤:

        1.开启基本定时器时钟--RCC_APB1PeriphClockCmd;

        2.实例化结构体--TIM_TimeBaseInitTypeDef;

        3.设置预分频器TIM_Prescaler和自动重装载值TIM_Period;

        4.将以上设置写入寄存器--TIM_TimeBaseInit;

        5.清除计数器中断标志位TIM_ClearFlag;

        6.开启计数器中断TIM_ITConfig;

        7.使能计数器--TIM_Cmd;

        8.最后就是NVIC的配置了。注意:基本定时器只有更新中断TIM_IT_Update,没有TIM_IT_CC1、TIM_IT_Trigger这些。

3.高级定时器知识点:

 3.1高级定时器时钟来源

基本定时器时钟源只能来自内部时钟CK_INT,高级定时器因为增加了外部引脚,只是时钟来源多了一个外部时钟来源,其它并无特别区别。

        3.1.1 内部时钟源CK_INT(上图序号1的红框):根据名字知道时钟源来自芯片内部,设置TIMx_SMCR寄存器的SMS位等于000.

        3.1.2 外部触发输入ETR(上图序号2的绿框):时钟信号来自外部特定输入通道TIMx_ETR,只有一个。

        3.1.3 内部触发输入(上图序号3橙色框):使用一个定时器作为另一个定时器的预分频器。

        3.1.4 外部输入引脚TIx(上图序号4蓝色框):根据名字理解,时钟来自于外部的引脚,时钟信号来自于左边TIMx_CHx通道,设置TIM_CCMR1寄存器的CCxS[1:0]位选择TI1或TI2通道,设置TIM_CCMR2寄存器的CCxS[1:0]位选择TI3或TI4通道。如下图,定时器5的通道1/2/3/4(TIM5为通用定时器,通用定时器和高级定时器几乎一样,只是部分功能区别),分别对应引脚PA0 PA1 PA2 PA3,比如要用定时器5的通道3,只需要配置CCMR2寄存器的CC3S[1:0]为01即可。

疑问1:既然有了外部输入引脚TIx,为什么还要做一个外部触发输入引脚ETR呢,都是来自于外部输入,是不是重复呢?下图为TIx和ETR控制电路,各位自行研究,有了解伙伴告知下,后续更新说明具体区别和应用差异。

3.2 输入捕获

输入捕获用于对输入信号的上升、下降或双边沿进行捕获。常用于测量输入信号脉宽、测量PWM输入信号的频率和占空比

下图红框分别为输入通道(输入信号的通道)和捕获通道(捕获输入信号的通道),下图信号由绿色线TI2进入,由TI2FP1和T12FP2出来,可以进行PWM输入捕获,如果只有1路输出,那么就用于测量输入信号脉宽。

3.3输出比较

输出比较就是比较下图2个绿色框中寄存器的值(CCR和CNT),产生一个参考信号OC1REF。当CCR>CNT或CCR<=CNT时,OC1REF=1有效电平,OC1REF=0无效电平,并且产生比较中断CC1I,标志位CCxIF(SR寄存器)置位。(这里以通用定时器框图,便于查看,高级定时器只是多了死区生成和刹车功能)

下图为上图红框部分放大图,见下图绿框部分,oc1ref可以去往主模式控制器TRGO去,常用是下面极性选择寄存器,给寄存器写0,信号走红色路,信号不变化;给寄存器写1,信号走绿色线路,信号极性翻转,这么做是为了输出更加灵活,比如输出模式控制器可以选择PWM模式1,如果想oc1re输出相反极性,可以设置为PWM模式2,如果不想改变输出模式,那么可以将下图CC1P设置选择下面绿色线那一路,就可以改变最终输出极性,对应TIM_OCInitTypeDef结构体中的成员TIM_OCPolarity,该成员可以设置TIM_OCPolarity_High和TIM_OCPolarity_Low。

输出使能电路决定信号要不要输出

输出模式控制器(上图蓝色框)有8种模式,可以通过这8种模式来更加灵活的控制输出的oc1ref信号(TIMx_CCMR1寄存器的OC1M[2:0]控制)

计算公式:

PWM频率:f = CK_PSC / (PSC+1) / (ARR+1)

PWM占空比:D = CCR / (ARR+1)

PWM分辨率:R = 1 / (ARR+1)

如要产生一个频率为1khz,占空比50%,分辨率1%的pwm波,先计算分辨率1% = 1/(ARR+1),可计算出ARR = 99;占空比50% = CCR / 99 + 1,算出CCR=50;最后算出PSC即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值