一、定时器介绍

  STM32F1的定时器非常多,由2个基本定时器(TIM6、TIM7)、4个通 用定时器(TIM2-TIM5)和2个高级定时器(TIM1、TIM8)组成。基本定 时器的功能最为简单,类似于51单片机内定时器。通用定时器是在基本 定时器的基础上扩展而来,增加了输入捕获与输出比较等功能。高级定 时器又是在通用定时器基础上扩展而来,增加了可编程死区互补输出、 重复计数器、带刹车(断路)功能,这些功能主要针对工业电机控制方面

1.1 通用定时器简介

  STM32F1的通用定时器包含一个 16 位自动重载计数器(CNT),该计 数器由可编程预分频器(PSC)驱动。STM32F1的通用定时器可用于多种 用途,包括测量输入信号的脉冲宽度(输入捕获)或者生成输出波形(输出 比较和PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉 冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32F1 的每个 通用定时器都是完全独立的,没有互相共享的任何资源。

  STM32F1的通用定时器TIMx (TIM2-TIM5 )具有如下功能:

(1)16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。

(2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535之间的任意数值。

(3)4个独立通道(TIMx_CH1-4),这些通道可以用来作为: A.输入捕获 B.输出比较 C. PWM 生成(边缘或中间对齐模式) D.单脉冲模式输出

(4)可使用外部信号(TIMx_ETR)控制定时器,且可实现多个定时器互连(可以用1个定时器控制另外一个定时器)的同步电路。

(5)发生如下事件时产生中断/DMA请求: A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) C.输入捕获 D.输出比较

(6)支持针对定位的增量(正交)编码器和霍尔传感器电路

(7)触发输入作为外部时钟或者按周期的电流管理

1.2 通用定时器结构框图

我们把通用定时器结构框图分成 5 个子模块,按照顺序依次进行简单介绍。
(1)标号 1:时钟源
通用定时器的时钟来源有 4 种可选:
A.内部时钟(CK_INT)
B.外部时钟模式 1:外部输入引脚 TIx(x=1,2,3,4)
C.外部时钟模式 2:外部触发输入 ETR
D.内部触发输入(ITRx(x=0,1,2,3))
通用定时器时钟来源这么多,具体选择哪个可以通过 TIMx_SMCR 寄存器的相关位来设置,定时器相关寄存器的介绍可以参考《STM32F10x 中文参考手册》-通用定时器-寄存器章节详细了解。这里的 CK_INT 时钟是从 APB1 倍频得来的,除非 APB1 的时钟分频数设置为 1(一般都不会是 1),否则通用定时器 TIMx的时钟是 APB1 时钟的 2 倍,当 APB1 的时钟不分频的时候,通用定时器 TIMx的时钟就等于 APB1 的时钟。这里还要注意的就是高级定时器的时钟不是来自APB1,而是来自 APB2,这个在库文件 stm32f10x_rcc.h 也可以查找到,如下:

通常我们都是将内部时钟(CK_INT)作为通用定时器的时钟来源,而且通用定时器的时钟是 APB1 时钟的 2 倍,即 APB1 的时钟分频数不为 1。所以通用定时器的时钟频率是 72MHz。
(2)标号 2:控制器
通用定时器控制器部分包括触发控制器、从模式控制器以及编码器接口。触发控制器用来针对片内外设输出触发信号,比如为其它定时器提供时钟和触发DAC/ADC 转换。从模式控制器可以控制计数器复位、启动、递增/递减、计数。编码器接口专门针对编码器计数而设计。
(3)标号 3:时基单元
  通用定时器时基单元包括 3 个寄存器,分别是计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动重载寄存器(TIMx_ARR)。高级定时器中还有一个
重复计数寄存器(TIMx_RCR),通用和基本定时器是没有的。通用定时器这三个寄存器都是 16 位有效。而高级定时器的 TIMx_RCR 寄存器是 8 位有效。
  在这个时基单元中,有个预分频器寄存器(TIMx_PSC),用于对计数器时钟频率进行分频,通过寄存器内的相应位设置,分频系数值可在 1 到 65536 之间。
由于从模式控制寄存器具有缓冲功能,因此预分频器可实现实时更改,而新的预分频比将在下一更新事件发生时被采用。
  在时基单元中,还有个计数寄存器(TIMx_CNT),通用定时器计数方式有向上计数、向下计数、向上向下计数(中心对齐计数)。下面分别来介绍下这几种计数方式:

(4)标号 4:输入捕获 
(5)输出比较

二、通用定时器配置步骤

(1)使能定时器时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟

(2)初始化定时器参数,包含自动重装值,分频系数,计数方式等

voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

typedef struct

{

  uint16_t TIM_Prescaler; //定时器预分频器

  uint16_t TIM_CounterMode; //计数模式

  uint32_t TIM_Period; //定时器周期

  uint16_t TIM_ClockDivision; //时钟分频

  uint8_t TIM_RepetitionCounter; //重复计数器

} TIM_TimeBaseInitTypeDef;

了解结构体成员功能后,就可以进行配置,例如:

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

TIM_TimeBaseInitStructure.TIM_Period=1000; //自动装载值  自己定义

TIM_TimeBaseInitStructure.TIM_Prescaler=35999; //分频系数  自己定义

TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;

TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式

TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);

定时器定时时间计算公式如下: Tout= ((per)*(psc+1))/Tclk; 1000*(35999+1)/72;

(3)设置定时器中断类型,并使能

  void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);

(4)设置定时器中断优先级,使能定时器中断通道 NVIC初始化库函数是NVIC_Init();

(5)开启定时器 void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);

(6)编写定时器中断服务函数

三、定时器中断编码

 1 /*******************************************************************************
2 * 函 数 名 : TIM4_Init
3 * 函数功能 : TIM4初始化函数
4 * 输 入 : per:重装载值
5 psc:分频系数
6 * 输 出 : 无
7 *******************************************************************************/
8 void TIM4_Init(u16 per,u16 psc)
9 {
10 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
11 NVIC_InitTypeDef NVIC_InitStructure;
12
13 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟
14
15 TIM_TimeBaseInitStructure.TIM_Period=per; //自动装载值
16 TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数
17 TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
18 TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
19 TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
20
21 TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //开启定时器中断
22 TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
23
24 NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;//定时器中断通道
25 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
26 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级
27 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
28 NVIC_Init(&NVIC_InitStructure);
29
30 TIM_Cmd(TIM4,ENABLE); //使能定时器
31 }

进入中断函数

 1 /*******************************************************************************
2 * 函 数 名 : TIM4_IRQHandler
3 * 函数功能 : TIM4中断函数
4 * 输 入 : 无
5 * 输 出 : 无
6 *******************************************************************************/
7 void TIM4_IRQHandler(void)
8 {
9 if(TIM_GetITStatus(TIM4,TIM_IT_Update))
10 {
11 //填写中断中要完成的任务
12 }
13 TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
14 }

(stm32f103学习总结)—stm32定时器中断的更多相关文章

  1. stm32定时器中断类型分析

    一直在用的stm32定时器的中断都是TIM_IT_Update更新中断,也没问为什么,直到碰到有人使用TIM_IT_CC1中断,才想到这定时器的中断类型究竟有什么区别,都怪当时学习stm32的时候不够 ...

  2. 用STM32定时器中断产生PWM控制步进电机

    控制步进电机可以使用PWM.定时器中断.延时,这里用的就是定时器中断来让它转动. 一.硬件部分1.使用的硬件板子用的是正点原子的STM32F103 mini板,驱动器是DM420(DM420驱动器资料 ...

  3. STM32学习笔记——定时器中断(向原子哥学习)

    定时器中断 STM32 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和TIME7 等基本定时器.在本章中,我们将利 ...

  4. stm32定时器学习二——PWM设置

    /* STM32 嵌入式学习入门(5)——PWM的实现 上一篇博文介绍了定时器和PWM的基本的原理,本篇博文从代码层面来介绍PWM的具体实现.同样,还是以博主所用的开发板——正点原子开发板STM32F ...

  5. STM32定时器学习---基本定时器

    STM32F1系列的产品,除了互联网产品外,工作8个,3种定时器,其中一种就是基本定时器.那么STM32单片机的基本定时器如何操作以及编程呢? 下面我们就来详细的了解一下 STM32F1系列的产品,除 ...

  6. stm32通用定时器中断问题

    在使用stm32的通用定时器定时中断的时候,发现定时器在完成初始化配置后,定时器UIF位会立刻置位,导致在使能中断后,程序会立刻进入定时器中断. 如果设计代码时不希望定时器配置完成后,立刻进入中断,可 ...

  7. 嵌入式02 STM32 实验10 定时器中断

    优秀文章 https://blog.csdn.net/qq_38351824/article/details/82619734 一.STM32通用定时器(TIM2.TIM3.TIM4和TIM5共四个通 ...

  8. (stm32f103学习总结)—stm32 PMW输出实验

    一.PWM简介 PWM是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调 制,简称脉宽调制.它是利用微处理器的数字输出来对模拟电路进行控 制的一种非常有效的技术,其控制简 ...

  9. Arduino101学习笔记(十二)—— 101定时器中断

    一.API 1.开定时器中断 //*********************************************************************************** ...

随机推荐

  1. 迷你avalonjs框架

    valon2是一款基于虚拟DOM与属性劫持的 迷你. 易用. 高性能 的 前端MVVM框架, 拥有超优秀的兼容性, 支持移动开发, 后端渲染, WEB Component式组件开发, 无需编译, 开箱 ...

  2. Maven目录结构, war目录结构

    Maven目录结构 src/main/java 存放java servlet类文件 src/main/webapp 存放jsp文件 war目录结构 Maven web项目目录结构

  3. csv/json/list/datatable导出为excel的通用模块设计

    导出excel的场景我一般都是一个List直接导出成一张sheet,用Npoi.Mapper库很方便,最近我经常是需要将接口返回的jsonarray转成一张excel表,比如从elasticsearc ...

  4. 安装Android studio 并成功运行

    之前是在idea上弄得发现有些问题就下载了Android studio教程(4条消息) Android Studio安装及环境配置教程_xuw_xy的博客-CSDN博客_androidstudio安装 ...

  5. 面试中的MySQL主从复制|手撕MySQL|对线面试官

    关注微信公众号[程序员白泽],进入白泽的知识分享星球 前言 作为<手撕MySQL>系列的第三篇文章,今天讲解使用bin log实现主从复制的功能.主从复制也是MySQL集群实现高可用.数据 ...

  6. 命令行窗口cmd:访问C盘根目录和其他盘

    1:访问C盘: cd.. 往前推一个目录 以此类推,多用几次cd..即可退回到根目录 2:访问桌面文件夹 由于cmd命令行中>号的存在我们不能直接访问其他文件,所以用cd将>删去 所以 用 ...

  7. C++ 字符串 string

    1.使用前应先包含头文件string.h,有的是cstring #include<string> 这样才能正确的cin和cout字符串. cin时,是按照空格.TAB和换行进行分割的 例如 ...

  8. (第二章第三部分)TensorFlow框架之读取二进制数据

    系列博客链接: (第二章第一部分)TensorFlow框架之文件读取流程:https://www.cnblogs.com/kongweisi/p/11050302.html (第二章第二部分)Tens ...

  9. 基于Lumisoft.NET组件,使用IMAP协议收取邮件

    在早期一直使用Lumisoft.NET组件来进行邮件的处理查找,对于邮件的处理非常方便,之前在随笔<基于Lumisoft.NET组件的POP3邮件接收和删除操作>中也介绍过基于POP3和S ...

  10. linux定时任务 - crontab定时任务

    crontab 定时任务命令 linux 系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另 外, 由于使用者 ...