STM32TIM定时器(1)

news2024/11/26 4:47:26

文章目录

  • 前言
  • 一、介绍部分
    • TIM简介
    • 了解定时器类型
      • 基本定时器框图
      • 通用定时器框图
      • 高级定时器框图
      • 定时器级联关系
    • 所需简化定时器中断流程图
    • 时序部分
      • 预分频器时序
      • 计数器时序
        • 无影子寄存器计数器时序
        • 有影子寄存器计数器时序
    • 时钟树
  • 二、实例部分
    • 使用定时器计数
    • 使用对射红外传感器来控制计数器
      • 电路连接
      • 代码部分
  • 总结
    • 所使用函数总结
    • NVIC分组与优先级分配的关系


前言

简介STM32的定时器,主要连接通用定时器的用法,了解定时器中断的原理,以及如何基础的利用定时器中断


一、介绍部分

TIM简介

在这里插入图片描述

了解定时器类型

注意定时器的编号以及所在总线

在这里插入图片描述

基本定时器框图

计数器加到阈值选择中断会进入NVIC(即框图的向上的箭头),称更新中断,向下的箭头表示产生一个新的事件,触发内部其他电路工作,而不是进入中断,称更新事件。

在这里插入图片描述
主模式触发DAC:即通过更新时间,映射到TRGO,这样就可以不需要频繁中断来输出波形

通用定时器框图

在这里插入图片描述
基本定时器计数器只有向上计数
通用和高级定时器计数器有三种方法如下图:
在这里插入图片描述

高级定时器框图

在这里插入图片描述

定时器级联关系

在这里插入图片描述

所需简化定时器中断流程图

在这里插入图片描述

时序部分

预分频器时序

在这里插入图片描述

计数器时序

在这里插入图片描述

无影子寄存器计数器时序

在这里插入图片描述

有影子寄存器计数器时序

在这里插入图片描述

时钟树

在这里插入图片描述

二、实例部分

使用定时器计数

硬件电路只需连接STM32最小电路与OLED即可
封装定时器初始化函数Timer.c内容如下:

#include "stm32f10x.h"                  // Device header

void Timer_Init(void){
	// 初始化时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	// 使用内部时钟(默认)
	TIM_InternalClockConfig(TIM2);
	// 配置事间基础(时基单元)
	TIM_TimeBaseInitTypeDef TIM_InitStructure;
	// 时钟分频
	TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	// 计算模式
	TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	// 重载值(有1的偏差)<计数值> 10000/10000=1
	TIM_InitStructure.TIM_Period = 10000-1;
	// 预分频(有1的偏差)<频率> 72000000/7200=10000
	TIM_InitStructure.TIM_Prescaler = 7200-1;
	// 重复计数器(不使用)
	TIM_InitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2,&TIM_InitStructure);
	
	// 由于时基初始化后会立即进入中断一次,提前清除以下标志位
	TIM_ClearFlag(TIM2,TIM_IT_Update);
	
	// 中断使能,更新中断到NVIC
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	
	// NVIC分组
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	// 初始化NVIC
	NVIC_InitTypeDef NVIC_InitStructure;
	// 中断通道
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
	// 中断通道使能
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	// 抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	// 响应优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
	NVIC_Init(&NVIC_InitStructure);
	
	// 启动定时器
	TIM_Cmd(TIM2,ENABLE);
}

uint16_t Num;

uint16_t GetNum(void){
	return Num;
}

//中断函数
void TIM2_IRQHandler(void){
	// 获取中断标志位
	if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET){
		Num++;
		// 清除标志位
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}

主函数逻辑main.c内容如下:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"


int main(void)
{
	OLED_Init();
	Timer_Init();
	OLED_ShowString(1,1,"Num:");
	while (1)
	{
		OLED_ShowNum(2,1,GetNum(),4);
		// 查看计数器的变化
		OLED_ShowNum(3,1,TIM_GetCounter(TIM2),4);
	}
}

使用对射红外传感器来控制计数器

红外传感器每产生10次上升沿即Num+1

电路连接

在这里插入图片描述

代码部分

封装定时器内容Timer.c

#include "stm32f10x.h"                  // Device header

void Timer_Init(void){
	// 初始化时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	// 红外传感器所在引脚
	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);
	
	// 使用外部时钟模式2,不分频,中断方式,滤波
	/*
		@arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active.
        @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active.
	*/
	// 使用红外传感器的上升沿作为计数器+1
	TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x0f);
	
	// 配置事间基础(时基单元)
	TIM_TimeBaseInitTypeDef TIM_InitStructure;
	// 时钟分频
	TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	// 计算模式
	TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	// 重载值(有1的偏差)<计数值>
	TIM_InitStructure.TIM_Period = 9-1;
	// 预分频(有1的偏差)<频率>
	TIM_InitStructure.TIM_Prescaler = 1-1;
	// 重复计数器(不使用)
	TIM_InitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2,&TIM_InitStructure);
	
	// 由于时基初始化后会立即进入中断一次,提前清除以下标志位
	TIM_ClearFlag(TIM2,TIM_IT_Update);
	
	// 中断使能,更新中断到NVIC
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	
	// NVIC分组
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	// 初始化NVIC
	NVIC_InitTypeDef NVIC_InitStructure;
	// 中断通道
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
	// 中断通道使能
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	// 抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	// 响应优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
	NVIC_Init(&NVIC_InitStructure);
	
	// 启动定时器
	TIM_Cmd(TIM2,ENABLE);
}

uint16_t Num;

uint16_t GetNum(void){
	return Num;
}

//中断函数
void TIM2_IRQHandler(void){
	// 获取中断标志位
	if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET){
		Num++;
		// 清除标志位
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}

主函数main.c内容:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"


int main(void)
{
	OLED_Init();
	Timer_Init();
	OLED_ShowString(1,1,"Num:");
	OLED_ShowString(2,1,"CNT:");
	while (1)
	{
		OLED_ShowNum(1,6,GetNum(),4);
		// 查看计数器的变化
		OLED_ShowNum(2,6,TIM_GetCounter(TIM2),4);
	}
}


总结

所使用函数总结

// 时钟初始化(时钟分频、计数模式、重载值、分频值、重复计数器值)
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
// 启动定时器
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
// 设置外部定时器模式2
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, 
                             uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
//  使中断更新到NVIC                          
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
// 获取定时器计数器的值
uint16_t TIM_GetCounter(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);

NVIC分组与优先级分配的关系

在这里插入图片描述

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

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

相关文章

清华系面壁MiniCPM:国产AI模型新突破,2B小钢炮成本效率双优

前言 在人工智能的快速发展中&#xff0c;模型的规模和性能成为衡量先进技术的关键指标。最近&#xff0c;清华系创业团队面壁智能发布的面壁MiniCPM模型&#xff0c;以其2B&#xff08;24亿&#xff09;参数的“小钢炮”身份&#xff0c;成功挑战了70亿参数的国际大模型Mistr…

开关电源学习之Buck电路

一、引言 观察上方的电路&#xff0c;当开关闭合到A点时&#xff0c;电流流过电感线圈&#xff0c;形成阻碍电流流过的磁场&#xff0c;即产生相反的电动势&#xff1b;电感L被充磁&#xff0c;流经电感的电流线性增加&#xff0c;在电感未饱和前&#xff0c;电流线性增加&…

k8s-常用工作负载控制器(更高级管理Pod)

一、工作负载控制器是什么&#xff1f; 二、Deploymennt控制器&#xff1a;介绍与部署应用 部署 三、Deployment控制器&#xff1a;滚动升级、零停机 方式一&#xff1a; 通个加入健康检查可以&#xff0c;看到&#xff0c;nginx容器逐个被替代&#xff0c;最终每个都升级完成&…

Dell服务器iDRAC9忘记密码, 通过RACADM工具不重启 重置密码

系列文章目录 文章目录 系列文章目录前言一、RACADM工具二、linux环境1.解压安装RACADM工具测试RACADM工具重置iDRAC密码 Windows环境 前言 一、RACADM工具 RACADM工具 官网参考信息 https://www.dell.com/support/kbdoc/zh-cn/000126703/%E5%A6%82%E4%BD%95-%E9%87%8D%E7%BD…

钉钉群机器人-发送群消息

1、钉钉群创建机器人 添加完成后&#xff0c;要记住 Webhook 路径&#xff1b; 2、机器人接入文档网址 自定义机器人接入 - 钉钉开放平台 3、JAVA代码 import com.dingtalk.api.DefaultDingTalkClient; import com.dingtalk.api.DingTalkClient; import com.dingtalk.api.re…

[SWPUCTF 2021 新生赛]easyupload1.0

发现是上传文件第一想到是文件木马 <?php eval ($_POST[123]);?>木马上传burp修改后缀发现flag里面这个是假的 我们猜想是在phpinfo我们上传<?php eval(phpinfo(););?>木马上传burp修改后缀里面 CtrlF 发现flag

Java技术栈 —— Hive与HBase

Java技术栈 —— Hive与HBase 一、 什么是Hive与HBase二、如何使用Hive与HBase&#xff1f;2.1 Hive2.1.1 安装2.1.2 使用2.1.2.1 使用前准备2.1.2.2 开始使用hive 2.2 HBase2.2.1 安装2.2.2 使用 三、Apache基金会 一、 什么是Hive与HBase 见参考文章。 一、参考文章或视频链…

2024.2.4 模拟实现 RabbitMQ —— 实现核心类

目录 引言 创建 Spring Boot 项目 编写 Exchange 实体类 编写 Queue 实体类 编写 Binding 实体类 编写 Message 实体类 引言 上图为模块设计图 此处实现核心类为了简便&#xff0c;我们引用 Lombok&#xff08;可点击下方链接了解 Lombok 的使用&#xff09; IDEA 配置 L…

滑动列表(scroll view)

使用scroll view实现单行滑动列表。 只需要横向滑动&#xff0c;取消Scroll Rect的Vertical&#xff0c;并取消掉Scrollbar。 为Content添加两个组件 Grid Layout Group设置子节点布局 Content Size Fitter自适应Content大小 Padding:子节点与边界的距离。 Cell Size:子节点…

NLP_语言模型的雏形N-Gram

文章目录 N-Gram 模型1.将给定的文本分割成连续的N个词的组合(N-Gram)2.统计每个N-Gram在文本中出现的次数&#xff0c;也就是词频3.为了得到一个词在给定上下文中出现的概率&#xff0c;我们可以利用条件概率公式计算。具体来讲&#xff0c;就是计算给定前N-1个词时&#xff0…

DFS——连通性和搜索顺序

dfs的搜索是基于栈&#xff0c;但一般可以用用递归实现&#xff0c;实际上用的是系统栈。有内部搜索和外部搜索两种&#xff0c;内部搜索是在图的内部&#xff0c;内部搜索一般基于连通性&#xff0c;从一个点转移到另一个点&#xff0c;或者判断是否连通之类的问题&#xff0c…

Github开源项目Excalidraw:简洁易用的手绘风格白板工具

Excalidraw是Github上的一个开源项目&#xff0c;它提供了一个简洁易用的手绘图形创建工具&#xff0c;用户可以通过它创建流程图、示意图、架构图和其他各种图形。本文将介绍Excalidraw的特点和功能&#xff0c;并探讨其在技术层面上的优势和扩展能力。 GitHub地址&#xff1a…

android inset 管理

目录 简介 Insets管理架构 Insets相关类图 app侧的类 WMS侧的类 inset show的流程 接口 流程 WMS侧确定InsetsSourceControl的流程 两个问题 窗口显示时不改变现有的inset状态 全屏窗口上的dialog 不显示statusbar问题 View 和 DecorView 设置insets信息 输入法显…

通讯基本概念

通信的方式有多种&#xff0c;按数据传输方式可分为串行通讯和并行通信&#xff1b;按通信数据同步方式可分为同步通信和异步通信&#xff1b;按数据通信的方向可分为 一、串行通信和并行通信 串行通信&#xff1a;设备之间通过少量的数据信号线&#xff08;一般是8根以下&am…

Windows自动化实现:系统通知和任务栏图标自定义

文章目录 Windows自动化的三个小工具系统通知任务栏图标使用pystray实现使用infi.systray实现 Windows自动化的三个小工具 系统通知 import win10toastwin10toast.ToastNotifier().show_toast("eee", "休息一下", icon_path"icon.ico", durati…

scikit-learn 1.3.X 版本 bug - F1 分数计算错误

如果您正在使用 scikit-learn 1.3.X 版本&#xff0c;在使用 f1_score() 或 classification_report() 函数时&#xff0c;如果参数设置为 zero_division1.0 或 zero_divisionnp.nan&#xff0c;那么函数的输出结果可能会出错。错误的范围可能高达 100%&#xff0c;具体取决于数…

第十三篇【传奇开心果系列】Python的OpenCV库技术点案例示例:光流估计

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例:光流估计短博文目录前言一、光流估计介绍二、Lucas-Kanade光流介绍和示例代码三、Horn-Schunck光流介绍和示例代码四、cv::calcOpticalFlowPyrLK()函数实现光流估计介绍和示例代码五、光流估计用于运动分析…

shell——2月3日总结

操作系统有什么用&#xff1f; 操作系统是计算机系统中的核心软件&#xff0c;负责管理和协调计算机的硬件和软件资源&#xff0c;提供用户界面&#xff0c;并执行用户程序。 硬件管理&#xff1a;操作系统管理计算机的硬件资源&#xff0c;包括处理器、内存、磁盘、外部设备等…

MySQL原理(一)架构组成之逻辑模块(2)缓存机制

前面提到了mysql的逻辑模块中包含Query Cache 。 一、查询缓存 1、作用 MySQL查询缓存即缓存查询数据的SQL文本及查询结果,用Key-Value的形式保存在服务器内存中。当查询命中缓存,MySQL会立刻返回结果,跳过了解析,优化和执行阶段。 2、查询缓存的命中条件 &#xff08;1&a…

基于ChatGLM.cpp实现低成本对ChatGLM3-6B的量化加速

文章目录 1. 参考2. ChatGLM3 介绍3. 本地运行3.1 硬件配置3.2 下载ChatGLM3代码3.3 量化模型3.4 编译和运行3.4.1 编译3.4.12 运行 4. python绑定4.1 安装4.2 使用预先转换的 GGML 模型 总结 前面两章分别有讲到基于MacBook Pro M1芯片运行chatglm2-6b大模型和如何在本地部署c…