前言:

1.本博文基于STM32F103ZET6芯片和ST官方提供的3.5.0库函数;
2.学习过51单片机学习STM32定时器会容易理解一些,但是两个定时器的实力有很大的距离;
3.定时器是难点也是重点;本博文以通用定时器TIM2~TIM5来说明;例程是TIM3
6.定时器结构稍复杂,寄存器较多,本博文根据一个简单的定时器中断实验展开,所列出的相关寄存器是专门针对本次实验来说的,其他不相关定时器不再列出;

一 STM32定时器的分类

1.高级定时器: TIM1和TIM8
2.通用定时器: TIM2,3,4,5;
3.基本定时器: TIM6和TIM7;

二 通用定时器的功能

(1)16位向上,向下,向上/向下自动装载寄存器(TIMx_CNT)(向上/向下模式也就是中间对齐模式)
(2)16位可编程逻辑预分频器(TIMx_PSC),计数器时钟频率的分频系数为1~65535之间的任意值;
(3)4个独立通道(TIMx_CH1~4),这些通道可以用来作为:
① 输入捕获 比如:测量输入信号的脉冲宽度
② 输出比较
③ PWM生成(边缘或中间对齐模式)
④ 单脉冲模式输出
(4)可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用1个定时器控制另一个定时器)的同步电路
(5)如果以下事件发生时产生中断/DMA:
A.更新:计数器向上或向下溢出,计数器初始化(通过软件或内部/外部触发)
B.触发事件(计数器启动,停止,初始化或者内部/外部触发计数)
C.输入捕获
D.输出比较
E.支持针对定位的增量(正交)编码器和霍尔传感器电路
F.触发输入作为外部时钟或者按周期的电流管理;

三 定时器时钟系统以及时钟源

因为时钟是计算定时器周期的关键因素,所以时钟源的大小和属性必须要熟悉;
(1) 首先看相对应的时钟图

需知1
基于3.5.0库开发的基础上,程序在运行到main函数之前会调用SystemInit()函数,此函数会配置STM32时钟系统作为初始化,初始化的结果就是:
SYSCLK 72MHz
AHB 72MHz
PLCK1 36MHz
PLCK2 72MHz
PLL 72MHz
APB1 36MHz
需知2:
三种定时器的时钟源(下表中的时钟是基于库函数的配置的)

定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。
下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。
假定AHB=36MHz,因为APB1允许的最大频率为36MHz,所以APB1的预分频系数可以取任意数值;当预分频系数=1时,APB1=36MHz,TIM2到5的时钟频率=36MHz(倍频器不起作用);当预分频系数=2时,APB1=18MHz,在倍频器的作用下,TIM2~7的时钟频率=36MHz。
有人会问,既然需要TIM2到7的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?答案是:APB1不但要为TIM2到7提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7仍能得到较高的时钟频率。
再举个例子:当AHB=72MHz时,APB1的预分频系数必须大于2,因为APB1的最大频率只能为36MHz。如果APB1的预分频系数=2,则因为这个倍频器,TIM2~7仍然能够得到72MHz的时钟频率。能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。

需知3: 定时器的时钟源有4个
(1)内部时钟(CK_INT)
本实验采用CK_INT,CK_INT的来源如下图

(2)外部时钟模式1:外部输入引脚(TIx)
(3)外部时钟模式2:外部触发输入(ETR)
(4)内部触发输入(ITRx):使用定时器A作为定时器B的预分频器(A为B提供时钟源);

时钟源的选择取决于从模式控制寄存器TIMx_SMCR;

四 涉及到的相关寄存器
(1)控制寄存器1 TIMx_CR1



符号解释:Tdts 采样频率基准 ; Tck_int 定时器输入频率;
时钟分频因子:这个在介绍定时器输入捕获的时候会经常用到;这里先简单介绍,后来再详细介绍:
对于定时器时钟分频因子需要控制寄存器1TIMx_CR1的CKD[1:0]位和从模式寄存器TIMx_SMCR的ETF[3:0]位的配合;
栗子:当Fck_int = 72MHz时,选择Fdts = Fck_int/2 = 36MHz,采样频率Fsampling = Fdts/2 = 18MHz且N=6,则频率高于3MHz的信号将会被滤波器滤除,有效的屏蔽于高于3MHz的干扰;
(2)计数器 TIMx_CNT

(3)预分频器 TIMx_PSC

[15:0]:预分频的值可以在1~65536范围内任意选取;这个值就决定将定时器的输入时钟源频率(比如72MHz)分频为多少;
(4)自动重载寄存器TIMx_ARR

在物理层面上,ARR有两个,分别是程序员可以操作的ARR寄存器影子寄存器(不能被直接操作的寄存器);实际上真正起作用的是影子寄存器;在TIMx_CR1寄存器中的ARPE = 1时(TIMx_ARR寄存器被装入缓冲器),在每次更新事件发生的时候,ARR内的值将会被装载到影子寄存器;
(5)中断/DMA中断使能寄存器 TIMx_DIER



[0]:即UIE位为更新中断允许位,控制所有更新中断的产生;
(6)状态寄存器 TIMx_SR


(5)事件产生寄存器TIMx_EGR



这里暂时只看[0]位;
[0]:如果置1将产生更新事件;

这里强调一个很重要的概念,加深一下对更新的理解:
(1)什么是更新?
顾名思义就是一个东西不再继续而回到了原点,比如定时器溢出(这里比如说是上溢出),就是一个更新事件,这件事情一旦发生,就会使得定时器清零,然后继续递增数值,直到下次溢出,然后往复循环;
(2)更新后会造成一些什么?
〇所有的寄存器都将被更新;
Ⅰ预分频器的计数器清零被清零(但是分频系数不变);
Ⅱ如果使能TIMx_DIER寄存器的第[0]位,则会产生产生更新中断,进入中断函数;
Ⅲ硬件同时(依据URS位)设置更新标志位(TIMx_SR寄存器中的UIF)
Ⅳ重复计数器被重新加载为TIMx_RCR寄存器的值(TIMx_ARR)
(3)产生更新时间的方式
Ⅰ计数器上溢/下溢;
Ⅱ设置UG位;

五 中断周期的计算

T_out = (arr+1)(psc+1)/CK_INT;
T_out:中断产生周期;
arr:自动重装载的值;
psc:预分频寄存器的值;
CK_INT:内部时钟频率;

六 编程步骤

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
//第一步:开启要使用的定时器的使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//初始化定时器:配置定时器的时基单元(TIMx_CNT,TIMx_PSC,TIMx_ARR),计数模式,和分频系数;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;      //设置TIMx_CR1寄存器的[9:8]位;这里设置成1分频,即不分频;定时器3的时钟频率等于APB1后的倍频来的值(这里是72MHz)TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;  //设置TIMx_CR1寄存器的[6:5]位;这里设置为上升模式;
TIM_TimeBaseInitStructure.TIM_Period = 4999;   //设置TIMx_ARR寄存器;也就是定时器溢出周期;
TIM_TimeBaseInitStructure.TIM_Prescaler = 7199;    //设置TIMx_PSC寄存器;定时器的预分频值;(1~65536)//这里计算一下:溢出周期T = (4999+1)*(7199+1)/72000000 = 0.5s;级每0.5s溢出一次;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);    //普通定时器初始化;                          //第三步:开启定时器中断
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);    //配置TIMx_DIER寄存器的[0]位,使能定时器的更新中断;//第四步:开启定时器;
TIM_Cmd(TIM3,ENABLE);       //开启定时器//第五步:相应中断函数
void TIM3_IRQHandler(void)
{if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)            //检测TIMx_SR寄存器[0]位是否被置位(也即是更新中断是否发生){//逻辑代码;}TIM_ClearITPendingBit(TIM3,TIM_IT_Update);               //清除TIMx_SR寄存器[0]位;
}

STM32处理器定时器分析(实现一个定时中断)相关推荐

  1. STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)

    本篇文章包含的内容 一.TIM 定时器 1.1 TIM 定时器简介 1.2 TIM 定时器类型及其工作原理简介 1.2.1 基本定时器工作原理及其结构 1.2.2 通用定时器工作原理及其结构 1.2. ...

  2. STM32F7普通定时器的使用(定时+中断+PWM)

    此篇博客记录的是自己通过CubeMX学习F7系列定时器功能的过程,献给有过标准库开发经验的同学. 基本计时功能 最简单的,定时器嘛,基本的定时器就是定时功能,简单来说就是TIMx->CNT会跟随 ...

  3. STM32开启定时器就立即进Update中断问题探索

    问题描述:意外发现定时器再刚使能后立即就进了中断,且是Update中断,比较奇怪,难道Update中断不是定时器计数溢出后才触发吗?因此写下此文章记录相关情况. 测试平台: STM32F103VET6 ...

  4. STM32 TIM定时中断

    总体介绍 TIM(Timer)定时器是STM32中功能最强大,结构最复杂的一个外设,以下对其做一下简介(以stm32为例): TIM可以对输入的时钟进行计数,并在数值达到设定值时触发中断. 在STM3 ...

  5. STM32的定时器详解(嵌入式学习)

    STM32的定时器详解 0. 前言 1. Systick定时器 概念 工作原理 时钟基准 Systick练习 2. HAL_Delay函数分析 3. 定时器 基本概念 定时器分类 定时器组成 计数器 ...

  6. STM32时钟系统和TIMER配置(溢出中断/PWM)实例

    目录: 1. STM32时钟系统 2. STM32的定时器典型配置之溢出中断 3. STM32的定时器典型配置之PWM输出 1. STM32时钟系统 (1)Clock tree 可以在官方手册(Stm ...

  7. STM32用一个定时器封装多个定时函数调用

    STM32用一个定时器封装多个定时函数调用 用一个定时器开一个1ms的中断: 头文件宏定义如下: #define BASIC_TIM TIM6 #define BASIC_TIM_APBxClock_ ...

  8. STM32入门笔记04_TIM定时器+案例:TIM定时器定时中断、定时器外部时钟

    TIM定时器 TIM简介 TIM(Timer) 定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 16位计数器.预分频器.自动重装寄存器的时基单元,在72MHz(系统主频)计数时 ...

  9. stm32定时器定时中断

    主频72MHz:最大计时59.65s 基本定时器: 基准时钟 预分频器 计数器 计数器与自动重装载寄存器进行比较 相等时计时时间到 进行中断相应 主模式触发DAC 硬件自动化 通用定时器: 计数模式不 ...

最新文章

  1. VS2005中ajax安装指南[转]
  2. taglib遍历foreach循环list集合
  3. jQuery-helloWorld
  4. VUE.js 中取得后台原生HTML字符串 原样显示问题
  5. [html] 怎样在<pre>标签内不转义<和>符号(原样输出html标签)?
  6. QT高级编程之QT基本概览
  7. c/c++教程 - 2.4.3 this指针作用,链式编程思想,空指针访问成员函数,const修饰成员函数,常函数,常对象
  8. 《长安十二时辰》利用大数据破案?
  9. 你必须具有权限才能读取此对象_为啥手机APP要获取权限?这些权限不能随便同意...
  10. 作用域和请求参数传递
  11. winform通过WebClient调用api接口
  12. 下载和安装Visual C ++ 2008 Express Edition的说明
  13. OKR目标管理专题及模板大全
  14. bat 批处理查看局域网闲置ip(ping或Arp列表结合)
  15. android冷启动优化方案汇总
  16. 批处理文件(bat)装逼 之全彩滚动我爱你 绘制五彩爱心 绘制3D球体
  17. cork--快速,精确的线性布尔运算
  18. html 刷新表格数据,当我刷新页面时在html表格上重复数据
  19. win10+centos7 双系统安装
  20. python工控开发框架_GitHub - hzglitter/isf: ISF(Industrial Security Framework),基于Python的工控漏洞利用框架...

热门文章

  1. 论人性文明与人工智能发展(一)
  2. 一加手机救砖资源-sahara通信失败 或者 checkHwid failed都是由于使用错了救砖包
  3. 〈原创〉诗如文学之筋骨,琴乃乐中之天籁
  4. 大道至简之一:如何准确把握趋势
  5. 非常精美的唐诗,无与伦比哦遥知兄弟登高处,遍插茱萸少一人。秦时明月汉时关,万里长征人未还。但使龙城飞将在,不教胡马度阴山。春眠不觉晓,处处闻啼鸟。夜来风雨声,花落知多少。君自故乡来,应知故乡事。来日绮
  6. JavaScript基础学习——第五天(原型、垃圾回收、数组简介)
  7. 查找badiexit
  8. 全球与中国1-苄基吡啶嗡-3-羧酸盐市场深度研究分析报告
  9. 成都的IT研发产业和芯片产业等情况:2006年初的数据。(转)
  10. 物联网设备网关系统架构设计