STM32定时器定时及其应用

news2024/11/26 8:28:55

STM32定时器定时及其应用

  • 定时器概述
  • ☆定时器相关配置
  • CubeMX工程配置及程序实现
  • 固件库程序设计及实现

定时器概述

  • 1. 工作原理
    使用精准的时基,通过硬件的方式,实现定时功能。定时器核心就是计数器

  • 2. 定时器分类
      基本定时器(TIM6~TIM7)
      通用定时器(TIM2~TIM5)
      高级定时器(TIM1和TIM8)

    定时器类型主要功能
    基本定时器没有输入输出通道,常用作时基,即定时功能
    通用定时器具有多路独立通道,可用于输入捕获/输出比较,也可用作时基
    高级定时器除具备通用定时器所有功能外,还具备带死区控制的互补信号输出刹车输入等功能
  • 3. STM32F103C8T6资源

  • 4. 通用定时器介绍

    1. 16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。
    2. 16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的任意数值。
    3. 4 个独立通道(TIMx_CH1~4),这些通道可以用来作为:
       A.输入捕获
       B.输出比较
       C.PWM 生成(边缘或中间对齐模式)
       D.单脉冲模式输出
    4. 可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。
    5. 如下事件发生时产生中断/DMA:
       A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
       B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
       C.输入捕获
       D.输出比较
  • 5. 定时器计数模式

    计数模式计数器溢出值计数器重装值
    向上计数CNT = ARRCNT = 0
    向下计数CNT = 0CNT = ARR
    中心对齐计数CNT = ARR - 1CNT = ARR
    CNT = 1CNT = 0

在这里插入图片描述

  • 6. 定时器时钟源

    1. 时钟源:定时器时钟TIMxCLK,即内部时钟CK_INT,经APB预分频后分频提供
    2. 计数器时钟:定时器时钟经过PSC预分频器之后,即CK_CNT,用来驱动计数器计数。
    3. 计数器CNT:是一个16位/32的计数器
    4. 自动重装载寄存器:这里面装着的计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。
    5. 计数中断时间:1/(TIMxCLK/(PSC+1))*(ARR+1))
  • 7. 定时器溢出时间公式☆

    例如,要定时500ms,则:PSC=7199,ARR=4999,Tclk=72M

☆定时器相关配置

  • 使能时钟配置
  • 定时器参数配置
  • NVIC中断配置
  • 中断服务函数

CubeMX工程配置及程序实现

  • 时钟配置

    1. 采用外部高速晶振
    2. 时钟树配置
  • 定时器配置

    1. 开启定时器

    2. 参数设置

    3. 使能中断NVIC

  • 程序设计

    //初始化TIM2用于计时
    HAL_TIM_Base_Start_IT(&htim2);	
    
    //定时器中断服务程序
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
    		if( htim->Instance == TIM2)
    		{
    				HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
    		}
    }
    

固件库程序设计及实现

  • 使能时钟配置

    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	//初始化定时器时钟
    
  • 定时器结构体配置

    	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;	//定时器结构体定义
    	
    	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;	//不分频
    	TIM_TimeBaseStructure.TIM_Prescaler =  psc;				//设置预分频系数
    	TIM_TimeBaseStructure.TIM_Period = arr;					//设置自动重装载值
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;	//向上计数
    	TIM_TimeBaseInit( TIM2, &TIM_TimeBaseStructure );		//初始化结构体
    	TIM_ITConfig( TIM2, TIM_IT_Update,  ENABLE);			//使能中断 允许更新中断源
    	TIM_Cmd( TIM2, ENABLE);									//使能定时器2
    
  • NVIC中断配置

    	NVIC_InitTypeDef NVIC_InitStructure;	//NVIC结构体定义
    	
    	//NVIC初始化
    	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;		//中断通道 TIM2
    	NVIC_InitStructure.NVIC_IRQChannelCmd =  ENABLE;	//使能通道
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;	//抢占优先级
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//子优先级
    	NVIC_Init(&NVIC_InitStructure);						//初始化NVIC结构体
    
  • 定时器2初始化函数设计

    	void TIM2_Init(u16 psc, u16 arr)		//500ms
    	{
    		 
    		TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    		NVIC_InitTypeDef NVIC_InitStructure;
    		
    		RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	//初始化定时器时钟
    		//定时器初始化	
    		TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;	//不分频
    		TIM_TimeBaseStructure.TIM_Prescaler =  psc;
    		TIM_TimeBaseStructure.TIM_Period = arr;
    		TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    		TIM_TimeBaseInit( TIM2, &TIM_TimeBaseStructure );				//初始化结构体
    		TIM_ITConfig( TIM2, TIM_IT_Update,  ENABLE);					//使能中断 允许更新中断源
    		
    		//NVIC初始化
    		NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    		NVIC_InitStructure.NVIC_IRQChannelCmd =  ENABLE;
    		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    		NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    		NVIC_Init(&NVIC_InitStructure);
    		
    		TIM_Cmd( TIM2, ENABLE);																//使能定时器2
    	}
    
  • 中断服务函数

    //TIM2 中断服务函数
    void TIM2_IRQHandler(void)
    {
    	if( TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET )	 //中断标志位判断,确认进入中断
    	{
    		LED1 = !LED1;
    		TIM_ClearFlag(TIM2, TIM_IT_Update);		//清除中断标志位
    	}
    }
    

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

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

相关文章

SiameseNet实战中文文本匹配任务

引言 本文我们通过SiameseNet模型来完成中文文本匹配任务,其中包含了文本匹配任务一般套路,后续只需要修改实现的模型。 数据准备 数据准备包括 构建词表(Vocabulary)构建数据集(Dataset) 本次用的是LCQMC通用领域问题匹配数据集,它已经…

RK3568-android11-适配ov13850摄像头

硬件连接 主要分为两部分: mipi接口:传输摄像头数据 i2c接口:配置摄像头和对焦马达芯片寄存器相关驱动 |-- arch/arm64/boot/dts/rockchip DTS配置文件 |-- drivers/phy/rockchip/|-- phy-rockchip-mipi-rx.c mipi dphy 驱动 |-- drivers/media||-- platform/rockchip/isp1…

20230903-闹钟

app.cpp #include "app.h" #include "ui_app.h" int k1 true;APP::APP(QWidget *parent):QWidget(parent),ui(new Ui::APP) {ui->setupUi(this);this->resize(380,300);this->setStyleSheet("background-color:cyan;");//设置样式spe…

关于指针的一些练习(1)

1. int main() {int a[3][2] { (0,1),(2,3),(4,5) };int* p;p a[0];printf("%d", p[0]);return 0; } 解析:a是一个3行2列的二维数组,对他进行初始化时大括号里面是逗号表达式,根据逗号表达式可以得到a数组中元素为1&#xff0c…

知识图谱推理研究综述9.3

综述分类 根据样本量大小的不同,将知识图谱推理方法分为多样本推理、少样本推理和零与单样本推理 KG定义:(Y) 知识图谱是以图的形式表示真实世界的实体与关系之间关系的知识库。 具体来说知识图谱是通过将应用数学、图形学、信…

培训机构如何利用小程序提升服务质量

近年来,小程序成为了许多企业和机构进行线上业务拓展的新方式。对于培训机构来说,构建一个具有吸引力的小程序可以帮助他们更好地与学员进行互动和沟通,并提供更便捷的学习服务。那么,如何使用第三方制作平台来构建一个具有吸引力…

线性代数的学习和整理18:什么是维度,什么是秩?关于秩的各种定理 (未完成)

目录 1 矩阵的秩 矩阵的秩 2 求秩的方法 矩阵的维度秩 矩阵的维度 向量的模,矩阵的模-没有把,难道是面积? 矩阵的平直概念 5 矩阵的初等变换(矩阵等价概念的引出) 0 问题引出:什么是秩?…

UG\NX CAM二次开发 查询工序所在的几何组TAG UF_OPER_ask_geom_group

文章作者:代工 来源网站:NX CAM二次开发专栏 简介: UG\NX CAM二次开发 查询工序所在的几何组TAG UF_OPER_ask_geom_group 效果: 代码: void MyClass::do_it() { int count=0;tag_t * objects;UF_UI_ONT_ask_selected_nodes(&count, &objects);for (in…

第二章 USB应用笔记之USB通讯基础

第二章 USB应用笔记之USB主设备和从设备 文章目录 第二章 USB应用笔记之USB主设备和从设备1.连接 > 2.主机枚举USB设备 > 3.有效数据传输,功能控制1.连接检测USB系统主要包括USB主机和USB设备两种设备。USB拓扑结构USB连接检测全速D上拉1.5K电阻(高…

Kafka核心原理第二弹——更新中

架构原理 一、高吞吐机制:Batch打包、缓冲区、acks 1. Kafka Producer怎么把消息发送给Broker集群的? 需要指定把消息发送到哪个topic去 首先需要选择一个topic的分区,默认是轮询来负载均衡,但是如果指定了一个分区key&#x…

第五章 树与二叉树 六、树的存储结构

一、双亲表示法(顺序存储) 结点的指针指向父节点的位置 #define MAX_Tree_Size 100 //双亲表示法 typedef struct {int data;//数据域int parent;//双亲位置域 }PTNode;typedef struct { //树的定义PTNode nodes[MAX_Tree_Size]; //双亲表示int …

【Java实战项目】【超详细过程】—大饼的图片服务器2

代码操作数据库 pom.xml1.juit2.gson3.mysql依赖4.servlet DBUtil类Image类ImageDao类 本文主要讲述了用代码对数据库的操作,maven项目创建后进行如下操作: maven项目创建可以看这里:Servlet-day01 这里面有详细介绍 pom.xml pom.xml中放置了…

Vulnhub: Inferno: 1.1靶机

kali:192.168.111.111 靶机:192.168.111.233 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.23380端口目录爆破 gobuster dir -u http://192.168.111.233 -w /usr/share/wordlists/dirbuster/directory-list-2.3-me…

使用Docker配置深度学习的运行环境

文章目录 推荐实验环境前言docker安装docker操作docker配置常见方法(安装包、联网、程序管理器)安装驱动的前提要求传统方法安装驱动程序程序管理器安装联网安装deb包安装 安装完成后的设置非传统方法安装-通过容器安装驱动的前提要求安装NVIDIA-Contain…

UG\NX CAM二次开发 获取工序类型 UF_OPER_ask_oper_type

文章作者:代工 来源网站:NX CAM二次开发专栏 简介: UG\NX CAM二次开发 获取工序类型 UF_OPER_ask_oper_type 效果: 代码: void MyClass::do_it() { int count=0;tag_t * objects;UF_UI_ONT_ask_selected_nodes(&count, &objects);for (int i=0; i<co…

Kotlin语言基础(一)Kotlin语言特性

Kotlin语言概述&#xff08;一&#xff09;- 语言特性 Kotlin是一种高级强类型语言&#xff0c;可以在Java VM上运行。 它具有如下特性&#xff1a; 1.代码简洁&#xff0c;代码量少&#xff0c;易学易懂。 例如&#xff1a; /*** 定义数据类Student* property id String 学…

14. Loadrunner 详细介绍以及使用

目录 1. Loadrunner 环境搭建 2. Loadrunner 介绍 3. Loadrunner 三大组件之间的关系 4. Loadrunner 脚本录制 4.1 WebTours 项目 4.1.1 如何启动项目 4.1.2 如何访问项目 4.1.3 相关配置 4.2 脚本录制 4.3 脚本加强 4.3.1 插入事务 4.3.2 插入集合点 4.3.3 插入检…

Marin说PCB之TDK和Murata电容哪家强?

不是各位朋友是否听说华为新款手机MATE60Pro已经开始发布销售了&#xff0c;小编我听到这个消息后很是震惊啊&#xff0c;这两年老美一直打压我们中国芯片行业的发展&#xff0c;而且拿华为开刀&#xff0c;搞了一些很恶心的手段来限制和打压华为的发展。所以当我听到新款的MAT…

JavaScript基础代码

以下是一些 JavaScript 基础代码示例&#xff1a; 变量定义 // 定义字符串变量 var name "John";// 定义数字变量 var age 30;// 定义布尔变量 var isMarried false;控制语句 // if 语句 if (age > 18) {console.log("成年人"); } else {console.…

点云处理库Open3D基础操作1

文章目录 基础介绍Open3D读取文件Voxel降采样裁剪点云Open3D点云和numpy数组的转换点云的bounding box 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; 基础介绍 Open3D是英特尔公司于2015年发布的开源3D视觉算法库&#xff0c;截至2023年…