Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4875336
  • 博文数量: 409
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 8261
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-23 19:15
个人简介

qq:78080458 学习交流群:150633458

文章分类

全部博文(409)

文章存档

2019年(127)

2018年(130)

2016年(20)

2015年(60)

2014年(41)

2013年(31)

分类: 嵌入式

2016-07-07 11:06:37

●通用定时器(TM2~TM5)

    通用定时器由芯片来管理,可以实现向上计数、向下计数、或者上下同时计数。而且这些定时器还有其他功能:输入捕捉、输出比较、PWM、单脉冲。



●从手册到流程

    定时器的主要模块由一个16/32位计数器及其相关的自动重装寄存器组成。此计数器可以采用递增、递减、递增/递减方式计数,时钟可以通过预分频器进行分频。计数器、预分频器、自动重载寄存器可以通过软件方式读写,即使在计数器运行时也可以进行读写操作。

    定时器基于某一个时钟开始计数,一旦产生溢出就是使对应的标志位置1,我们可以不断的扫描这个标志位来判断计数有没有完成。如果打开了中断功能,那么在溢出的时候还会是中断标志位置1。


1、影子寄存器:在很多芯片中都会有影子寄存器,其实就是一个缓冲寄存器

1)关闭缓冲功能

寄存器内容直接写入缓冲寄存器,这样的方式是所有的内容按照代码执行的顺序逐个传入各自的影子寄存器。这种方式的数据更新是按照代码的先后顺序执行的

2)开启缓冲功能

按照代码的顺序逐个给寄存器赋值,最后通过一个开关,所有的内容同时传入各自的影子寄存器。这样会保证数据同时更新


2、预分频器

    可以对定时器的时钟进行分频,此寄存器有缓冲功能。下面给出开启预分频器缓冲功能后的时序图。可以看到更改预分频器的数值不会立即影响计数时间,而是在某个时刻缓冲器发生了变化,从而影响到计数时间

 这里的事件就是中断   


3、计数模式

1)递增计数

计数器从0增长到自动重载值,然后产生溢出事件(如果开启中断,这里就会产生中断),并且重新从0开始计数。下面给出一个自动重载值为0x36时的时序图

注意:此时一次完整的计数是0x36+1次


2)递减计数

计数器从自动重载值递减到0,然后产生溢出事件(如果开启中断,这里就会产生中断),并且重新从自动重载值开始计数。下面给出一个自动重载值为0x36时的时序图

注意:此时一次完整的计数是0x36+1次


3)递增/递减计数(中心对齐模式)

计数器从0增长到自动重载值-1,产生溢出事件;然后从自动重载值向下计数到1,产生溢出事件。之后从0开始计数。

注意:此时的自动重载值是6,一次完整的计数是6*2次


4、时钟选择



5、寄存器

TIMx_CR1 控制寄存器


    设置寄存模式、自动重载值缓冲功能、计数器使能、中断使能

TIMx_SMCR模式寄存器


    选择定时器时钟源


TIMx_SR 状态寄存器


    定时器的一些标志位,可以用来判断定时是否完成


TIMx_CNT 当前计数寄存器


    当前计数值,可以读取

TIMx_PSC 预分频寄存器


    需要注意最终得到的定时时钟


TIMx_ARR 自动重载寄存器


6、定时器初始化流程

1)从RCC打开定时器时钟

2)选择时钟源

3)设置预分频系数

4)打开或关闭自动重载缓冲

5)设置自动重载值

6)设置计数模式

7)打开或关闭中断

8)配置定时器中断

9)使能定时器



●从流程到代码

1、定时器初始化



2、中断处理函数




阅读(4965) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~