STM32CubeMX教程5 TIM 定时器概述及基本定时器
1、准备材料
开发板(STM32F407G-DISC1)
ST-LINK/V2驱动
STM32CubeMX软件(Version 6.10.0)
keil µVision5 IDE(MDK-Arm)
逻辑分析仪nanoDLA
2、实验目标
使用STM32CubeMX软件配置STM32F407开发板使用基本定时器TIM6实现每500ms控制绿灯状态变化一次,基本定时器TIM7实现每1s控制红灯状态变化一次
3、定时器概述
STM32F407拥有2个基础定时器、10个通用定时器和2个高级定时器,14个定时器全部挂载在APB1和APB2时钟总线上,APB2时钟总线时钟频率最高可达84MHz,APB1时钟总线时钟频率最高可达42MHz,除TIM2和TIM5为32位外,其余定时器全部为16位,其结构框图如下图所示(注释1)
不同的定时器具有不同的特性,有些定时器的计数器长度为16位,有些则为32位;有些定时器可以递增、递减或递增/递减计数,但有些定时器只能递增计数;有些定时器可以产生DMA请求,有些则不可以;另外定时器捕获/比较通道数量也不一样;具体特性区别请看下表(注释2)
4、实验流程
4.0、前提知识
基本定时器由TIM6和TIM7组成,计数器为16位,内部结构较为简单,只有定时器的基本功能,可以做定时或驱动DAC,本实验暂不讨论DAC,只用定时功能,如下图所示为基本定时器框架(注释3),基本定时器的时钟来源为APB1 Timer clocks,当通过控制器启动基本定时器TIM6/7时,时钟信号经过PSC预分频器将时钟分频,然后以分频后的时钟频率增加计数器的值,当计数器达到自动重载寄存器设置的值之后,产生溢出
4.1、CubeMX相关配置
请先阅读“STM32CubeMX 工程建立”实验3.4.1小节配置RCC和SYS
4.1.1、时钟树配置
基本定时器涉及到定时时间的问题,而TIM6/7的时钟来源自APB1 Timer clocks,因此需要先设置时钟树,知道APB1 Timer clocks的频率,才可以计算基本定时器的溢出时间
如下图所示,时钟树上所有总线频率均设置为了STM32F4能达到的最高频率,此时APB1 Timer clocks=84MHz
4.1.2、外设参数配置
在Pinout & Configuration页面左侧功能分类栏目中点开Timers栏目,单击栏目下的TIM6和TIM7
在页面中间TIM6/7 Mode and Configuration 中勾选Activated激活基本定时器,One Pulse Mode为单次定时模式,勾选该模式则定时器只触发一次,默认定时器为连续触发,触发完一次后自动重载ARR中设置的值重新计数
在页面中间Configuration栏中可以设置基本定时器的参数,包括预分频器系数、计数模式、ARR寄存器的值和预装载值自动重载,通过这些参数的设置可以决定基本定时器的溢出时间,APB1 Timer clocks=84MHz,PSC=8399,ARR=4999,此时可计算溢出时间为(PSC+1)(ARR+1)/APB1 Timer clocks=0.5秒=500毫秒,则每500ms定时器产生一次溢出,ARR设置为9999则定时器1s溢出一次
参数auto re-load preload可以选择使能或不使能,如果不使能该参数,则在使用__HAL_TIM_SET_AUTORELOAD()函数动态修改基本定时器ARR参数值时,修改的值会立马生效;而如果使能该参数,则修改的值会在当前计数溢出之后下次得到修改
Trigger Output (TRGO) Parameters一般是用来设置用作其他外设的触发源的,比如将Trigger Event Selection选择为Update Event,然后在其他外设比如ADC中配置外部触发源时选择该定时器的触发事件(如果可以的话),这样在定时器产生Update Event时就可以启动外设,实现用定时器来控制外设启动的功能
上述配置如下图所示
4.1.3、外设中断配置
基本定时器的触发有三种模式①轮询方式②中断方式③DMA方式,这里只介绍前两种方式
①对于轮询方式,当前设置已经足够,只需要在生成的程序中使用HAL_TIM_Base_Start(&htim6)启动基本定时器,然后不断轮询计数值或UEV事件标志来判断是否发生了计数溢出
②中断方式是基本定时器最常用的方式,在Pinout & Configuration页面左侧功能分类栏目中点开NVIC栏目,然后选择合适的中断优先级并勾选基本定时器6和7的中断使能
4.2、生成代码
请先阅读“STM32CubeMX 工程建立”实验3.4.3小节配置Project Manager
单击页面右上角GENERATE CODE生成工程
4.2.1、外设初始化调用流程
在工程代码主函数main()中调用MX_TIM6_Init()函数对基本定时器TIM6参数进行了配置
在该MX_TIM6_Init()函数中调用了HAL_TIM_Base_Init()对定时器进行了初始化
然后在HAL_TIM_Base_Init()函数中调用了HAL_TIM_Base_MspInit()函数对TIM6时钟和中断设置/使能
TIM7初始化流程类似,具体定时器TIM6初始化流程如下图所示
4.2.2、外设中断调用流程
激活了基本定时器并启动TIM6/7全局中断之后,会在stm32f4xx_it.c中新增TIM6/7的中断服务函数TIM6_DAC_IRQHandler()和TIM7_IRQHandler()
该函数均调用HAL库的定时器中断统一处理函数HAL_TIM_IRQHandler(),该函数通过一系列的判断最终得出基本定时器目的为周期回调(注释4),因此最终调用周期回调函数HAL_TIM_PeriodElapsedCallback(),该函数为虚函数
TIM7中断调用流程类似,具体定时器TIM6中断调用流程如下图所示
4.2.3、添加其他必要代码
重新在tim.c中实现周期回调函数HAL_TIM_PeriodElapsedCallback(),当定时器TIM6溢出则翻转GREEN_LED引脚状态,当定时器TIM7溢出则翻转RED_LED引脚状态,具体代码如下图所示
源代码如下
/*基本定时器周期回调函数*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim == &htim6)
{
HAL_GPIO_TogglePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin) ;
}
if(htim == &htim7)
{
HAL_GPIO_TogglePin(RED_LED_GPIO_Port, RED_LED_Pin) ;
}
}
在主函数中以中断方式启动基本定时器TIM6/7,具体代码如下图所示
5、常用函数
/*以轮询工作方式启动定时器*/
HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim)
/*停止轮询工作方式的定时器*/
HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim)
/*以中断工作方式启动定时器*/
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)
/*停止中断工作方式的定时器*/
HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim)
/*定时器周期回调子函数*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
6、烧录验证
6.1、具体步骤
“激活基本定时器TIM6/7 -> 配置合适参数实现500ms/1s定时时间 -> 勾选TIM6/7全局中断 -> 在生成的代码中重新实现周期回调函数HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) -> 在该回调函数中判断定时器溢出来源 -> 根据来源编程对应响应 -> 在主函数主循环前使用HAL_TIM_Base_Start_IT(&htim6/7)以中断方式启动定时器”
6.2、实验现象
烧录程序,观察现象为绿灯每隔500ms状态改变一次,红灯每隔1s状态改变一次

使用逻辑分析仪监测PD12/14引脚状态,可以看出TIM6每500ms翻转一次PD12引脚状态,TIM7每1000ms翻转一次PD14引脚状态
7、注释详解
注释1:图片来源STM32F407VGT6 Datasheet DS8626
注释2:图片来源STM32 CubeMX 学习:003-定时器(其原表有错误)
注释3:图片来源STM32F4xx中文参考手册
注释4:具体过程请参看 HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) 函数详解
更多内容请浏览 OSnotes的CSDN博客
STM32CubeMX教程5 TIM 定时器概述及基本定时器的更多相关文章
- 【STM32H7教程】第33章 STM32H7的定时器应用之TIM1-TIM17的中断实现
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第33章 STM32H7的定时器应用之TIM1-T ...
- OpenGL官方教程——着色器语言概述
OpenGL官方教程——着色器语言概述 OpenGL官方教程——着色器语言概述 可编程图形硬件管线(流水线) 可编程顶点处理器 可编程几何处理器 可编程片元处理器 语言 可编程图形硬件管线(流水线) ...
- TCP的定时器系列 — 超时重传定时器
主要内容:TCP定时器概述,超时重传定时器.ER延迟定时器.PTO定时器的实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd Q:一条TCP连接会使用 ...
- TCP/IP之坚持定时器、报活定时器
TCP中的四个定时器: 1.超时定时器(最复杂的一个) 2.坚持定时器 3.保活定时器 4.2MSL定时器 坚持定时器用于防止通告窗口为0以后c/s双方相互等待死锁的情况:而保活定时器则用于处理半开发 ...
- TCP的定时器系列 — 零窗口探测定时器
主要内容:零窗口探测定时器的实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 出现以下情况时,TCP接收方的接收缓冲区将被塞满数据: 发送方的发送速 ...
- runloop 和 CFRunLoop - 定时器 - NSTimer 和 GCD定时器
1. 2. #import "ViewController.h" @interface ViewController () @property (nonatomic, strong ...
- TCP定时器 之 延迟确认定时器
TCP在收到数据段但是无需马上确认时设定,如果在超时时间之内有数据要发送到对端,则确认会随着数据一起发送,即捎带ACK,如果达到超时时间则执行定时器回调立即发送ack: 启动定时器: 延迟确认定时器调 ...
- 【STM32H7教程】第34章 STM32H7的定时器应用之TIM1-TIM17的PWM实现
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第34章 STM32H7的定时器应用之TIM1-T ...
- 1、CC2541蓝牙4.0芯片中级教程——基于OSAL操作系统的运行流程了解+定时器和串口例程了解
本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...
- 转:Java NIO系列教程(一)Java NIO 概述
Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Sel ...
随机推荐
- Solution -「HDU 3507」Print Article
Description Link. 给出 \(N\) 个单词,每个单词有个非负权值 \(C_{i}\),现要将它们分成连续的若干段,每段的代价为此段单词的权值和,还要加一个常数 \(M\),即 \(( ...
- Solution -「九省联考 2018」劈配
Description Link. 一年一度的综艺节目<中国新代码>又开始了.Zayid 从小就梦想成为一名程序员,他觉得这是一个展示自己的舞台,于是他毫不犹豫地报名了. 轻车熟路的 Za ...
- 【Python爬虫】python打印本地代理
在进行网络爬虫时,使用代理是非常重要的.因为爬虫经常会被网站封 IP,而代理可以隐藏你的真实 IP 地址,让你可以更不受限制地爬取数据.本文将介绍如何在 Python 中打印代理,包括代理 IP 的使 ...
- IDEA2019 Debug傻瓜式上手教程
Step Into (F7):步入,如果当前行有方法,可以进入方法内部,一般用于进入自定义方法内,不会进入官方类库的方法. Force Step Into (Alt + Shift + F7) ...
- Python开发之Django框架
一. Django框架 01.网络软件开发架构演变过程 02.HTTP协议讲解 03.web应用与框架介绍及手撸web框架 04.Django入门项目创建与必会三板斧 05.Django静态文件配置与 ...
- android图片缩放双击旋转效果
需要jar源码的请留言吧. 部分源码 demo下载地址 package uk.co.senab.photoview.sample; import android.app.ListActivity ...
- Pandas 读取Eexcel - 间隔N行,读取某列数据
间隔N行,读取某列数据 import pandas as pd def read_vertical(sheet_name, col_idx, gap): """ 竖着读数 ...
- 【羚珑AI智绘营】分分钟带你拿捏SD中的色彩控制
导言 颜色控制一直是AIGC的难点,prompt会污染.img2img太随机- 今天带来利用controlnet,实现对画面颜色的有效控制.都说AIGC是抽卡,但对把它作为工具而非玩具的设计师,必须掌 ...
- JavaScript:垃圾收集机制
JavaScript具有自动垃圾收集机制.也就是说,执行环境会负责管理代码执行过程中使用的内存.开发人员不必关心内存分配和回收问题. 垃圾收集机制的原理:找到不再继续使用的变量,然后进行释放其占用的内 ...
- Java Springbool敏感词过工具类滤
Java Springbool敏感词过工具类滤 1. 功能描述利用前缀树这种数据结构,设计并开发出敏感词过滤工具. 2. 构建敏感词表resource/sensitive-words.txt 3. 敏 ...