STM32
直播中

笔画张

12年用户 1007经验值
私信 关注
[问答]

怎样去计算STM32通用定时器的时钟

STM32通用定时器的作用有哪些呢?

STM32通用定时器的工作原理是什么?

怎样去计算STM32通用定时器的时钟?

回帖(1)

李欣海

2021-11-24 10:24:07
  STM32-通用定时器学习笔记
  一、通用定时器学习
  stm32f103ze定时器(16位)分类高级定时器:TIN1,TIM8通用定时器:TIM2-TIM5基本定时器:TIM6-7
  
  通用定时器的功能和特点自动装载计数器:比如16的定时器是可以从0计数到65535(向上计数),但是我设置一个一个值,当计数器计到我设定的值得时候,计数器的当前值就会变成0。预分频器:将定时器的时钟来源进行分频,这样时钟的周期就会变大,我们计数相同的数那么所用的时间就会变长。每个定时器都有四个独立的通道,通道的作用有如下:
  输入捕获
  输出比较
  PWM生成
  单脉冲输出
  通过外部信号(TIMx_ETR) 控制定时器和定时器互连(用一个定时器控制另一个定时器)
  关于中断以及DMA的请求:
  
  关于定时器的工作原理:
  定时器的工作原理可以分为四个部分:
  1,时钟部分2.时基单元3.输入捕获4.输出比较
  
  时钟来源:
  内部时钟(APB1)倍频
  外部引脚(ETR):ETR引脚可以从数据手册中找到,用于TIM2-4
  内部触发(来源于内部其他的定时器):ITR 定时器的通道
  但是用的最多的时钟是内部时钟:即APB1倍频
  时基单元:
  时钟来源经过预分频用来计数(CNT)计数计到预装载值然后清零(向上计数)2. 输入捕获:在定时器的通道引脚(在数据手册上可以找到)输入脉冲,经过两个操作:1.输入滤波2.边沿检测。例如脉冲到了上升沿的时候计数器记录当前的计数值,当脉冲到了下降沿的时候再次记录计数器的当前计数值,这样上升一个计数值,下降一个计数值,就可以计算输入脉冲的占空比了。
  输出比较:
  比如我们设置向上计数,从0计数到100(预装载值),接下来,我们在捕获比较寄存器中设置一个比较值(50)那么计数过程中,计数器的当前值比设定值小的话那么输出低电平,比计数值大的时候输出高电平。
  二、定时器中断学习:
  1. 时钟的计算方法:
  正点原子程序中没有设置时钟来源,其实是使用的默认时钟来源,即APB1时钟,根据APB1的预分频系数来计算CK_INT的系统时钟是72M,在正点原子的代码里设置的APB1的预分频系数是2,所以CK_INT得乘2,但是最后的计数时钟还是要配置预分频系数的。
  
  2. 需要配置的寄存器:
  计数器当前值寄存器(CNT):(16位), 储存当前值。预分频寄存器(PSC):Fck_psc/(PSC[15:0]+1)括号里的值就是上图中的N。自动重装载寄存器(arr):控制寄存器(cr1):位4和位0:配置计数模式和使能计数器中断使能寄存器(dier):
  
  溢出时间:
  
  三、PWM学习:
  工作原理:
  设置一个比较值,用计数器的当前值和这个比较值相比,然后根据他们的关系输出周期性的高低电平
  
  
  
  这里有一个部分重映射和完全重映射的一个概念: 部分重映射就是指例如上图只有TIM3的通道1和通道2由原来的PA6和PA7重映射为PB4和PB5了。
  
  
  注:上面的AFIO是用于重映射的而不是复用。预装载的知识在这个博客中有说明:有影子寄存器的寄存器实际上对应了两个寄存器:一个是用户可以写入或读出数据的寄存器,称为preload register(预装载寄存器),另一个是用户看不见的、但在操作中真正起作用的寄存器称为shadow register(影子寄存器)。我们修改的定时器周期、预分频系数、通道的比较值等都是修改的表面那个预装载寄存器,要让这个修改起作用,就还要把预装载寄存器的值赋给影子寄存器才行。
  从ARR预装载寄存器传送到影子寄存器,有两种方式,一种是立刻更新,一种是等触发事件之后更新;这两种方式主要取决于寄存器TIMx-》CR1中的“APRE”位:APRE=0,当ARR值被修改时,同时马上更新影子寄存器的值; APRE=1,当ARR值被修改时,必须在下一次事件UEV发生后才能更新影子寄存器的值。
  
举报

更多回帖

发帖
×
20
完善资料,
赚取积分