STM32学习笔记(6_1)- TIM定时器定时功能原理

无人问津也好,技不如人也罢,都应静下心来,去做该做的事。

最近在学STM32,所以也开贴记录一下主要内容,省的过目即忘。视频教程为江科大(改名江协科技),网站jiangxiekeji.com

现在开始上难度,STM32功能最强大、结构最复杂的外设——定时器,分四期介绍。

本期介绍最基础的定时功能,也就是定一个时间,然后让定时器每隔这个时间产生一个中断。

下一期介绍定时器输出比较的功能,常用产生PWM波驱动电机。

再下一期介绍定时器输入捕获功能,常用测量方波频率。

最后介绍定时器的编码器接口,更方便读取正交编码器的输出波形,常用编码电机测速。

TIM定时器简介

计数器:用来执行计数定时的一个寄存器,每来一个时钟,计数器加1。

预分频器:可以对计数器的时钟进行分频,让这个计数更加灵活。

自动重装寄存器:计数的目标值,就是我想要计多少个时钟申请中断。

以上三个都是16位的,也就是最大定时59.65秒,定时器还支持级联,59.65秒×65536(2的16次方)

主要介绍通用定时器

无论是高级定时器,还是通用定时器,还是基本定时器,它们的内部基准时钟都是72MHz

定时中断基本结构

定时器类型 

高级定时器:重复计数器、死区生成、互补输出、刹车输入等这些功能,主要是为了三相无刷电机的驱动设计的,比如四轴飞行器、电动车的后轮、电钻等。本系列不会涉及到。

主要介绍通用定时器,

无论是高级定时器,还是通用定时器,还是基本定时器,它们的内部基准时钟都是72MHz

STM32F103C8T6定时器资源:TIM1、TIM2、TIM3、TIM4,没有基本定时器。

基本定时器

定时中断功能

基本定时器只能选择内部时钟、只有向上计数模式

如果PSC预分频器写0,这时候输出频率=输入频率=72MHz

如果PSC预分频器写1,即二分频,这时候输出频率=输入频率/2=36MHz

如果PSC预分频器写2,即三分频,这时候输出频率=输入频率/3=24MHz

以此类推,即实际分频系数=预分频器的值+1,这个预分频器是16位的,所以最大值可以写65535,也就是65536分频

计数时钟每来一个上升沿,CNT计数器的值就加1,可以从0加到65535,然后回到0重新开始。

当计数值等手自动重装值时,也就是计时时间到了,会清零计数器。这时也需要和外部中断一样选择触发中断还是事件,在定时器里叫更新中断和更新事件。

主模式触发DAC功能

它能让内部的硬件在不受程序的控制下实现自动运行,特定场景下可极大减轻CPU负担。

这个用途就是在我们使用DAC的时候,可能会用DAC输出一段波形,那就需要每隔一段时间来触发一次DAC,让它输出下一个电压点,如果用正常的思路来实现,就是先设置一个定时器产生中断,每隔一段时间在中断程序中调用代码手动触发一次DAC转换,然后DAC输出。这样也没问题,但会使主程序频繁被中断。

基于以上这种情况,定时器设计了一个主模式,使用这个主模式可以把定时器的更新事件映射到这个触发输出TRGO(Trigger Out)的位置,然后TRGO直接接到DAC的触发转换引脚上。

通用定时器

计数模式

通用定时器和高级定时器还支持向下计数模式和中央对齐模式

向上计数模式:从0开始,往上自增,加到自动重装值,然后回到0,申请中断。

向下计数模式:从重装值开始,向下自减,减到0之后,回到重装值同时申请中断。

中央对齐模式:从0开始,先向上自增,计到重装值,申请中断,然后再向下自减,减到0,再申请中断,然后开始下一轮。

时钟源

通用定时器的时钟源不仅可以选择内部的72MHz时钟 ,还可选择外部时钟,

如果要使用外部时钟,首选ETR引脚外部时钟模式2的输入,最简单、直接

第一个外部时钟就是来自TIMx_ETR引脚上的外部时钟,称为外部时钟模式2

第二个外部时钟是TRGl(Trigger In),它主要是用作触发输入来使用的。称为外部时钟模式1

定时器的级联就是使用该模式

总结一下就是,外部时钟模式1的输入可以是ETR引脚、其他定时器、CH1引脚的边沿、
CH1引脚和CH2引脚

高级定时器

时序图

这一部分建议直接看视频讲解

预分频器时序

预分频寄存器实际上是有两个,预分频器为了防止计数中途更改数值造成错误,设计了缓冲寄存器或影子寄存器

一个是预分频控制寄存器,供我们读写用的,它并不直接决定分频系数;

另外还有一个预分频缓冲器或者说是影子寄存器,这个是真正起作用的寄存器

在一个计数周期内,前半部分和后半部分的频率不一样,这里计数到一半,计数频率突然就被改变,因此设计这个缓冲寄存器。这样。当我在计数计到一半的时候改变了分频值,这个变化并不会立刻生效,而是会等到本次计数周期结末时,产生更新事件,预分频寄存器的值才会被传递到缓冲寄存器里面去,才会生效。

计数器时序图

计数器的这个ARR自动重装寄存器,也是有一个缓冲寄存器的,并且这个缓冲寄存器是用还是不用,是可以自己设置的。

计数器在这个时钟每个上升沿自增,当增到0036的时候,发生溢出,再来一个上升沿,计数器清零,计数器溢出,产生一个更新事件脉冲,另外还会置一个更新中断标志位UIF,这个标志位只要置1,就会去申请中断。然后中断响应后,需要在中断程序中手动清零。

用72MHz/(PSC+1)/(ARR+1)就能得到溢出频率,再取倒数就能知道溢出时间。

计数器无预装时序

通过设置这个ARPE位,就河以选择是否使用预装功能

计数器有预装时序 

ARPE=1时,就使用预装功能

RCC时钟树

ST公司已经帮我们写好了配置个时钟树的SystemInit函数,首先它会启动内部时钟,选择内部8MHz为系统时钟,暂时以内部8MHz的时钟运行,然后再启动外部时钟,配置外部时钟进入PLL锁相进行倍频,8MHz倍频9倍,得到72MHz。等到锁相环输出稳定后,选择锁相环输出为系统时钟,这样就把系统时钟由8MHz切换为了72MHz。

如果你的外接8MHz晶振出了问题,系统时钟就无法切换到72MHz,那它就会以内部的8MHz运行,8MHz相比较72MHz,大概就慢了10倍,比如你的delay函数慢了10倍。

下图的左边为时钟产生电路,右边为时钟分配电路

时钟产生电路有四个震荡源:内部的8MHz高速RC振荡器、

外部的4-16MHz高速石英晶体振荡器(一般都是外接8MHz晶振,比内部的8MHz稳定)、

外部的32.768KHz低速晶振(一般是给RTC提供时钟的)、

内部的40KHz低速RC振荡器(这个可以给看门狗提供时钟)

上面两个高速时钟是给系统提供的,我们的AHB、APB2、APB1的时钟都是来源于这两个高速晶振

 

 

本期主要两个实验

定时器定时中断

可以看到OLED上显示了一个数字Num,并且每秒自动加1。这个就是用了定时中断的功能,定时器使用内部时钟定了1秒的时间,每隔1秒申请一下中断,然后在中断函数里执行Num++ ,最后在OLED上显示Num++。

 定时器外部时钟

使用外部时钟来驱动定时器,我们可以在定时器指定的外部引脚上,输入一个方波信号,来提供定时器计算的时钟,现在这里暂时用这个对射式红外传感器来手动模拟一个外部时钟,用挡光片,依次遮挡、移开、遮挡、移开,提供一个方波。可以看到这个OLED上下面这个CNT就是定时器中计数器的值,每遮挡、移开一次,计数器加1,然后计数器记到9后,自动清0。同时申请中断,执行Num++。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/768170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(ES6)前端八股文修炼Day2

1. let const var 的区别 var: var 是在 ES5 中引入的声明变量的关键字。 具有函数作用域,而不是块作用域,这意味着使用 var 声明的变量在函数内部是可见的。 变量可以被重复声明,而且变量的值可以在声明前使用,这可能…

jmeter链路压测

比如登录后返回token,业务打印上传的操作需要用到token 线程组中添加登录请求,并执行 1、添加登录并执行,查看结果 2、结果树中下拉选择正则表达式,将token参数和值复制粘贴到下方,将token值改为(.*?)&#xff0…

【Nebula笔记】简介及安装

目录 一、简介 (一) 什么是图数据库 二、安装 (一) 原生安装 (二) Docker & Docker compose 1. Docker安装 Linux Window 2. 部署NebulaGraph (三) to MAC 三、Nebula Graph Studio (一) 版本兼容性 (二) 原生安装 (三) Docker compose (四) 连接Nebula Gra…

python—接口编写部分

最近准备整理一下之前学过的前端小程序知识笔记,形成合集。顺便准备学一学接口部分,希望自己能成为一个全栈嘿嘿。建议关注收藏,持续更新技术文档。 目录 前端知识技能树http请求浏览器缓存 后端知识技能树python_api:flaskflask…

Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(四)

概览 从上一篇博文: Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(三)我们学到了 Swift 中完全自己撸码实现 SwiftHook 类似功能的基本思路、提出了两个“难关”,并首先解决了其中第一道难题。 在这一篇中,我们将会继续克服各种“艰难险阻”,…

Spark spark-submit 提交应用程序

Spark spark-submit 提交应用程序 Spark支持三种集群管理方式 Standalone—Spark自带的一种集群管理方式,易于构建集群。Apache Mesos—通用的集群管理,可以在其上运行Hadoop MapReduce和一些服务应用。Hadoop YARN—Hadoop2中的资源管理器。 注意&…

STM32微控制器的中断优先级设置对系统性能有何影响?

STM32微控制器的中断优先级设置对系统性能有着显著的影响。正确配置中断优先级可以确保关键任务得到及时响应,提高系统的实时性和可靠性。相反,如果中断优先级设置不当,可能会导致系统响应延迟,甚至出现死锁等问题。本文将详细探讨…

python第三方库的安装,卸载和更新,以及在cmd下pip install安装的包在pycharm不可用问题的解决

目录 第三方库pip安装,卸载更新 1.安装: 2.卸载 3.更新 一、第三方库pip安装,卸载更新 1.安装 pip install 模块名 加镜像下载:pip install -i 镜像网址模块名 常用的是加清华镜像,如 pip install -i https://pyp…

Web前端—浏览器渲染原理

浏览器渲染原理 浏览器渲染原理渲染时间点渲染流水线1. 解析HTML—Parse HTML2. 样式计算—Recalculate Style3. 布局—Layout4. 分层—Layer5. 绘制—Paint6. 分块—Tiling7. 光栅化—Raster8. 画—Draw完整过程 面试题1. 浏览器是如何渲染页面的?2. 什么是 reflow…

每日一题 --- 两两交换链表中的节点[力扣][Go]

两两交换链表中的节点 题目:24. 两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1&a…

基于Java中的SSM框架实现考研指导平台系统项目【项目源码+论文说明】

基于Java中的SSM框架实现考研指导平台系统演示 摘要 应对考研的学生,为了更好的使校园考研有一个更好的环境好好的学习,建议一个好的校园网站,是非常有必要的。提供学生的学习提供一个交流的空间。帮助同学们在学习高数、学习设计、学习统计…

Python+django+vue开发的家教信息管理系统

一直想做一款管理系统,看了很多优秀的开源项目但是发现没有合适的。 于是利用空闲休息时间开始自己写了一套管理系统。 功能介绍 平台采用B/S结构,后端采用主流的Pythondjango进行开发,前端采用主流的Vue.js进行开发。 整个平台包括前台和…

Arduino智能家居

文章目录 一、接线框图1、下载fritzing 二、Arduino IDE 下载三、实现代码 一、接线框图 1、下载fritzing https://github.com/fritzing/fritzing-app/releases打开的软件界面如下: 二、Arduino IDE 下载 官网地址 P.S. 如果upload代码过程中出现cant open de…

2024年阿里云轻量应用服务器优惠价格_2核2G_2核4G报价

阿里云轻量应用服务器2核2G和2核4G配置优惠价格表,轻量2核2G3M带宽61元一年,轻量2核4G4M带宽165元1年,均不限制月流量,阿里云活动链接 aliyunfuwuqi.com/go/aliyun 活动打开如下图: 阿里云轻量应用服务器价格 61元/年…

力扣刷题之21.合并两个有序链表

仅做学习笔记之用。 题目: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]示例 2: 输入&#xf…

MySQL数据库基本操作(增删改查)与用户授权

前言 SQL(Structured Query Language,结构化查询语言)是一种用于管理关系数据库系统的语言。SQL的设计目标是提供一种简单、直观的语言,使得用户可以通过编写SQL语句来处理他们想要的数据和操作。 目录 一、结构介绍 1. 查看信…

使用Django实现信号与消息通知系统【第154篇—Django】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Django实现信号与消息通知系统 在Web应用程序中,实现消息通知系统是至关重…

华为数通 HCIP-Datacom H12-831 题库补充

2024年 HCIP-Datacom(H12-831)最新题库,完整题库请扫描上方二维码,持续更新。 缺省情况下,PIM报文的IP协议号是以下哪一项? A:18 B:59 C:103 D:9 答案&a…

从抛硬币试验看概率论的基本内容及统计方法

一般说到概率,就喜欢拿抛硬币做例子。大多数时候,会简单认为硬币正背面的概率各为二分之一,其实事情远没有这么简单。这篇文章会以抛硬币试验为例子并贯穿全文,引出一系列概率论和数理统计的基本内容。这篇文章会涉及的有古典概型…

ubuntu20.04安装 ffmpeg 开发环境

参考:参考1 一些相关软件包,已打包整理好,如下 源码包 1、安装步骤 创建安装目录 sudo mkdir -p /usr/local/ffmpeg/lib 解压源码 tar -jxf ffmpeg-4.3.2.tar.bz2 到指定ffmpeg目录进行配置 cd ffmpeg-4.3.2/ 配置:会报错很多…