Ⅰ、概述

STM32的TIM定时器分为三类:基本定时器、通用定时器和高级定时器。从分类来看就知道STM32的定时器功能是非常强大的,但是,功能强大了,软件配置定时器就相对复杂多了。很多初学者甚至工作了一段时间的人都不知道STM32最基本的计数原理

虽然STM32定时器功能强大,也分了三类,但他们最基本的计数部分原理都是一样的,也就是我们常常使用的延时(或定时)多少us、ms等。

接下来我会讲述关于STM32最基本的计数原理,详细讲述如何做到(配置)计数1us的延时,并提供实例代码供大家参考学习。

关于本文的更多详情请往下看。

Ⅱ、实例工程下载

笔者针对于初学者提供的例程都是去掉了许多不必要的功能,精简了官方的代码,对初学者一看就明白,以简单明了的工程供大家学习。

笔者提供的实例工程都是在板子上经过多次测试并没有问题才上传至360云盘,欢迎下载测试、参照学习。

提供下载的软件工程是STM32F417的,但F4其他型号也适用(适用F4其他型号: 关注微信,回复“修改型号”)。

STM32F4_TIM基本延时(1us延时基准)实例:

https://yunpan.cn/cB3hC8amiyq2C  访问密码 5224

感兴趣的朋友研究下面实例“定时中断”

STM32F4_TIM基本定时(1ms定时中断)实例:

https://yunpan.cn/cB3CyILIXeaFc  访问密码 0ad9

STM32F4资料:

https://yunpan.cn/cR2pxqF5x2d9c  访问密码 53e7

Ⅲ、TIM计数原理描述

定时器可以简单的理解为:由计数时钟(系统时钟或外部时钟)一个一个计数,直到计数至我们设定的值,这个时候产生一个事件,告诉我们计数到了。

上面简单的描述懂了之后就是需要理解它们每一步骤的细节,比如:提供的时钟频率是多少、分频是多少等。

基本TIM框图:

通用TIM框图:

上面两图截取“STM32F4x5、x7参考手册”建议下载手册参看。

从上面两个TIM框图可以看得出来,通用TIM是包含了基本TIM的功能。也可以说基本定时器是定时器最基本的计数部分,我们该文主要就是围绕这部分来讲述,后续会其他更通用、高级的功能给大家讲述。

重要的几个参数(信息):

1.CK_INT时钟:一般由RCC提供(注意:其频率大部分都是系统时钟的一半,在程序中有一个除2的部分,详情请见RCC部分)。

2.CK_PSC时钟预分频:也就是对CK_INT分频。这个值范围:0 - 65535范围都可以,最好能被CK_INT除尽,这样才方便计算时钟。

3.ARR重载值:这个值相当于是我们设定需要计数的值,也就是说计数到这个设定值就会产生一个事件。

综上CK_INTCK_PSC确定计数的时钟频率(1秒计多少数), ARR是设定的计数值。最基本的延时(或定时)就由以上三个参数计算而来。

Ⅳ、基本延时源代码分析

笔者以F4标准外设库(同时也建议初学者使用官方的标准外设库)为建立的工程,主要以库的方式来讲述。

考虑大家到以后肯定使用定时器更多功能,笔者提供的软件工程实例是通用定时TIM4。其实,将工程中TIM4改为TIM6(基本定时器)一样可以运行的。

1.RCC时钟

该函数位于bsp.c文件下面;

重点注意:

A.外设RCC时钟的配置要在其外设初始化的前面;

B.匹配对应时钟。

比如:RCC_APB2外设不要配置在RCC_APB1时钟里面

【如:RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);这样能编译通过,但这是错误的代码】

2.TIM配置

该函数位于timer.c文件下面;

该函数就是配置定时器基本计数的函数;

配置为1us的基准:

A.1秒钟计数42M次个脉冲

“TIM基本延时”实例工程中:CK_INT = 84M时钟(SystemCoreClock/2)

“TIM基本延时”实例工程:CK_PSC = 84M/42M - 1 = 1  即2分频;

至于为什么要减1?

初学者可以理解为“CK_PSC = 0”时不分频(即1分频);“CK_PSC = 1”时为2分频。

#define TIM4_COUNTER_CLOCK        42000000

#define TIM4_PRESCALER_VALUE      (SystemCoreClock/2/TIM4_COUNTER_CLOCK - 1)

B.1秒钟计数1M次个周期

#define TIM4_PERIOD_TIMING    (42 - 1)

即ARR重载值;

由上面“A”得出“1秒钟计数42M次个脉冲”,则记满42个脉冲数需要1us(也就是1秒钟计数1M次个周期)。

 

3.us(微妙)延时函数

该函数位于timer.c文件下面;

上图一个while循环就是1us的时间;上面的一些工作就是配置定时器工作一个周期的时间为1us,这里延时N微妙就应该很好理解了; 其实还有一个函数延时N毫秒,很简单,不描述。

Ⅴ、定时中断(拓展)

“定时中断”功能是基于前面基础上进行了一个拓展,增加了计数周期就中断的功能。

笔者单独提供了一个实例:定时1ms中断一次(两工程区别在于时间不是1us, 1us中断一次时间太短);

在软件上主要就是增加开启TIM中断、配置NVIC、添加TIM中断函数;

1.使能TIM中断

该函数位于(定时中断工程)timer.c文件下面;

功能:使能TIM中断。

2.配置NVIC中断控制器

该函数位于(定时中断工程)bsp.c文件下面;

功能:配置TIM中断控制。

3.中断函数

该函数位于(定时中断工程)stm32f4xx_it.c文件下面;

功能:定时周期到进入该中断函数。其中有一个计数减,相当于我们延时工程中while延时N的值;

Ⅵ、说明

关于笔者提供的软件工程实例,可关注微信,在会话框回复“关于工程”,有关于工程结构描述、型号修改等讲述。

以上总结仅供参考,若有不对之处,敬请谅解。

Ⅶ、最后

更多精彩文章我讲第一时间在微信公众号里面分享。

本着免费分享的原则,方便大家手机学习知识,定期在微信平台分享技术知识。如果你觉得分享的内容对你有用,又想了解更多相关的文章,请用微信搜索“EmbeddDeveloper” 或者扫描下面二维码、关注,将有更多精彩内容等着你。

STM32F4_TIM基本延时(计数原理)的更多相关文章

  1. Luogu 1351 NOIP 2014 联合权值(贪心,计数原理)

    Luogu 1351 NOIP 2014 联合权值(贪心,计数原理) Description 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi, ...

  2. Objective-C 引用计数原理

    http://www.cocoachina.com/ios/20160112/14933.html 引用计数如何存储 有些对象如果支持使用 TaggedPointer,苹果会直接将其指针值作为引用计数 ...

  3. oc引用计数原理-引用计数相关变化

    http://blog.csdn.net/null29/article/details/71191044 在 32 位环境下,对象的引用计数都保存在一个外部的表中,每一个对象的 Retain 操作,实 ...

  4. [打基础]luogu2181对角线——计数原理

    啦啦啦我ysw又回来啦!之后大概会准备打acm,暑假尽量复习复习,因为已经快两年没碰oi了,最多也就高三noip前学弟学妹出题讲题,所以从这一篇blog开始大概会有一系列"打基础" ...

  5. polay计数原理

    公式: Burnside引理: 1/|G|*(C(π1)+C(π2)+C(π3)+.....+C(πn)): C(π):指不同置换下的等价类数.例如π=(123)(3)(45)(6)(7),X={1, ...

  6. 数学计数原理(Pólya):POJ 1286 Necklace of Beads

    Necklace of Beads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7763   Accepted: 3247 ...

  7. 组合数学(Pólya计数原理):UvaOJ 10601 Cubes

    Cubes You are given 12 rods of equal length. Each of them is colored in certain color. Your task is ...

  8. 数学计数原理(Pólya,高精度):SGU 294 He's Circles

      He's Circles He wrote n letters "X" and "E" in a circle. He thought that there ...

  9. 数学(GCD,计数原理)HDU 5656 CA Loves GCD

    CA Loves GCD Accepts: 135 Submissions: 586 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 2621 ...

随机推荐

  1. MySQL的循环语句使用总结

    REPEAT-UNTIL循环 [loopname]:REPEAT commands; UNTIL condition END REPEAT [loopname]; 在这种循环里,关键字repeat和u ...

  2. 简洁之美 -约瑟夫环的python 解法

    问题描述: 约瑟夫环问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到k的那个人出列:他的下一个人又从1开始报数,数到k的那个人又出列:依此规律重复下 ...

  3. 三分钟部署Laxcus大数据管理系统

    Laxcus是Laxcus大数据实验室历时五年,全体系自主设计研发的国内首套大数据管理系统.能够支撑百万台级计算机节点,提供EB量级存储和计算能力,兼容SQL和关系数据库.最新的2.x版本已经实现对当 ...

  4. 如何正确的使用Lerp In Unity

    摘要 本文探讨如何用lerp实现近似的匀速旋转,当然如果运用本文给出的方法,使用slerp则可以实现匀速旋转,并指出Unity官方lerp示例代码的一些缺陷. 现有问题 比如四元数Lerp API: ...

  5. JFrame 实现全屏透明背景

    JFrame f=new JFrame(); f.setUndecorated(true);        f.setBackground(new Color(0,0,0,0));        To ...

  6. socket学习笔记——获取域名与IP(linux)

    gethostbyname.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #includ ...

  7. Messenger 弹窗的使用

    关于Messenger 弹窗的文档及详细的说明请参考 Messenger官网,这时只介绍 Messenger 弹窗的使用  messenger依赖与jquery和Backbone.js,可以和  Bo ...

  8. 数据结构(一)之HelloWord

    最近由于学习上面的需要,要重新的看看数据结构方面的知识!当然,我觉得数据结构也非常的重要,下面是我的学习的一点小小的记录,以备日后的查看! 我的环境: 1:操作系统:windows7 2:编码环境:M ...

  9. 图的最短路算法 Bellman-Ford

    BF求图的最短路径的时间复杂度是O(MN),这样的时间复杂度并不比迪杰斯特拉算法好,但是BF算法支持图中存在负权的情况,但图中不能存在负圈,因为如果存在负圈,最短路是不存在的,因此BF算法的另一个重要 ...

  10. Push failed: Failed with error: fatal: Could not read from remote repository.

    GitLab push远端,出现错误提示:Push failed: Failed with error: fatal: Could not read from remote repository. 原 ...