zoukankan      html  css  js  c++  java
  • Stm32高级定时器(一)

    Stm32高级定时器(一)

    1 定时器的用途

    2 高级定时器框图

    3 时基单元

    4 通道

    1 定时器的用途

    • 已知一个波形求另一个未知波形(信号长度和占空比)
    • 已知波形的信号长度和占空比产生一个相应的波形
    • 增量正交编码器驱动电机获得动态信息(速度、加速度)
    • 测量输入信号的脉冲宽度(输入捕获)
    • 产生输出波形(输出比较、PWM、嵌入死区时间的互补PWM等)
    • ……

    我们知道,当我们需要测量一段直线的长度时,我们需要一把直尺,根据直尺上的刻度读出直线的长度,定时器也相当于直尺能够测量和产生特定的波形。

    比较项

    定时器

    直尺

    最小刻度

    CNT频率

    1mm/1cm

    测量给定单元

    输入捕获(PWM捕获)

    长度测量

    产生单元

    输出比较(PWM输出)

    划线

    2 高级定时器框图

    clip_image002[7]

    定时器以时基单元位核心,输入捕获、输出比较和刹车功能等所有的功能运行都围绕时基单元的计数器进行。”驱动动力”指时基单元的驱动来源,主要分内外时钟。

    3 时基单元

    3.1 主要寄存器

    计数器寄存器(TIMx_CNT)

    预分频器寄存器(TIMx_PSC)

    自动装载寄存器(TIMx_ARR)

    重复次数寄存器(TIMx_RCR)

    clip_image003[8]

    工作流程:

       内部或外部驱动时钟CK_PSC驱动预分频器PSC计数分频,产生CK_CNT驱动计数器CNT计数。自动重装载寄存器在发生更新事件时将值传到计数器CNT中作为初始计数值,REP寄存器则控制CNT溢出次数,当重复次数计数器从REP寄存器的数值递减至0是计数器CNT停止计数。

    3.2 影子寄存器

      有阴影的寄存器,表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadow register(影子寄存器);

    3.3 计数模式

    向上计数模式:

      在向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器的内容),然后重新从0开始计数并且产生一个计数器溢出事件。

    向下计数模式:

      在向下模式中,计数器从自动装入的值(TIMx_ARR计数器的值)开始向下计数到0,然后从自动装入的值重新开始并且产生一个计数器向下溢出事件。

    中央对齐模式:

      在中央对齐模式,计数器从0开始计数到自动加载的值(TIMx_ARR寄存器)-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器下溢事件;然后再从0开始重新计数。

    3.4重复计数器功能

      如果使用了重复计数器功能,在向上计数达到设置的重复计数次数(TIMx_RCR)时,产生更新事件(UEV);否则每次计数器溢出时才产生更新事件。

    4 通道

    4.1 时钟选择

    内部时钟(CK_INT)

    clip_image005[7]

    外部时钟模式1:外部输入引脚

    clip_image007[7]

    clip_image009[7]

    要配置向上计数器在T12输入端的上升沿计数,使用下列步骤:

    1. 配置TIMx_CCMR1寄存器CC2S=01,配置通道2检测TI2输入的上升沿。

    2. 配置TIMx_CCMR1 寄存器的 IC2F[3:0],选择输入滤波器带宽(如果不需要滤波器,保持 IC2F=0000)

    3. 配置TIMx_CCER寄存器的CC2P=0,选定上升沿极性

    4. 配置TIMx_SMCR寄存器的SMS=111,选择定时器外部时钟模式1

    5. 配置TIMx_SMCR寄存器中的TS=110,选定TI2作为触发输入源

    6. 设置TIMx_CR1寄存器的CEN=1,启动计数器

    ● 外部时钟模式2:外部触发输入ETR

    clip_image011[7]

    clip_image013[7]

    选定此模式的方法为:令TIMx_SMCR寄存器中的ECE=1

    计数器能够在外部触发ETR的每一个上升沿或下降沿计数。

    要配置在ETR下每2个上升沿计数一次的向上计数步骤:

    1. 本例中不需要滤波器,置TIMx_SMCR寄存器中的ETF[3:0]=0000

    2. 设置预分频器,置TIMx_SMCR寄存器中的ETPS[1:0]=01

    3. 选择ETR的上升沿检测,置TIMx_SMCR寄存器中的ETP=0

    4. 开启外部时钟模式2,写TIMx_SMCR寄存器中的ECE=1

    5. 启动计数器,写TIMx_CR1寄存器中的CEN=1

    注:设置ECE位与选择外部时钟模式1并将TRGI连到ETRF ( SMS=111和TS=111 ) 具有相同功效。

    ● 内部触发输入(ITRx)

    clip_image015[7]

    4.2 输入捕获通道

    clip_image017[7]

    clip_image019[7]

    当触发捕获时,计数器CNT的值传到捕获寄存器中。

    配置在TI1输入的上升沿时捕获计数器的值到TIMx_CCR1寄存器中:

    选择有效输入端:TIMx_CCR1必须连接到TI1输入,所以写入TIMx_CCR1寄存器中的CC1S=01,一旦CC1S不为00时,通道被配置为输入,并且TIMx_CCR1寄存器变为只读。

    根据输入信号的特点,配置输入滤波器为所需的带宽(即输入为TIx时,输入滤波器控制位是 TIMx_CCMRx寄存器中的ICxF位)。假设输入信号在最多5个时钟周期的时间内抖动,我们须配置滤波器的带宽长于5个时钟周期;因此我们可以(以fDTS频率)连续采样8次,以确认在TI1上一次真实的边沿变换,即在TIMx_CCMR1寄存器中写入IC1F=0011。

    选择TI1通道的有效转换边沿,在TIMx_CCER寄存器中写入CC1P=0(上升沿)。

    配置输入预分频器。在本例中,我们希望捕获发生在每一个有效的电平转换时刻,因此预分频器被禁止(写TIMx_CCMR1寄存器的IC1PS=00)。

    设置TIMx_CCER寄存器的CC1E=1,允许捕获计数器的值到捕获寄存器中。

    如果需要,通过设置TIMx_DIER寄存器中的CC1IE位允许相关中断请求,通过设置TIMx_DIER寄存器中的CC1DE位允许DMA请求。

    4.3 输出比较通道

    clip_image021[7]

    clip_image023[7]

    4.4 刹车通道

    clip_image025[7]

  • 相关阅读:
    源码分析清楚 AbstractQueuedSynchronizer
    Java 并发队列 BlockingQueue
    ReentrantLock以及AQS实现原理
    Java并发之Condition
    Java线程的6种状态及切换
    同步工具类
    Java 并发实践 — ConcurrentHashMap 与 CAS
    Java7/8 中的 HashMap 和 ConcurrentHashMap
    java HashMap、HashTable、ConcurrentHashMap区别
    Mysql的复制原理以及流程
  • 原文地址:https://www.cnblogs.com/OneFri/p/5924918.html
Copyright © 2011-2022 走看看