STM32 定时器中断

2023-11-15

通用定时器工作过程:
在这里插入图片描述
时钟选择:

计数器时钟可以由下列时钟源提供:

  • 内部时钟(CK_INT)
  • 外部时钟模式1:外部输入脚(TIx)
  • 外部时钟模式2:外部触发输入(ETR)
  • 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。

内部时钟选择
在这里插入图片描述
在这里插入图片描述
时钟计算方法:
在这里插入图片描述默认调用SystemInit函数情况下:
SYSCLK=72M
AHB时钟=72M
APB1时钟=36M
所以APB1的分频系数=AHB/APB1时钟=2
所以,通用定时器时钟CK_INT=2*36M=72M

计数器模式: 通用定时器可以向上计数、向下计数、向上向下双向计数模式。

  • 向下计数模式(时钟分频因子=1(意思就是:CK_PSC=CK_CNT))

在这里插入图片描述在这里插入图片描述

  • 向上计数模式(时钟分频因子=1)
    在这里插入图片描述
    在这里插入图片描述

  • 中央对齐计数模式(时钟分频因子=1 ARR=6)
    在这里插入图片描述
    在这里插入图片描述
    定时器中断实验相关寄存器:

  • 计数器当前值寄存器CNT
    在这里插入图片描述

  • 预分频寄存器TIMx_PSC

在这里插入图片描述

  • 自动重装载寄存器(TIMx_ARR)
    在这里插入图片描述
  • 控制寄存器1(TIMx_CR1)
    在这里插入图片描述
  • DMA中断使能寄存器(TIMx_DIER)
    在这里插入图片描述

常用库函数

定时器参数初始化:

 void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
ypedef struct
{
  uint16_t TIM_Prescaler;//预分频系数的设置      
  uint16_t TIM_CounterMode;//计数模式   
  uint16_t TIM_Period;//自动装载值
  uint16_t TIM_ClockDivision;//输入捕获会用到 
  uint8_t TIM_RepetitionCounter;//高级定时器会用到
} TIM_TimeBaseInitTypeDef; 
TIM_TimeBaseStructure.TIM_Period = 4999;
TIM_TimeBaseStructure.TIM_Prescaler =7199; 
TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1; 
TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up; 
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 

定时器使能函数:

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)

定时器中断使能函数:

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);

状态标志位获取和清除:

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);

定时器中断实现步骤:

  • 能定时器时钟。
 RCC_APB1PeriphClockCmd();
  • 初始化定时器,配置ARR,PSC。
 TIM_TimeBaseInit();
  • 开启定时器中断,配置NVIC。
void TIM_ITConfig();
      NVIC_Init();
  • 使能定时器。
TIM_Cmd();
  • 编写中断服务函数。
TIMx_IRQHandler();//中断函数要判断中断标志位,和手动清除中断标志位
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

Tout(溢出时间)=(ARR+1)(PSC+1)/Tclk

其中arr为你重装的值,

psc是预分频计时器的值(预分频系数),

Tclk是时钟频率

Tclk/(psc+1)是定时器的时钟

(psc+1))/Tclk*1是计算的计数器 减少/增加 一个数所用的时间;

那么(psc+1))/Tclk*(arr+1)就是一次定时器的时间:

然后继续重装arr再次计数,计时:

就构成一个循环;

  • TIM2-TIM5的时钟不是直接来自于APB1,而是来自于输入为APB1的一个倍频器。这个倍频器的作用是:当APB1的预分频系数为1时,这个倍频器不起作用,当APB1的预分频系数为其他数值时(即预分频系数为2、4、8或16),这个倍频器起作用,定时器的时钟频率等于APB1的频率的2倍。
  • 分频系数就是对定时器时钟进行多少分频之后在使用,最好设置为定时器时钟的倍数,方便运算;重新装载值是计算这么多值,时间到了之后重新开始计算的值,每一次计数的时间为分频之后时钟的到时;

假设定时器时钟为72M,分频系数设置为7200-1,那现在定时器的时钟为10kHz,每计一个数花费1/(10000)秒,重装值设置为5000-1,那一次溢出的时间为500ms。
分频值是是指你将系统时钟的频率减小,假设时钟频率是 72Mhz,然后分频值是 7199,现在你的定时器值就是 10kHz,表示每计一个数,然后过了 1/(10^4)秒,然后你的重装值就是你的时间了,如果值是 9999,就表示定时时间为 1s。

定时器配置代码:

void TIM4_Init(u16 ar,u16 rs)
{
	TIM_TimeBaseInitTypeDef TIM_InitStrue;
	NVIC_InitTypeDef NVIC_InitStrue;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能定时器时钟
	
	TIM_InitStrue.TIM_Period=ar;//自动装载值
	TIM_InitStrue.TIM_Prescaler=rs;//预分频系数的设置
	TIM_InitStrue.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_InitStrue.TIM_ClockDivision=TIM_CKD_DIV1;//设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseInit(TIM4,&TIM_InitStrue);//初始化定时器,对定时器进行配置
	
	TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);//开启定时器中断
	
	NVIC_InitStrue.NVIC_IRQChannel=TIM4_IRQn;
	NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=2;
	NVIC_InitStrue.NVIC_IRQChannelSubPriority=2;
	NVIC_Init(&NVIC_InitStrue);//初始化中断,设置中断的优先级

	TIM_Cmd(TIM4,ENABLE);//使能定时器
}

void TIM4_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET)
	{
		LED1=!LED1;
		TIM_ClearITPendingBit(TIM4,TIM_IT_Update);//清除中断标志位
	}
}	

实验现象:LED0闪烁,时间间隔就是定时器的溢出时间

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 定时器中断 的相关文章

  • 论文笔记——HRFormer

    摘要 本文提出了一种高分辨率Transformer HRFomer 它在密集的预测任务中学习高分辨率表示 而原来的Vison Transformer则产生低分辨率表示 具有高内存和计算成本 作者利用了高分辨率卷积网络 HRNet 中引入的多
  • C#基础(字符串拼接)

    字符串拼接方式1 之前的算术运算符 只是用来数值类型变量进行数学运算的 而 string 不存在算术运算符 不能计算 但是可以通过 号来进行字符串拼接 用 号来进行字符串拼接 str str 456 复合运算符 str 1 4 true s
  • 群晖虚拟机部署线上恋爱网站

    文章目录 前言 1 安装网页运行环境 1 1 安装php 1 2 安装webstation 2 下载网页源码文件 2 1 访问网站地址并下载压缩包 2 2 解压并上传至群辉NAS 3 配置webstation 3 1 配置网页服务 3 2
  • 关于电子设计大赛

    一年一度的电子设计大赛选拔赛开始了 作为参加两年的选手还是很有感悟 下面我简单从电赛是什么和经验教训谈论一下 电赛全称全国大学生电子设计大赛 它国赛和省赛交叉进行 是衡量大学生电子设计能力的重要平台 也是用人单位评价别人的基础之一 比赛时间
  • SpringBoot接收前端参数json格式的五种方式

    import java util List import java util Map import org springframework web bind annotation RequestBody import org springf
  • 游戏开发 - 开发流程 - 收集

    1 应用场景 主要用于了解 掌握游戏开发的整个流程 2 学习 操作 1 文档阅读 复习课 带你梳理客户端开发的三个重点 极客时间 2 整理输出 2 1 游戏开发流程 参考 按照游戏开发中的三大模块策划 程序 美术 画了一个图 开发游戏的时候
  • 今天遇到了个问题我本想测试一下Java连接一下redis的,结果。。。。。。

    一开始写好了java程序结果idea连接云服务器上的redis报错 Failed to connect to any host resolved for DNS name 期初我以为是我的Jedis有问题或者是redis conf配置又或者
  • 人工智能数学基础:泰勒(Taylor)公式

    一 引言 对于一些较复杂的函数 为了便于研究 往往希望用一些简单的函数来近似表达 例如 当x gt 0时 sinx arcsinx tanx arctanx ln 1 x ex 1 x 由于用多项式表示的函数 只要对自变量进行有限次加 减
  • STM32发送单极性归零码驱动WS2812(二)

    STM32发送单极性归零码驱动WS2812 二 形容我的心情 二 旧事 重提 时间匆匆过去 也到了该着手准备毕业设计的阶段了 我早早就向老师确定了选题 我想做一个智能灯光控制系统 在灯光选型的问题上 我又想到了几个月前令我头疼好长时间的WS
  • 那些令人惊叹的 HTML、CSS、JavaScript 工具和库

    前端开发很奇妙 它入门很简单 但是想要成为大牛却很难 有太多的事情需要考虑 到处都有需要微调的地方 太多的细节处理才能保证让一切都刚刚好 幸运的是 开发者和设计师一直致力于为我们提供有用的工具和资源 来提高我们的技能 让我们做的更好 所以今
  • Linux安装Phantomjs

    PhantomJS是一个可编程的无头浏览器 无头浏览器 一个完整的浏览器内核 包括js解析引擎 渲染引擎 请求处理等 但是不包括显示和用户交互页面的浏览器 1 页面自动化测试 希望自动的登陆网站并做一些操作然后检查结果是否正常 2 网页监控
  • 机器学习中的流形学习算法 Manifold Learning

    1 流形学习概述 流形学习manifold learning 于2000年在Science杂志上首次提出 是一大类基于流形的框架 是机器学习 模式识别中的一种方法 在维数约简 降维 方面具有广泛的应用 它的主要思想是将高维的数据映射到低维
  • 最新视频/图集去水印/步数/王者战力/红包封面等小程序源码带流量主【源码+教程】

    免服务器域名 已测试 上传即可用带流量主功能 这套源码目前没在网上看到过几次 源码内附带教程 去水印支持快手抖音视频 图集其他平台自测 下载地址 最新视频 图集去水印 步数 王者战力 红包封面等小程序源码带流量主 源码 教程
  • tftp+Filezilla文件双向传输(1)-centos(VMware)-win10(host)

    目录 1 下载安装vsftpd tftp tftp server 2 配置服务 2 1 配置服务 修改文件 etc vsftpd conf 2 2 配置服务 守护进程 etc xinetd d tftp 2 3 配置服务 tftp服务器 2
  • 微信小程序的websocket使用stomp协议--简单实用的npm包

    需求背景 在公司实习期间 要求做一个小程序的websocket连接 用于设备的实时控制和状态查询 其中后端使用的是stomp协议 而微信小程序是不支持stomp协议的 但是当我知道的时候 后端已经全部调好只等我接入了 由于小程序的心跳机制和
  • BST插入(建立)、删除、查找和排序

    实验要求 设计BST 的左右链存储结构 并实现BST插入 建立 删除 查找和排序算法 实现折半查找算法 实验比较 设计并产生实验测试数据 考察比较两种查找方法的时间性能 并与理论结果进行比较 以下具体做法可作为参考 第1组测试数据 n 10
  • 关系代数的自然连接符号_数学——符号推演的艺术

    数学离不开各式各样的符号 数字如2 0 1 8 运算符如 等号 不等号 都是最常见的数学符号 其他语义复杂一些的数学符号有 sin 等等 这些有趣的符号可以用来表示各种具体或者抽象的数学概念 包括数学对象以及数学对象之间的相互关系 而数学活
  • 一、Linux命令行使用技巧

    一 Linux命令行使用技巧 1 新建笔记本 命令 lt gedit gt lt 空格 gt lt 文件名 gt 2 什么是Linux 操作系统 内核 kernel 相当于人的大脑 3 计算机五大组件 计算器 寄存器 控制器 输入设备 输出
  • 三进制计算机_计算机产业有望进入三进制时代:韩国研发出三进制半导体

    韩国一科研团队成功在大尺寸晶圆上实现了更节能的三元金属氧化物半导体 我们知道通常计算机是由一个个逻辑电路组成的 而逻辑电路一般只有接通和断开两种状态 所以计算机中的数据都是以二进制形式存在的 本质上来说计算机就是0和1 最早将二进制这一理念

随机推荐

  • javascript中mouseover和mouseout事件详解

    原文链接 http blog sina com cn s blog 468530a60101awlw html 与 mouseenter 事件不同 不论鼠标指针穿过被选元素或其子元素 都会触发 mouseover 事件 只有在鼠标指针穿过被
  • WIN10家庭版虚拟机启动蓝屏问题

    关于在WIN10家庭版系统上安装VMware workstation每次启动虚拟机 主机就会出现蓝屏得问题 在刚安装好得时候 启动并没有出现蓝屏 但是使用了几次以后蓝屏几乎每次都会出现 网上查了一下发现好多网友也都遇到得了类似得问题 但是每
  • python绘制qq图_Python中作QQ图(quantilequantile Plot)

    Q Q图主要可以用来回答这些问题 两组数据是否来自同一分布 PS 当然也可以用KS检验 利用python中scipy stats ks 2samp函数可以获得差值KS statistic和P值从而实现判断 两组数据的尺度范围是否一致 两组数
  • HighChar 详解-双Y轴-及各

    网上的例子 数据都是写死的 有点不实用吧 我在这里举一个 展示功能需求的数据 按需从数据库获取并画图展示 本例子结合 angular js 其他前台框架同理 从后台获取数据即可 1 首先要引入Jquery JS 再引入相关highChar
  • 上升子序列用C语言编写,最长上升子序列(C语言 动态规划)

    描述 一个数的序列bi 当b1 lt b2 lt lt bS的时候 我们称这个序列是上升的 对于给定的一个序列 a1 a2 aN 我们可以得到一些上升的子序列 ai1 ai2 aiK 这里1 i1 lt i2 lt lt iK N 比如 对
  • 在html中写的css没效果,css样式不起作用是什么原因?

    在写页面时 有时会发现自己写的css样式无法生效 我们该如何排查css样式无法生效 常见的css样式不起作用的原因有哪些呢 下面我们就来看一下css样式不起作用的原因 排查css样式不起作用的方法步骤 首先 先试一下清除缓存 重启浏览器等手
  • 用 Python 制作一个艺术签名小工具,给自己设计一个优雅的签名

    生活中有很多场景都需要我们签字 签名 如果是一些不重要的场景 我们的签名好坏基本无所谓了 但如果是一些比较重要的场景 如果我们的签名比较差的话 就有可能给别人留下不太好的印象了 俗话说字如其人嘛 本文我们使用 Python 来制作一个艺术签
  • 逐行扫描型Memory LCD显存管理与emWin移植

    因为Memory LCD 的特性 不能设置像素坐标 只能用缓存整体刷新 所以对于Memory LCD来说 emWin移植仅与打点函数有关 这里用Sharp Memory LCD ls013b7dh03 作为实例 LCD的显存 逐行扫描 存放
  • 缓存记录

    1 我们在项目中使用缓存通常都是先检查缓存中是否存在 如果存在直接返回缓存内容 如果不存在就直接查询数据库然后再缓存查询结果返回 这个时候如果我们查询的某一个数据在缓存中一直不存在 就会造成每一次请求都查询DB 这样缓存就失去了意义 在流量
  • 简述锂离子电池的分类及结构

    锂离子电池按所用电解质材料的不同 可分为液态锂离子电池 LIB 和聚合物锂离子电池 PLB 两类 锂电池按工作环境分 高温锂离子电池 低温锂离子电池 常温锂离子电池 按电解质状态分 液态锂离子电池 凝胶锂离子电池固态锂离子电池 按形状分 方
  • uniapp实现横向滚动

  • 【软考】【系统架构设计师】决策论知识点

    1 概念 决策 一词来源于英语Decision Analysis 直译为 做出决定 所谓决策 就是为了实现预定的目标在若干可供选择的方案中 选出一个最佳行动方案的过程 它是一门帮助人们科学地决策的理论 也是管理者识别并解决问题及利用机会的过
  • SQLMAP脚本-sql-labs-Less-26-27a

    testtest sqli labs less 26 and less 26a 观察后端代码 发现空格 or and以及注释符 和 都没了 or and用双写 注释使用 00 空格用 09 0A 0B 0D 20 编写sqlmap脚本命名为
  • PHP运行模式

    PHP运行模式有4钟 1 cgi 通用网关接口 Common Gateway Interface 2 fast cgi 常驻 long live 型的 CGI 3 cli 命令行运行 Command Line Interface 4 web
  • centOS7 安装docker

    centOS7 安装docker centOS7 先更新yum 更新yum sudo yum update 下载必须 yum utils device mapper persistent data lvm2 sudo yum install
  • 本地Docker镜像发布到阿里云的Docker Hub

    1 配置镜像加速器 参考https my oschina net u 182501 blog 1549194 2 命名空间管理 进入https cr console aliyun com namespace index 3 创建镜像仓库 h
  • Java源文件注释

    关于java源程序当中的注释 什么是注释 注释的作用是什么 出现在java的源程序当中 对java源代码的解释说明 注释不会被编译到 class字节码文件当中 一个好的开发习惯应该是多编写注释 这样程序的可读性比较强 java中的注释怎么写
  • C++ 多态 超详细讲解

    文章目录 多态概念引入 1 C 中多态的实现 1 1 多态的构成条件 1 2 虚函数 1 3虚函数的重写 1 4 C 11 override final 1 5 重载 覆盖 重写 重定义 隐藏 2 抽象类 2 1 抽象类的概念 2 2 接口
  • MySQL第四讲 MySql Undo日志 - 对聚簇索引进行CUD操作

    事务需要保证原子性 如果在事务执行过程中出现以下情况 就需要用到undo log 1 事务执行中遇到各种错误 比如服务器本身的错误 操作系统错误甚至是断电导致的错误 2 事务在执行过程手动rollback结束当前事务 每当对一条记录进行改动
  • STM32 定时器中断

    通用定时器工作过程 时钟选择 计数器时钟可以由下列时钟源提供 内部时钟 CK INT 外部时钟模式1 外部输入脚 TIx 外部时钟模式2 外部触发输入 ETR 内部触发输入 ITRx 使用一个定时器作为另一个定时器的预分频器 如可以配置一个