STM32(F103ZET6)第六课:定时器

news2024/9/24 19:14:37

目录

  • 定时器需求
    • 一、系统滴答定时器
      • 1.配置流程
      • 2.程序配置
    • 二、基本定时器
      • 1.TIM6定时器配置
        • 1.时钟源使能
        • 2.分频器
        • 3.装载值
        • 4.计数器使能
        • 5.打开定时器中断并配置
        • 6.中断函数编写
      • 三、通用定时器
        • TIM2

定时器需求

1.使用系统滴答定时器实现LED灯的翻转(0.5s翻转一次)。
2.实现定时器6的定时功能,让LED2以500ms一次的频率闪烁。
3.配置定时器2,实现一个1s的定时功能(到时间LED4翻转)。

一、系统滴答定时器

STM32里面有几个定时器:
高级定时器:TIM1,8
通用定时器: TIM2,3,4,5
基本定时器:TIM6,7

系统定时器:Systick

1.配置流程

由于系统定时器在内核中,所以想要配置系统定时器的相关寄存器,需要打开内核手册。
在这里插入图片描述
Bits 31:17保留,必须保持清除。
第16位计数标志:
如果计时器自上次读取以来计数为0,则返回1。

Bits 15:3保留,必须保持清除。
位2 CLKSOURCE:时钟源选择
选择时钟源。
0:AHB/8
1:处理器时钟(AHB)
Bit 1 TICKINT:SysTick异常请求启用
0:倒计时到零不会断言SysTick异常请求
1:倒计时到零以断言SysTick异常请求。
注意:软件可以使用COUNTFLAG来确定SysTick是否曾经计数为零。
位0启用:计数器启用
启用计数器。当ENABLE设置为1时,计数器从以下位置加载RELOAD值
加载寄存器,然后倒计时。当达到0时,它将COUNTFLAG设置为1
根据TICKINT的值,可选地断言SysTick。然后加载RELOAD
再次取值,并开始计数。
0:计数器已禁用
1:计数器已启用

由内核手册可知该寄存器的0,1,2位均要置1。

	//系统滴答定时器定时 1ms
	//时钟源和分频器 72m  7	2000 000
	SysTick->CTRL |= 0x1<<2;
	//计数器 打开
	SysTick->CTRL |= 0x1<<0;
	//打开系统定时器中断
	SysTick->CTRL |= 0x1<<1;

之后还要配置重装载值
在这里插入图片描述
Bits 31:24保留,必须保持清除。
位23:0重新加载[23:0]:重新加载值
LOAD寄存器指定计数器为时加载到VAL寄存器的起始值
启用,当它达到0时。计算RELOAD值RELOAD值可以是0x0000001-x00FFFFFF范围内的任何值。起始值为0是可能的,但没有效果,因为SysTick异常请求和COUNTFLAG从1到0计数时激活。
RELOAD值根据其用途计算:
l要生成具有N个处理器时钟周期的多触发定时器,请使用RELOAD
N-1的值。例如,如果每100个时钟脉冲需要SysTick中断,则设置
重新加载到99。l要在延迟N个处理器时钟周期后传递单个SysTick中断,请使用值为N的RELOAD。例如,如果在400时钟后需要SysTick中断
脉冲,将RELOAD设置为400。

SysTick->LOAD = 72000-1;//计数器计数从72000-1计数到0产生中断

意思为72000*1/72HZ=1/1000=1ms,即为1ms进入中断一次。

也可以用内核写好的函数进行应用。
在这里插入图片描述

SysTick_Config(72000);

2.程序配置

之后在delay.c 里加入void SysTick_Handler(void)函数

uint32_t systicktime = 0;
uint16_t ledcnt[2]={0,1000};//500ms   每个任务执行的时间
uint16_t led2cnt[2]={0,1500};//700ms
uint16_t keycnt[2]={0,10};//10ms检测一次
void SysTick_Handler(void)//1ms调用一次
{
	//不需要清中断挂起位
	systicktime++;
	ledcnt[0]++;
	led2cnt[0]++;
	keycnt[0]++;
}
if(led1>=500){//过去500ms
			led1=0;
			/***LED1闪烁任务***/
			Led_Toggle(1);
		}
		if(led2>=700){//过去500ms
			led2=0;
			/***LED2闪烁任务***/
			Led_Toggle(2);
		}

二、基本定时器

STM32中定时器分类以及相关作用
高级控制定时器:TIM1、TIM8 定时+输入捕获+输出比较+死区+互补PWM
通用定时器:TIM2、3、4、5 定时+输入捕获+输出比较
基本定时器:TIM6、7 定时

定时器配置的大致流程:
1、时钟源 RCC内部的时钟 APB1 36M APB1*2 = 72M
2、配置时需要打开APB1上TIM2、3、4、5、6、7或APB2上 TIM1、8的时钟(根据需求)
3、配置分频器:根据实际情况计算,不能超过65536 (TIMx_PSC)
4、配置重装载值:根据实际情况计算,不能超过65536(TIM_ARR)
5、打开计数器:
TIM_CR1(位0,位2) TIMx_DIER位0;
6、使能中断通道、配置中断优先级。
7、写一个中断服务函数。

1.TIM6定时器配置

1.时钟源使能

首先进行开时钟,在APB1上找到TIM6的时钟置为1即可。
在这里插入图片描述

RCC->APB1ENR |= 0x1<<4;
2.分频器

在这里插入图片描述
由于该分频器是自动+1,所以传参时应-1。

分频器
TIM6->PSC = psc-1;
3.装载值

在这里插入图片描述
TIM6 和TIM7 控制寄存器1的第0位置1即可使该计数器使能。

//装载值
TIM6->ARR = reload-1;
4.计数器使能

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

	//计数器使能
	TIM6->CR1 |= 0x1<<0;
5.打开定时器中断并配置

在这里插入图片描述
在这里插入图片描述
将TIM6 和TIM7 DMA/中断使能寄存器(TIMx_DIER)的第0位置1即可打开。

	//打开定时器中断
	TIM6->DIER |= 0x01<<0;
	NVIC_SetPriority(TIM6_IRQn,5);//设置优先级0~15
	NVIC_EnableIRQ(TIM6_IRQn);//使能中断通道
	
6.中断函数编写

在这里插入图片描述

void TIM6_IRQHandler(void)
{
	//判断中断标志位
	if((TIM6->SR&(0x1<<0)) != 0){
		//清理中断标志位
		TIM6->SR &= ~(0x1<<0);
		
		printf("定时器6触发中断\r\n");
	}
}

应用:
首先在主函数中调用 TIM6_Config();
由于需求是让LED2以500ms一次的频率闪烁,所以此时函数中应填写

TIM6_Config(7200,5000);

系统时钟是72Mhz,等于72000000hz。除于7200,等于0.1ms计数一次。
5000代表计数5000次定时器报警,也就是说500ms产生中断一次
最后,在产生中断时翻转LED2即可。

中断函数代码为:

void TIM6_IRQHandler()
{
		//判断中断标志位
	if((TIM6->SR&(0x01<<0))!=0){
	//翻转LED2
	Led_Toggle(2);
	//清理中断标志位
	TIM6->SR &= ~(0x01<<0);
	printf("定时器中断\r\n");
	}
}

库函数写法:

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure={0};
  TIM_TimeBaseStructure.TIM_Period = reload-1;//装载值
  TIM_TimeBaseStructure.TIM_Prescaler = psc-1;//分频器
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数模式选择向上计数

  TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
	//定时器使能
	TIM_Cmd(TIM6,ENABLE);
	//定时器中断使能
	TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);
	
	NVIC_SetPriority(TIM6_IRQn,5);
	NVIC_EnableIRQ(TIM6_IRQn);
}
void TIM6_IRQHandler(void)
{
	//判断中断标志位
	if((TIM6->SR&(0x1<<0)) != 0){
		//清理中断标志位
		TIM6->SR &= ~(0x1<<0);
		
		printf("定时器6触发中断\r\n");
	}
}

三、通用定时器

TIM2
void TIM2_Config(uint16_t psc,uint16_t reload)
{
	//时钟源APB1*2=72MHz,时钟源使能
	RCC->APB1ENR |= 0x01<<0;
	//分频器
	TIM2->PSC = psc-1;	
	//装载值
	TIM2->ARR = reload-1;
	//计数器使能
	TIM2->CR1 |= 0x01<<0;
	//打开定时器中断
	TIM2->DIER = 0x01<<0;
	NVIC_SetPriority(TIM2_IRQn,3);//设置优先级0~15
	NVIC_EnableIRQ(TIM2_IRQn);//使能中断通道
}
void TIM2_IRQHandler()
{
	//判断中断标志位
	if((TIM2->SR&(0x01<<0))!=0){
	//翻转LED2
	Led_Toggle(2);
	//清理中断标志位
	TIM2->SR &= ~(0x01<<0);
	printf("定时器中断\r\n");
	}
}

主函数中:

 TIM2_Config(7200,10000);	

表示0.1ms计数一次,一共计数10000次,一共1000ms,即为一秒。

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

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

相关文章

变压器涌流浪涌

涌流和浪涌 1. 相关概念简介 涌流 基本概念及分析意义&#xff1a; 涌流基本概念&#xff1a;指在断电或重新通电后&#xff0c;瞬时大电流从电源流向负载的现象。 在电力系统中&#xff0c;涌流的出现与许多因素有关&#xff0c;例如电源电压、负载电容和电感等&#xff…

uniapp环境H5运行及发行(入门必学)

uniapp环境H5运行及发行 Uni-app是一个使用Vue.js开发所有前端应用的框架&#xff0c;它可以编译到iOS、Android、H5、以及各种小程序等多个平台。关于Uni-app环境下H5的运行及发行&#xff0c;以下是详细的步骤和注意事项&#xff1a; 一、H5运行 安装环境 安装Node.js&…

【案例60】NIO导致本地内存溢出

问题现象 集成环境出现宕机&#xff0c;javacore中报本地内存溢出。 问题分析 对JAVACORE进行分析之后可以发现&#xff0c;有大量的异步IO线程。 同时查看websphere的ffdc事件可以发现&#xff1a; 从FFDC中可以看到部分信息&#xff1a; com.ibm.ws.util.ThreadPool$Wor…

源代码编译,Apache DolphinScheduler前后端分离部署解决方案

转载自神龙大侠 生产环境部署方案 在企业线上生产环境中&#xff0c;普遍的做法是至少实施两套环境。 测试环境线上环境 测试环境用于验证代码的正确性&#xff0c;当测试环境验证ok后才会部署线上环境。 鉴于CI/CD应用的普遍性&#xff0c;源代码一键部署是必要的。 本文…

ISO 26262中的失效率计算:SN 29500-2 Expected values for integrated circuits

目录 概要 1 基准条件下的失效率 2 失效率转换 2.1 失效率预测模型 2.2 电压应力系数 2.2.1 电压应力系数计算模型 2.2.2 电压应力系数计算 2.3 温度应力系数 2.3.1 温度应力系数计算模型 2.3.2 温度应力系数计算 2.4 漂移灵敏度系数 3 任务剖面应力系数 4 早期失…

JAVA设计模式之【原型模式】

快速构建对象方法&#xff1a; 使用简单工厂将get&#xff0c;set封装到某个方法中&#xff08;Client类&#xff09; JDK提供实现Cloneable接口实现快速复制 1 类图 2 适用场景 1、类初始化消耗资源较多。 2、new 产生的一个对象需要非常繁琐的过程&#xff08;数据准备、访…

Python selenium爬虫被检测到,该怎么破?

当使用Selenium进行网络爬虫操作时&#xff0c;经常会被目标网站检测到并采取了反爬措施&#xff0c;有几种方法可以尝试规避。 1、 用无头模式&#xff08;Headless Mode&#xff09;&#xff1a;Selenium支持在无头浏览器模式下运行&#xff0c;这样就不会触发与真实用户操作…

Spring-AOP-API设计与实现

拦截篇-AOP怎么拦截类和方法 Joinpoint Joinpoint&#xff08;连接点&#xff09;是面向切面编程&#xff08;Aspect-Oriented Programming, AOP&#xff09;中的一个核心概念。在 Spring AOP 中&#xff0c;它主要指代的是应用程序中的某个特定点&#xff0c;在这个点上可以…

国产游戏技术:创新驱动下的全球影响力

国产游戏技术能否引领全球&#xff1f; 前言技术亮点&#xff1a;国产游戏的创新之路面临的挑战&#xff1a;技术创新与市场适应发展机遇&#xff1a;拥抱新技术&#xff0c;拓展国际市场IT技术创新&#xff1a;推动行业发展的新引擎人才需求&#xff1a;技术人才的紧缺与机遇结…

一个利用率超高的楼宇智能化实验室是如何练成的?

在当今快速发展的智能化时代&#xff0c;楼宇智能化实验室作为培养未来智能科技人才的重要基地&#xff0c;其利用率的高低直接关系到科研效率和成果产出。本文将详细探讨如何打造一个利用率超高的楼宇智能化实验室&#xff0c;从设计规划、设备选型、实训内容、管理运营等多个…

Git克隆仓库太大导致拉不下来的解决方法 fatal: fetch-pack: invalid index-pack output

一般这种问题是因为某个文件/某个文件夹/某些文件夹过大导致整个项目超过1G了导致的 试过其他教程里的设置depth为1,也改过git的postBuffer,都不管用 最后还是靠克隆指定文件夹这种方式成功把项目拉下来 1. Git Bash 输入命令 git clone --filterblob:none --sparse 项目路径…

解决pip install fitz 失败问题

背景 实现PDF转图片&#xff0c;需要使用fitz&#xff0c;结果安装的时候出现问题。 先上解决方案&#xff0c;再进行问题分析. 解决方案 安装PyMuPDF能直接使用fitz&#xff0c;按照介绍PyMuPDF也叫称为fitz库。 pip install PyMuPDF 问题分析 关键报错信息&#xff1a;…

WebRTC支持H.265编码:技术挑战与EasyCVR视频汇聚平台解决方案

随着互联网技术的快速发展&#xff0c;视频通信已成为人们日常生活和工作中不可或缺的一部分。WebRTC&#xff08;Web Real-Time Communication&#xff09;作为一种实时通信技术&#xff0c;因其便捷性和高效性而受到广泛关注。然而&#xff0c;在视频编码格式上&#xff0c;W…

武汉凯迪正大—三倍频发生器电源发生装置 倍频试验装置 多频装置

产品概述 武汉凯迪正大KDSF 感应耐压试验装置是根据国家标准《GB311-64》和原水电部发布的《电气设备预防性试验规程》&#xff0c;为满足电力系统对高压电压互感器、倍频感应耐压试验设备的要求而设计的&#xff0c;用于电力系统35-220KV等级电压互感器的交流耐压试验&#x…

证券行业加密业务安全风险监测与防御技术研究

摘要&#xff1a;解决证券⾏业加密流量威胁问题、加密流量中的应⽤⻛险问题&#xff0c;对若⼲证券⾏业的实际流量内容进⾏调研分析&#xff0c; 分析了证券⾏业加密流量⾯临的合规性⻛险和加密协议及证书本⾝存在的⻛险、以及可能存在的外部加密流量威 胁&#xff0c;并提出防…

详解Xilinx GTP结构原理以及验证

文章目录 一、GT简介二、GTP内部结构2.1 整体结构2.2 Quad的内部结构2.3 一对收发器的内部结构2.3.1 发送器的内部结构2.3.2 接收器的内部结构 三、时钟和复位3.1 输入的参考时钟结构3.1.1 IBUFDS_GTE2原语3.1.2 IBUFDS_GTE2原语端口属性说明 3.2 参考时钟选择和分配3.2.1 GTPE…

VScode + Python 下载及安装|python环境配置|中文乱码解决

1&#xff0c;下载安装VScode 直接点击2024.9https://vscode.download.prss.microsoft.com/dbazure/download/stable/fee1edb8d6d72a0ddff41e5f71a671c23ed924b9/VSCodeUserSetup-x64-1.92.2.exe 或者百度搜索VScode&#xff0c;可下载安装最新版 点击后等一下&#xff0c;就…

es、kibana及分词器的安装

文章目录 1、搜索引擎2、为什么使用新型搜索&#xff1f;3、底层原理&#xff1a;倒排索引4、底层API5、你使用了什么分词器&#xff1f;6、ElasticSearch安装6.1、准备目录并授予权限6.2、制作配置文件6.3、初始化es容器6.4、重置es用户密码6.5、安装中文分词器6.5.1、 把资料…

人机环境系统智能中的知己、趣时、变通

在易经中&#xff0c;知己、趣时、变通是重要的概念&#xff0c;它们在人机环境系统智能中的作用可以理解为&#xff1a; 知己&#xff1a;指的是对系统自身的深刻了解。在人机环境系统中&#xff0c;这意味着系统能够清晰地识别和理解自身的能力、限制以及用户的需求&#xff…

鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙中巧夺天工

gn是什么? gn 存在的意义是为了生成 ninja,如果熟悉前端开发,二者关系很像 Sass和CSS的关系. 为什么会有gn,说是有个叫even的谷歌负责构建系统的工程师在使用传统的makefile构建chrome时觉得太麻烦,不高效,所以设计了一套更简单,更高效新的构建工具gnninja,然后就被广泛的使用…