(stm32f103学习总结)—stm32定时器中断
一、定时器介绍
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 通用定时器结构框图


二、通用定时器配置步骤
(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定时器中断的更多相关文章
- stm32定时器中断类型分析
一直在用的stm32定时器的中断都是TIM_IT_Update更新中断,也没问为什么,直到碰到有人使用TIM_IT_CC1中断,才想到这定时器的中断类型究竟有什么区别,都怪当时学习stm32的时候不够 ...
- 用STM32定时器中断产生PWM控制步进电机
控制步进电机可以使用PWM.定时器中断.延时,这里用的就是定时器中断来让它转动. 一.硬件部分1.使用的硬件板子用的是正点原子的STM32F103 mini板,驱动器是DM420(DM420驱动器资料 ...
- STM32学习笔记——定时器中断(向原子哥学习)
定时器中断 STM32 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和TIME7 等基本定时器.在本章中,我们将利 ...
- stm32定时器学习二——PWM设置
/* STM32 嵌入式学习入门(5)——PWM的实现 上一篇博文介绍了定时器和PWM的基本的原理,本篇博文从代码层面来介绍PWM的具体实现.同样,还是以博主所用的开发板——正点原子开发板STM32F ...
- STM32定时器学习---基本定时器
STM32F1系列的产品,除了互联网产品外,工作8个,3种定时器,其中一种就是基本定时器.那么STM32单片机的基本定时器如何操作以及编程呢? 下面我们就来详细的了解一下 STM32F1系列的产品,除 ...
- stm32通用定时器中断问题
在使用stm32的通用定时器定时中断的时候,发现定时器在完成初始化配置后,定时器UIF位会立刻置位,导致在使能中断后,程序会立刻进入定时器中断. 如果设计代码时不希望定时器配置完成后,立刻进入中断,可 ...
- 嵌入式02 STM32 实验10 定时器中断
优秀文章 https://blog.csdn.net/qq_38351824/article/details/82619734 一.STM32通用定时器(TIM2.TIM3.TIM4和TIM5共四个通 ...
- (stm32f103学习总结)—stm32 PMW输出实验
一.PWM简介 PWM是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调 制,简称脉宽调制.它是利用微处理器的数字输出来对模拟电路进行控 制的一种非常有效的技术,其控制简 ...
- Arduino101学习笔记(十二)—— 101定时器中断
一.API 1.开定时器中断 //*********************************************************************************** ...
随机推荐
- 发送POST请求(HTTP),K-V形式
/** * 发送POST请求(HTTP),K-V形式 * @param url * @param params * @author Charlie.chen ...
- c语言——uthash使用
参考:https://troydhanson.github.io/uthash/userguide.html https://blog.csdn.net/lovemust/article/detail ...
- Spring Cloud Gateway actuator组建对外暴露RCE问题漏洞分析
Spring Cloud gateway是什么? Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关.网关作为流量的,在微服务系统中有着非常作 ...
- VS Code调试C代码
1.前言 首先说明的是vscode是代码编辑器,并不是编译器,它本身并不能编译C语言. 在这里我们使用的是MinGW-w64作为C语言的编译器.MinGW-w64的前身是MinGW的全称是:Minim ...
- [BOI2019][第K大问题][暴力剪枝]D2T1 Olympiads
目录 题意 输入格式 输出格式 样例 Input Output 数据范围 时间限制 思路 代码 题意 有\(N\)个人,现在你要从中选出\(K\)个人出来,然后让这\(K\)个人一起参加\(K\)场比 ...
- Linux-系统启动与MBR扇区修复
目录 1.系统启动过程 1.1 MBR扇区 1.2 MBR扇区的备份与还原 1.3 修复MBR 1.3.1 dd备份MBR信息 1.3.2 光驱启动修复 1.4 grub引导代码修复 1.系统启动过程 ...
- 给定class对象返回该类的实例
今天分享给大家一个实用的开发技巧, 创建一个返回值为泛型的对象构建函数, 要求是传入返回值类的 class 对象. 例如: 平时我们开发接口的时候发现很多响应类里面基本都会有`code`和`error ...
- 大作业:开发一个精美的 Web 网站
大作业:开发一个精美的 Web 网站 实验目的: 掌握一个完整精美网页开发的基本方法 实验要求: 1.开发一个 Web 站点,至少有 3 个以上的页面: 2.采用 CSS 和 HTML 文件分开方法: ...
- LGP7890题解
前置芝士的光速幂技巧. 本题解不是正解,和正解唯一的差别在于对幂的处理. 我们能够发现有: \[F(n,m,k)=\frac 1 n \binom {n+m-1} m \] 证明见这里. 然后我们开始 ...
- 线程的sleep()方法和yield()方法有什么区别?
sleep()方法和yield()方法的区别: sleep()方法给其他线程运行机会时,不考虑线程的优先级,因此会给低优先级的线程运行机会:yield()方法只会给相同优先级或更高优先级的线程运行机会 ...