基本定时器---内/外部时钟中断
一、定时器的概念
定时器(TIM),可以对输入的时钟信号进行计数,并在计数值达到设定值的时候触发中断。
STM32的定时器系统有一个最为重要的结构是时基单元,它由一个16位计数器,预分频器,和自动重装寄存器构成。在时钟信号来临的时候,首先会由预分频器对该信号进行分流,使得一部分或者全部的信号进入计时器开始计数,当计数值达到自动重装寄存器的值时,由硬件触发中断,将中断信号递交给NVIC最后进入CPU运行中断服务函数。在72MHz的时钟下最大可以实现59.65s的定时。当然如果你觉得这个时间不够长,还可以利用STM32的定时器级联功能,将一个定时器的中断信号作为第二个定时器的时钟输入,这样定时时长可以呈现几何状的爆炸增长。
STM32的定时器不仅仅具有基本的定时中断功能,还包含了:内外时钟源选择、输入捕获(用于测量输入信号的脉冲长度)、输出比较(用于产生输出波形,如PWM(脉冲宽度调制))、编码器接口(适用于读取正交编码器的位置信息)、主从触发模式等多种功能。根据复杂度和应用场景,上述功能被划分到了高级定时器、通用定时器、基本定时器三个类型的定时器中。
二、简单看看定时器电路图
1.基本定时器
这里面有一个影子寄存器(方框下面有阴影的就是影子寄存器),它有助于确保定时器的准确性和同步性。
- 预装载寄存器是程序员可以直接访问和修改的寄存器。
- 影子寄存器是定时器内部实际使用的寄存器,它的值由预装载寄存器在特定条件下更新而来
- 影子寄存器的存在,使得我们在修改一个定时器的自动重装寄存器的值来控制定时时长的时候,不会立即生效,而是在当前时钟中断已经完成,到了更新事件/更新中断的节点才会被修改,这样就保证了定时器的准确性和同步性。
2.通用定时器
在这里,我们只需要着重关心上面框出来的部分即可,下面的其他功能之后会有所涉猎
3.高级定时器
高级定时器是在通用定时器的基础上增加了框图部分,大家可以先看看电路图,也是在之后会讲到
三、定时器的基本结构
上面我们已经看到了各种定时器的基本电路图,已经了解了其原理。下图是对上述的总结框图,我们只需要按照这个图就可以配置好。
- 打开定时器的时钟:
- 使用RCC_APB1PeriphClockCmd或RCC_APB2PeriphClockCmd函数打开相应的定时器资源。
- 配置时钟源:
- 将时钟资源设为内部时钟源或外部时钟源。
- 配置时基单元:
- 设置计数器模式(向上、向下或中央对齐)。
- 配置预分频器(PSC)和自动重装载寄存器(ARR)。
- 配置中断:
- 清除定时器更新标志位。
- 使能定时器的更新中断。
- 配置NVIC中断分组:
- 设置中断的优先级和使能中断线路。
- 使能定时器:
- 启动定时器开始运行。
四、示例代码
void TIM2_Init()
{//打开RCC的定时器2时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//设置TIM2为内部时钟TIM_InternalClockConfig(TIM2);//配置时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//不分频TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数TIM_TimeBaseInitStructure.TIM_Period = (10000 - 1); // 自动重装载值TIM_TimeBaseInitStructure.TIM_Prescaler = (7200 - 1); // 预分频值TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);//清除定时器标志位:因为配置好上面的定时器后,就被视作产生一次更新中断,//然后标志位就被置1了,如果不清除定时器就是从1开始定时TIM_ClearFlag(TIM2, TIM_FLAG_Update);//打开TIM2的中断输出控制TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//配置NVIC的分组和优先级NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure);//打开计数器,使能TIM2TIM_Cmd(TIM2, ENABLE);
}//中断服务函数
void TIM2_IRQHandler(void)
{//检测是否由TIM2产生的中断if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){//清除TIM2产生中断的标志位TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//处理过程number++;}
}
五、外部时钟代码
void Timer_Init(void)
{/*开启时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure); //将PA0引脚初始化为上拉输入/*外部时钟配置*/TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x0F);//选择外部时钟模式2,时钟从TIM_ETR引脚输入//注意TIM2的ETR引脚固定为PA0,无法随意更改//最后一个滤波器参数加到最大0x0F,可滤除时钟信号抖动/*时基单元初始化*/TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //定义结构体变量TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器模式,选择向上计数TIM_TimeBaseInitStructure.TIM_Period = 10 - 1; //计数周期,即ARR的值TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1; //预分频器,即PSC的值TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //重复计数器,高级定时器才会用到TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); //将结构体变量交给TIM_TimeBaseInit,配置TIM2的时基单元 /*中断输出配置*/TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清除定时器更新标志位//TIM_TimeBaseInit函数末尾,手动产生了更新事件//若不清除此标志位,则开启中断后,会立刻进入一次中断//如果不介意此问题,则不清除此标志位也可TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //开启TIM2的更新中断/*NVIC中断分组*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置NVIC为分组2//即抢占优先级范围:0~3,响应优先级范围:0~3//此分组配置在整个工程中仅需调用一次//若有多个中断,可以把此代码放在main函数内,while循环之前//若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置/*NVIC配置*/NVIC_InitTypeDef NVIC_InitStructure; //定义结构体变量NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //选择配置NVIC的TIM2线NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //指定NVIC线路使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //指定NVIC线路的抢占优先级为2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //指定NVIC线路的响应优先级为1NVIC_Init(&NVIC_InitStructure); //将结构体变量交给NVIC_Init,配置NVIC外设/*TIM使能*/TIM_Cmd(TIM2, ENABLE); //使能TIM2,定时器开始运行
}
外部时钟和内部时钟唯一的区别就是时钟的来源不同,不过配置都大同小异,只需要注意外部时钟是连接到哪一个GPIO口上的,然后把这个GPIO口配置成为上拉/下拉/浮空输入模式,并且把时钟设置为外部时钟即可
下图为时钟源的选择的不同
相关文章:
基本定时器---内/外部时钟中断
一、定时器的概念 定时器(TIM),可以对输入的时钟信号进行计数,并在计数值达到设定值的时候触发中断。 STM32的定时器系统有一个最为重要的结构是时基单元,它由一个16位计数器,预分频器,和自动重…...
实现了两种不同的图像处理和物体检测方法
这段代码实现了两种不同的图像处理和物体检测方法:一种是基于Canny边缘检测与轮廓分析的方法,另一种是使用TensorFlow加载预训练SSD(Single Shot Multibox Detector)模型进行物体检测。 1. Canny边缘检测与轮廓分析: …...
如何在MindMaster思维导图中制作PPT课件?
思维导图是一种利用色彩、图画、线条等图文并茂的形式,来帮助人们增强知识或者事件的记忆。因此,思维导图也被常用于教育领域,比如:教学课件、读书笔记、时间管理等等。那么,在MindMaster免费思维导图软件中࿰…...
ORIN NX 16G安装中文输入法
刷机版本为jetpack5.14.刷机之后预装了cuda、cudnn、opencv、tensorrt等,但是发现没有中文输入,所以记录一下安装流程。 jetson NX是arm64架构的,sougoupinyin只支持adm架构的,所以要选择安装Google pinyin 首先打开终端&#x…...
【金融风控项目-07】:业务规则挖掘案例
文章目录 1.规则挖掘简介2 规则挖掘案例2.1 案例背景2.2 规则挖掘流程2.3 特征衍生2.4 训练决策树模型2.5 利用结果划分分组 1.规则挖掘简介 两种常见的风险规避手段: AI模型规则 如何使用规则进行风控 **使用一系列逻辑判断(以往从职人员的经验)**对客户群体进行区…...
退款成功订阅消息点击后提示订单不存在
问题表现: 退款成功发送的小程序订阅消息点击进入后提示订单不存在。 修复方法: 1.打开文件app/services/message/notice/RoutineTemplateListService.php 2.找到方法sendOrderRefundSuccess 3.修改图中红圈内的链接地址 完整方法代码如下 /*** 订…...
实验一 顺序结构程序设计
《大学计算机﹣C语言版》实验报告 实验名称 实验一 顺序结构程序设计 实验目的 (1)掌握C语言中常量和变量的概念。 (2)掌握C语言中常见的数据类型。 (3)掌握C语言中变量的定义和赋值方法。 …...
Elasticsearch搜索流程及原理详解
Elasticsearch搜索流程及原理详解 1. Elasticsearch概述1.1 简介1.2 核心特性1.3 应用场景2. Elasticsearch搜索流程2.1 搜索请求的发起2.2 查询的执行2.3 结果的聚合与返回3. Elasticsearch原理详解3.1 倒排索引3.2 分布式架构3.3 写入流程3.4 读取流程4. 技术细节与操作流程4…...
芯片之殇——“零日漏洞”(文后附高通64款存在漏洞的芯片型号)
芯片之殇——“零日漏洞”(文后附高通64款存在漏洞的芯片型号) 本期是平台君和您分享的第113期内容 前一段时间,高通公司(Qualcomm)发布安全警告称,提供的60多款芯片潜在严重的“零日漏洞”,芯片安全再一次暴露在大众视野。 那什么是“零日漏洞”?平台君从网上找了一段…...
【gitlab】gitlabrunner部署
1、下载镜像 docker pull gitlab/gitlab-runner:latest 2、启动gitrunner容器 docker run -d --name gitlab-runner --restart always \ -v /root/gitrunner/config:/etc/gitlab-runner \ ///gitlab-runner的配置目录,挂载在宿主机上方便修改,里面有config.…...
Flink监控checkpoint
Flink的web界面提供了一个选项卡来监控作业的检查点。这些统计信息在任务终止后也可用。有四个选项卡可以显示关于检查点的信息:概述(Overview)、历史(History)、摘要(Summary)和配置(Configuration)。下面依次来看这几个选项。 Overview Tab Overview选项卡列出了以…...
Ribbon 入门实战指南
Ribbon 是 Netflix 开发的一个开源项目,用于实现客户端负载均衡功能。它在微服务架构中广泛使用,并且是 Spring Cloud 生态中的重要组成部分。本文将带你从基础入门,逐步掌握如何在 Spring Cloud 项目中使用 Ribbon 实现客户端负载均衡。 1 负…...
uniapp: 微信小程序包体积超过2M的优化方法(主包从2.7M优化到1.5M以内)
一、问题描述 在使用uniapp进行微信小程序开发时,经常会遇到包体积超过2M而无法上传: 二、解决方案 目前关于微信小程序分包大小有以下限制: 整个小程序所有分包大小不超过 30M(服务商代开发的小程序不超过 20M) 单个…...
【百日算法计划】:每日一题,见证成长(026)
题目 给定一个包含正整数、加()、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。 表达式仅包含非负整数,, - ,,/ 四种运算符和空格 。 整数除法仅保留整数部分。 * * 示例 1: 输入: “32X2” 输出: 7 import…...
【大模型】prompt实践总结
文章目录 怎么才算是好的prompt设计准则基本原则精炼原则(奥卡姆剃刀准则)具体原则真实操作技巧指定角色增加fewshots列表化代码化强调需求真实迭代大模型优化情形任务的定义和评估标准似乎可以再明确一下出现了一些之前没有考虑过的特殊情况,可以重新组织语言优化Prompt来处…...
在Qt(以及C++)中, 和 * 是两个至关重要的符号--【雨露均沾】
在Qt(以及C)中,& 和 * 是两个至关重要的符号,它们用于处理引用和指针。我们将逐个解释这两个符号,并提供简单示例来说明它们的用法。 1. 引用(&) 定义: 引用是一种别名,它不…...
本地部署Apache Answer搭建高效的知识型社区并一键发布到公网流程
文章目录 前言1. 本地安装Docker2. 本地部署Apache Answer2.1 设置语言选择简体中文2.2 配置数据库2.3 创建配置文件2.4 填写基本信息 3. 如何使用Apache Answer3.1 后台管理3.2 提问与回答3.3 查看主页回答情况 4. 公网远程访问本地 Apache Answer4.1 内网穿透工具安装4.2 创建…...
Ubuntu常见命令
关于export LD_LIBRARY_PATHcmake默认地址CMakelists.txt知识扩充/home:挂载新磁盘到 /home 子目录 关于export LD_LIBRARY_PATH 程序运行时默认的依赖库的位置包括lib, /usr/lib ,/usr/local/lib 通过命令export LD_LIBRARY_PATHdesired_path:$LD_LIBRARY_PATH追加…...
网络安全领域的最新动态和漏洞信息
网络安全领域的最新动态和漏洞信息涉及多个方面,以下是对这些信息的详细归纳: 一、网络安全领域最新动态世界互联网大会乌镇峰会召开2024年11月19日至22日,以“拥抱以人为本、智能向善的数字未来——携手构建网络空间命运共同体”为主题的202…...
华为开源自研AI框架昇思MindSpore应用案例:人体关键点检测模型Lite-HRNet
如果你对MindSpore感兴趣,可以关注昇思MindSpore社区 一、环境准备 1.进入ModelArts官网 云平台帮助用户快速创建和部署模型,管理全周期AI工作流,选择下面的云平台以开始使用昇思MindSpore,获取安装命令,安装MindSpo…...
每日OJ题_牛客_天使果冻_递推_C++_Java
目录 牛客_天使果冻_递推 题目解析 C代码 Java代码 牛客_天使果冻_递推 天使果冻 描述: 有 n 个果冻排成一排。第 i 个果冻的美味度是 ai。 天使非常喜欢吃果冻,但她想把最好吃的果冻留到最后收藏。天使想知道前 x个果冻中,美味…...
独立站干货:WordPress主机推荐
WordPress作为全球最受欢迎的独立站建设平台,提供了灵活性和强大的功能,使得建站变得简单而高效。本文将为您详细介绍WordPress建站的流程,并推荐几款实测后觉得好用的主机商。 WordPress建站流程 域名注册 首先需要注册一个域名,…...
支持多种快充协议和支持多种功能的诱骗取电协议芯片
汇铭达XSP15是一款应用于手持电动工具、智能家居、显示器、音箱等充电方案的大功率快充协议芯片,支持最大功率100W给设备快速充电,大大缩短了充电时间。芯片支持通过UART串口发送电压/电流消息供其它芯片读取。支持自动识别连接的是电脑或是充电器。支持…...
Android中常见内存泄漏的场景和解决方案
本文讲解Android 开发中常见内存泄漏场景及其解决方案,内容包括代码示例、原因分析以及最佳实践建议。 1. 静态变量导致的内存泄漏 静态变量的生命周期与应用进程一致,如果静态变量持有了对 Activity 或其他大对象的引用,就可能导致内存泄漏…...
MyBatis Plus中的@TableId注解
TableId 注解用于将某个成员变量指定为数据表主键,以下为使用示例: import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lo…...
java基础概念33:常见API-Objects工具类
一、使用场景 二、成员方法 2-1、equals方法 源码: 2-2、isNull方法、nonNull方法 三、小结...
脚手架vue-cli,webpack模板
先安装node.js,它是服务器端,用于给页面提供服务。前端学习不需要会node.js,只需要学会node.js衍生出来的npm命令即可。 npm 是node.js的一个工具,作用是进行包管理,npm是node.js的包管理器。 接着安装脚手架ÿ…...
什么是React Native?
写在前面 React Native (RN) 是一个由 Facebook 开发的开源框架,用于构建跨平台的移动应用程序。它允许开发者使用 JavaScript 和 React 来创建原生 iOS 和 Android 应用。RN 的出现极大地简化了移动应用的开发过程,使得开发者可以更快速、更高效地构建…...
Three.js LOD(Level of Detail)通过根据视距调整渲染细节的技术
在 Three.js 中,LOD(Level of Detail)技术是一种通过根据视距调整渲染细节的技术,旨在提高渲染性能并优化用户体验。LOD 技术尤其在处理复杂场景或高多边形模型时显得尤为重要。在这篇博客中,我们将详细介绍 LOD 的概念…...
Vulnhub靶场案例渗透[12]-Grotesque: 1.0.1
文章目录 一、靶场搭建1. 靶场描述2. 下载靶机环境3. 靶场搭建 二、渗透靶场1. 确定靶机IP2. 探测靶场开放端口及对应服务3. 目录扫描4. 敏感信息获取5. 反弹shell6. 权限提升 一、靶场搭建 1. 靶场描述 get flags difficulty: medium about vm: tested and exported from vi…...
资阳建设机械网站/360搜索引擎推广
1. TreeSet类概述: • 能够对元素按照某种规则进行排序。 • 或者根据创建set时提供的Comparator进行排序 • 具体取决于使用的构造方法 2. 代码示例: 1 package cn.itcast_05;2 3 import java.util.TreeSet;4 5 /*6 * TreeSet:能够对元素按…...
不用虚拟机可以做网站吗/百度统计网站
学习masterCAM的同时不利于同时学其它的软件 一:关于masterCAM之前及注意事项 1、每天给自己一个目标该学些什么内容。 2、当你要学习的时候请把QQ和所有聊天工具关啦,用100%的专心去学习。 3、在论坛里下的资料要去用心去看去学。切记整天泡论坛下资…...
国外的wordpress主题公园/seo网络推广是干嘛的
撰文:William M. Peaster编辑:南风以太坊是全球开放式应用的首要基础设施。不幸的是,由于以太坊的权衡,在高需求时期使用这个在不断发展的网络可能会非常昂贵和缓慢 -- 毕竟只有这么多的区块空间可供使用。尽管如此,以…...
中组部两学一做网站/百度搜索收录入口
位、字节、字、KB、MB 位:“位(bit)”是电子计算机中最小的数据单位。每一位的状态只能是0或1。 字节:8个二进制位构成1个“字节(Byte)”,它是存储空间的基本计量单位。1个字节可以储存1个英文字母或者半个汉字,换句话说…...
装修品牌排行榜前十名/西安seo关键词排名优化
课程简介《AndroidPHP最佳实践》系列是目前市面上唯一横跨Android手机客户端开发到PHP服务端开发,把手机互联网应用整套解决方案完全讲通的视频教程。本系列视频将目前最为火热的Android开发和同样火爆的PHP编程语言结合起来,并结合目前最流行的微博项目…...
苏州微网站制作/新型网络搜索引擎
最近约了几个互联网的朋友,他们也都在做公众号,交流了很多工作和面试经验,看了后觉得受益良多。强烈推荐给大家,一起学习,行动起来。社会的发展,行业的竞争,并不会因为我们的主观意愿而停止&…...