【江科大】STM32:定时器中断

文章目录

  • TIM(Timer)定时器
    • 根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型
      • 基本定时器
      • 通用定数器
    • 高级定时器
  • 时钟(时钟电路)的作用是什么:
    • 设置定时器触发中断普通方法:
    • 预分频器时序
    • 缓冲寄存器
    • 计数器时序
    • 如何判断是否使用预装功能
    • 计数器无预装和有预装的区别
  • 配置时钟树
    • STL配置时钟树步骤:
    • 如果外部时钟出问题,会出现什么现象?
  • 定时器相关的库函数
  • 初始化定时器
  • 定时器外部时钟

TIM(Timer)定时器

  • 功能:定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断
  • HZ 和ms的单位转换:1ms = 1KHZ 1MZ = 1000KHZ 1ms = 1000us
  • 16位计数器、预分频器、自动重装寄存器(记录多少个时钟申请中断)的时基单元,在72MHz计数时钟下可以实现最大59.65s(72/65536/65536 ,再取倒数)的定时
    T :时钟分频后的周期 ,n:重装计数值 t:可计时的时长
    T = 1/f t = n*T (16位计数器,字节数65535)
  • 如果嫌不够长,Stm32支持级联模式,一个定时器的输出当作另一个计数器的输入。三个定时器级联,34万亿年
  • 不仅具备基本的定时中断功能,而且还包含
  1. 内外时钟源选择、
  2. 输入捕获(用来测量方波频率)、
  3. 输出比较(产生PWM波形,用于驱动舵机,直流电机)、
  4. 编码器接口(能够更加方便的读取正交编码器的输出波形,应用于在编码测试)、
  5. 主从触发模式等多种功能

根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型

请添加图片描述

基本定时器

请添加图片描述

通用定数器

在这里插入图片描述

高级定时器

请添加图片描述
在这里插入图片描述

时钟(时钟电路)的作用是什么:

单片机的运行需要一个脉冲信号,作为自己执行指令的触发信号。可以理解为,单片机收到一个脉冲,就执行一次或多次指令。
而这个脉冲是由单片机控制器中的时序电路发出,组成该电路最关键的器件晶振,是一种高精度,高稳定度的振荡器,街上一定的外界电路可以生成频率和峰值稳定的正弦波。这就给单片机提供了脉冲。
所以时钟就是给的单片机提供脉冲,从而使它执行指令。
51单片机和stm32
51不需要配置时钟,因为一个时钟开启所有功能都可以用。就相当只有一个总开关,且默认为开启状态。
32默认为关闭,不同的功能使用不同的时钟,因此需要用哪个就开启哪个时钟。

  • 内部时钟
    一般采用的都是11.0592MHZ的晶体振荡器作为震荡源,由于单片机内部带有振荡电路,所以外部只需要连接一个晶振和两个电容。对频率作微调。
  • 外部时钟:
    ETR,ITRX TLX
  • 时基单元:(构成了最基本的计数计时电路)

设置定时器触发中断普通方法:

普通方法:
设置定时器触发中断,每隔一段事件在程序中调用代码手动触发一次DAC转换,然后DAC输出 。但会影响主程序运行和其他中断的响应。
改进,定时器设计了主模式
因此定时器设计了主模式,使用它可以把这个更新事件映射到触发输出TRGO口上,触发TRGO直接接到DAC的触发转换引脚上,从而定时器的更新不需要触发中断来触发FAC转换了。
编码器接口:读取正交编码器的输出波形
捕获比较寄存器:输入捕获和比较电路共用

预分频器时序

请添加图片描述

缓冲寄存器

  • 计数器无预装时序(没有缓冲寄存器)

  • 计数器有预装时序 (有缓冲寄存器)

  • 缓冲寄存器的功能:
    实现每隔几个周期再更新一次。
    之前是,每个周期都更新,对更新信号再分频

  • 作用:
    缓冲寄存器才是真正起作用的寄存器,比如再某个时刻把预分频器寄存器由0该1,如果此时立刻改变分频系数,就会导致前半段和后半段分频不一致,缓存计数器的作用就是,改变后不会立刻生效,等待本次计数结束,产生更新时间,预分频的值才会传进去,下一轮计数才生效。
    包含有缓冲寄存器的有:

  1. 预分频器(psc)
  2. 自动重装寄存器
  3. REP寄存器
  4. 捕获比较寄存器(且它可以设置用还是不用)

计数器时序

请添加图片描述

如何判断是否使用预装功能

通过设置ARPE位

计数器无预装和有预装的区别

无预装:自动加载寄存器突然更改,将FF改为36
计数的目标值就从FF变为36,因此计数寄存器增加到目标值36就自动更新,重新计数
有预装:自动加载寄存器突然更改,当F5突然改为36,计数寄存器仍然
累计到F5,完成本次计数,才更新计算下一轮计数。

配置时钟树

主函数执行之前会先运行一个systemInit函数:用来配置时钟树

  • 左边是时钟的产生电路
    :四个振荡源
  • 右边是时钟的分配电路
    中间就是系统时钟,72MHZ
  • 外部石英振荡器比内部RC振荡器更稳定,都是给系统提供脉冲。
    在这里插入图片描述

STL配置时钟树步骤:

1.选择内部8MHZ给系统时钟(绿色路线),系统暂时以8MZH运行。2.在开启外部时钟(红色路线)进入PLL锁相环进行倍频,8MHZ倍频9倍,得到72MHZ,等到锁相环输出稳定,选择锁相环输出为系统时钟,这样就将系统时钟从8MHZ切换到72MHZ。

如果外部时钟出问题,会出现什么现象?

程序的时钟慢了10倍。定时器设定为1S,结果10秒后才有中断。
因为没有了外部时钟,内部那就是以8MHZ运行,相比于72MHZ满了10倍。
(外部晶振引脚焊短路)
CSS:用来切换时钟。检测外部时钟的运行状态,如果外部出问题了,那就该时钟为内部,保证程序运行。
即便APB1选择的是,但是有分支判断它的分频系数,最终输出仍然是72MHZ,因此可以的出,不论是基本,通用还是高级定时器,内部基准时钟都是72MHZ。请添加图片描述

请添加图片描述

定时器相关的库函数

//时基单元
void TIM_DeInit(TIM_TypeDef* TIMx);
//定时器时基单元初始化,就是配置自动重装器,预分频器,计数器,第一个参数:选择某个定时器,
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
//可以把结构体变量赋默认值
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
//运行控制:启动时基单元
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
//使能中断控制 第二个参数:哪个中断函数
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);


//时钟源的选择
//下面6个函数指的就是最左边的绿色那三个,选择时钟
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);
//第二个参数,选择输入捕获通道
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
 //第二个参数:选择TIX具体的某个引脚,第三个:输入的极性 第四个:输入的滤波器(对于外部引脚,都会有极性选择和滤波器)
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
                                uint16_t TIM_ICPolarity, uint16_t ICFilter);
                        //外部触发预分频器
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
                             uint16_t ExtTRGFilter);
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, 
                             uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
                        //用来单独配置,预分频器,极性和滤波器的
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,   uint16_t ExtTRGFilter);
//单独设置预分频值的函数     第二个参数:选择写入模式,预分频器有缓冲寄存器,写入的值只有在更新事件后才有效。
   //所以这里的写入模式可以选择听从安排,在更新事件后生效,或写入后,手动产生一个更新事件,让这个值立刻生效。
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);
//用来改变计数器的计数模式
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);
//自动重装器预装功能配置,有预装还是不预装是可以选择的
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
//给计数器写入一个值
void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);
//给自动重装器写入一个值
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);
//获取计数器的值
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);
//获取预分频值
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);
//获取标志位和清楚标志位
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

初始化定时器

在这里插入图片描述

定时器外部时钟

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

架构篇15:高性能数据库集群-分库分表

文章目录 业务分库分表实现方法小结 上篇我们讲了“读写分离”,读写分离分散了数据库读写操作的压力,但没有分散存储压力,当数据量达到千万甚至上亿条的时候,单台数据库服务器的存储能力会成为系统的瓶颈,主要体现在这…

【pdf技巧】PDF文件设置打印限制

想要限制PDF文件的打印功能,想要限制PDF文件打印清晰度,都可以通过设置限制编辑来达到目的。 打开PDF编辑器,找到设置限制编辑的界面,切换到加密状态,然后我们就看到 有印刷许可。勾选【权限密码】输入一个PDF密码&am…

正则表达式、grep过滤工具、sed基本用法、sed基本操作指令、sed应用案例

1 案例1:使用正则表达式 1.1 问题 本案例要求熟悉正则表达式的编写,完成以下任务: 利用grep或egrep工具练习正则表达式的基本用法 1.2 方案 表-1 基本正则列表 表-2 扩展正则列表 1.3 步骤 实现此案例需要按照如…

aiXcoder自动跳出

在使用vscode时突然提示:需登录aixcoder才可以继续使用;如果不登录,一使用vscode就会自动弹出aixcoder试用界面: 试用?后面可能要收取费用,本着白嫖的宗旨思考:那么怎么恢复原来的版本呢&#x…

A 股承担着一个什么功能?

​A 股:中国资本市场的核心角色 A 股,即人民币普通股票,在中国资本市场中扮演着至关重要的角色。它不仅是投资者买卖交易的场所,更是中国经济发展的重要引擎。 首先,A 股为中国的企业提供了融资平台。中国有着庞大的…

天天酷跑-C语言搭建童年游戏(easyx)

游戏索引 游戏名称&#xff1a;天天酷跑 游戏介绍&#xff1a; 本游戏是在B站博主<程序员Rock>的视频指导下完成 想学的更详细的小伙伴可以移步到<程序员Rock>视频 【程序员Rock】C语言项目&#xff1a;手写天天酷跑丨大一课程设计首选项目&#xff0c;手把手带你用…

Web安全漏洞专项靶场—SQL注入—docker环境—sqli-labs靶场—详细通关指南

SQL注入—sqli-labs靶场 零、前言一、环境搭建①、VirtualBox②、Kali Linux③、Docker 二、闯关开始1、Less-1——union2、Less-2—数字型—union3、Less-3—)—union4、Less-4—")—union5、Less-5——布尔盲注6、Less-6—"—布尔盲注7、Less-7—))7.1—布尔盲注7.…

Git学习笔记(第8章):IEAD实现GitHub操作(VSCode)

目录 8.1 VSCode登录GitHub账号 8.2 创建远程库 8.3 本地库推送到远程库(push) 8.4 远程库拉取到本地库(pull) 8.5 远程库克隆到本地库(clone) 8.1 VSCode登录GitHub账号 Step1&#xff1a;安装“GitHub Pull Requests and Issues”插件 Step2&#xff1a;登录GitHub账号 …

加密项目调研的评估框架

当谈到加密货币时&#xff0c;您在决定是否投资之前需要考虑几个关键因素。无论您是刚刚开始接触新的加密项目还是正在寻求扩展您的投资组合&#xff0c;拥有一个方便的加密项目评估框架都会很有帮助。 本文将解释一个分步框架&#xff0c;以帮助您评估各种加密项目。 您如何…

Kubernetes的ConfigMap

文章目录 环境概念配置pod使用ConfigMap创建ConfigMapkubectl create configmap目录文件自定义key值literal值 产生器&#xff08;generator&#xff09;文件自定义key值literal值 定义容器环境变量单个ConfigMap多个ConfigMap 配置ConfigMap里所有键值对为环境变量在pod命令里…

透明拼接屏在汽车领域的应用

随着科技的进步&#xff0c;透明拼接屏作为一种新型的显示技术&#xff0c;在汽车领域的应用越来越广泛。尼伽小编将围绕透明拼接屏在汽车本身、4S店、展会、工厂等方面的应用进行深入探讨&#xff0c;并展望未来的设计方向。 一、透明拼接屏在汽车本身的应用 车窗显示&#x…

JeecgBoot 3.6.1使用Online表单开发生成代码,如何定义自定义查询条件

一、使用Online表单生成代码&#xff0c;运行结果如下 二、如果我们想要加入一些筛选条件&#xff0c;例如用姓名查询 1.可在生成的前端代码中加入如下代码&#xff0c;文件为****data.ts //查询数据 export const searchFormSchema: FormSchema[] [ ];2.对如上代码进行编辑…

3D应用开发工具HOOPS引领数字化工厂浪潮:制造业转型的关键角色!

随着科技的迅猛发展&#xff0c;制造业正经历着数字化转型的浪潮。在这一变革的前沿&#xff0c;Tech Soft 3D 的 HOOPS技术正扮演着关键的角色。 本文将深入研究HOOPS技术如何在数字化工作流程中发挥作用&#xff0c;以及它是如何引领制造业朝着更高效、智能的未来迈进的。 …

【C语言进阶】预处理详解

引言 对预处理的相关知识进行详细的介绍 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 引言 预定义符号 #define定义常量 #define定义宏 带有副作用的宏参数 宏替换的规则 …

空气净化器or宠物空气净化器?五款猫用空气净化器优质推荐!

作为一个养猫家庭的主人&#xff0c;每天都要面对清理猫砂盘的挑战&#xff0c;这种令人难以形容的气味实在让人难以忍受。尤其是家里有小孩和老人&#xff0c;他们可能会出现过敏性鼻炎等问题&#xff0c;而抵抗力较差的人更容易受到影响。此外&#xff0c;换毛季节到来时&…

Qt 拖拽事件示例

一、引子 拖拽这个动作,在桌面应用程序中是非常实用和具有很友好的交互体验的。我们常见的譬如有,将文件拖拽到某个窗口打开,或者拖拽文件到指定位置上传;在绘图软件中,选中某个模板、并拖拽到画布上,画布上变回绘制该模板的图像… 诸如此类,数不胜数。 那么,在Qt中我…

【MySQL】最左匹配原则

最左匹配原则 0x1 简单说下什么是最左匹配原则 顾名思义&#xff1a;最左优先&#xff0c;以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like&#xff09;就会停止匹配。 例如&#xff1a;b 2 如果建立(a&#xff0c;b&#xff09;顺序…

远程桌面--虚拟机与主机的文件传输

注意&#xff1a; 确保VMware开头的服务全部在运行进入虚拟机打开文件管理器点击计算机右键选择属性在选择远程管理选择允许 1.winR 输入mstsc 2.输入虚拟机的ip地址 2.输入虚拟机的密码 上面的Administrator是虚拟机的用户名&#xff0c;有时会需要我们手动输入 3.验证…

MySQL连表操作之一对多

MySQL连表操作之一对多 目录 引入外键 Navicat创建外键使用外键SQL命令创建外键代码删除外键代码增加外键通过外键进行数据操作 正文 回到顶部 引入 当我们在数据库中创建表的时候&#xff0c;有可能某些列中值内容量很大&#xff0c;而且重复。 例子&#xff1a;创建一个…

基于SpringBoot Vue二手闲置物品交易系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…