单片机04__基本定时器__毫秒微秒延时

基本定时器__毫秒微秒延时

基本定时器介绍(STM32F40x)

        STM32F40X芯片一共包含14个定时器,这14个定时器分为3大类:

通用定时器

10个

TIM9-TIM1和TIM2-TIM5

具有基本定时器功能,

还具有输入捕获,输出比较功能

高级定时器

2个

TIM1和TIM8  

具有通用定时器和基本定时器功能,

还具有死区刹车功能。

基本定时器

2个

TIM6和TIM7 

能实现基本定时功能和DAC模块触发功能

注:若只存在6个定时器。TIM1一定为高级定时器,TIM6一定为基本定时器。其余为通用。

若存在10个定时器。TIM1&&TIM8为高级定时器,TIM6&&TIM7为基本定时器。其余为通用。

基本定时器概述STM32F40x

        基本定时器TIM6和TIM7各包含一个16位的自动重载计数器(最大计数值是0~ 2^16-1),该计数器由可编程预分频器驱动(降低计数频率,达到更长的计时要求)。

        可编程预分频器(降低计数频率): 一个脉冲计一次数;更长计时:十个脉冲计一次数。

        基本定时器不仅能用来作为简单的计数功能,还可以用来作为通用定时器的时基单元,还可以用作驱动DAC模块。

基本定时器特征STM32F40x

        ①基本定时器的计数范围是:0-65535,计数方式为递增计数。

        ②可以对基本定时器的时钟源进行分频:分频系数介于1-65536之间,分频的目的是为了满足更长的计时时间要求。

        ③可以作为DAC模块的驱动时钟

       ④在基本定时器的计数器溢出的时候,可以产生一个更新事件,并同时可以产生一个中断/DMA请求。

定时器的时钟源

如下图,如果芯片的工作频率到此时钟总线的频率的分频系数为1,则频率不变。否则X2。

如果若使用的定时器的是时钟频率不是总频就要考虑是否要X2的问题,而且X2之后的频率绝对不会超过总频。

基本定时器内部框图STM32F40x

①CK_PSC为主频,通过“预分频器”得到定时器时钟(CK_CNT)。

        预分频器:设置分频值,降低计数频率,增长计数时间。(一个脉冲计数一次,分频后:多个脉冲计数一次,时间增长)

        预分频器有影子寄存器,且影子寄存器不可设置,长期自动开启。

        内核只会读取影子寄存器的分频值。当更新事件UEV后,上层新的预分频值才会替换掉影子寄存器内的旧分频值。

②CNT COUNTER:计数器当前计数的值。计数器上溢。

        事件更新UEV:当前计数的值到达计数周期。

③自动重载寄存器:设置计数周期(计数的最大值)。

        新的自动重载寄存器的值,只能在事件更新UEV后,才会替换掉重载影子寄存器的值。

        第一次开启计数器时,有UG位手动更新重载影子寄存器的值。

        状态寄存器:产生事件更新UEV时,状态寄存器标志位变为1,只有重新清0,才可再次计数。手动设置UG位,引起UEV,也需要状态寄存器状态位清0。

定时器时基单元  (TIM6/TIM7)  

        可编程定时器的主要模块由一个 16 递增计数器及其相关的自动重载寄存器组成。计数器的时钟可通过预分频器进行分频。

        计数器、自动重载寄存器预分频器寄存器可通过软件进行读写。即使在计数器运行时也可执 行读写操作。

定时器的时基单元是定时器最基本的寄存器

        ①计数器寄存器:定时器计数工作寄存器,从0开始(不一定是0,想从多少开始则将数值直接写给计数器寄存器即可)累积计数到自动重装载数值,从而产生溢出,重新开始从初始值计数。

        ②预分频寄存器:对输入的时钟源进行分频,降低计数频率,达到更长的计时要求。

        ③自动重装载寄存器:定时器的工作周期(决定了计数器一周期内计数的次数/最大范围)。

分频器分频1->2

计数器时序图

自动重载寄存器(ARR预装载)

基本定时器相关寄存器STM32F40x

总述:

        自动重载寄存器是预装载的。每次尝试对自动重载寄存器执行读写操作时,都会访问预装载寄存器。预装载寄存器的内容既可以直接传送到影子寄存器,也可以在每次发生更新事件 UEV 时传送到影子寄存器,这取决于 TIMx_CR1 寄存器中的自动重载预装载使能位 (ARPE)。当计数器达到上溢值并且 TIMx_CR1 寄存器中的 UDIS 位为 0 时,将发送更新事件。该更新事件也可由软件产生。     

        计数器由预分频器输出 CK_CNT 提供时钟,仅当 TIMx_CR1 寄存器中的计数器启动位 (CEN)  1 时,才会启动计数器。

TIM6初始化

        开启时钟。

控制寄存器TIMx_CR1(TIM6和TIM7)

计数器 TIMx_CNT (TIM6和TIM7)

预分频器 TIMx_PSC (TIM6和TIM7)

自动重载寄存器 TIMx_ARR (TIM6和TIM7)

状态寄存器 TIMx_SR (TIM6和TIM7)

事件生成寄存器 TIMx_EGR (TIM6和TIM7)

基本定时器编程思路STM32F40x

/************************************************
函数功能:定时器TIM6初始化
函数参数:
psc:分频值
arr:自动重载值

时间(s) = 计数周期(arr) / 计数频率
计数频率 = 定时器工作频率(hz 已知)/分频系数(psc)

定时器工作频率:42*2MHZ == 84000000HZ
设:psc == 8400  ----->   计数频率 == 10000
设:arr == 10000   ---->   时间 == 1s
************************************************/
void TIM6_Init(uint16_t psc,uint16_t arr)
{
	RCC->APB1ENR |= 1<<4;	//开启时钟
	
	TIM6->CR1 |= 1<<7;	//自动重载预装载使能
	TIM6->CR1 &= ~(1<<3);	//循环计数
	TIM6->CR1 &= ~(1<<2);	//选择事件更新源
	TIM6->CR1 &= ~(1<<1);	//事件发生后更新影子寄存器的值
	//设置时基单元
	TIM6->CNT = 0;	//设置计数初始值
	TIM6->PSC = psc -1;	//设置分频值
	TIM6->ARR = arr;	//设置自动重载值
	
	TIM6->EGR |= 1<<0;	//手动更新UG位
	TIM6->SR &= ~(1<<0);	//状态寄存器,清除标志位
	
	TIM6->CR1 |= 1<<0;	//使能计数器
}

使能基本定时器时钟     

  1. 配置基本定时器的功能模式:是否开启影子寄存器、计数模式。。。。。
  2. 写计数器初始值,预分频值、自动重装载值。
  3. 如果使用中断,则开启中断   
  4. 手动产生更新事件(UG位)
  5. 清标志位
  6. 启动计数器

基本定时器实现毫秒微秒延时

公式:

时间(s) = 计数周期(arr) / 计数频率

计数频率 = 定时器工作频率(hz 已知)/分频系数(psc)

TIM7挂载在APB1(42MHZ)线上,不为时钟总频,所以定时器工作频率:42*2*1000000HZ

定时器工作频率:42*2MHZ == 84000000HZ

设:psc == 8400  ----->   计数频率 == 10000

设:arr == 10000   ---->   时间 == 1s

毫秒:

设:arr== 10   ------>   时间 == 1s/1000 == 1ms

微秒:

设:psc==84;arr==1   ------>   时间== 1ms/1000  == 1us

举例:

//毫米延时
void delay_ms(uint16_t num)
{
	uint16_t i = 1;
	//10000 -> 1s   10 -> 1ms
	TIM7_Init(8400,10);
	while(1)
	{
		if(TIM7->SR & 1<<0)
		{
			TIM7->SR &= ~(1<<0);
			i++;
		}
		if(i == num)
			break;
	}
}
//微秒延时
void delay_us(uint16_t num)
{
	uint16_t i = 1;
	//10000 -> 1s   10 -> 1ms   
	TIM7_Init(84,1);
	while(1)
	{
		if(TIM7->SR & 1<<0)
		{
			TIM7->SR &= ~(1<<0);
			i++;
		}
		if(i == num)
			break;
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

桥接模式:解耦抽象与实现,实现灵活多变的扩展结构

文章目录 一、引言二、应用场景与技术背景三、模式定义与实现四、实例详解五、优缺点分析总结&#xff1a; 一、引言 ​ 桥接模式是一种结构型设计模式&#xff0c;它将抽象部分与它的实现部分分离&#xff0c;使它们可以独立变化。这种模式通过创建一个抽象层和实现层的结构&…

普中51单片机学习(DS1302)

DS1302时钟 DS1302实时时钟具有能计算2100年之前的秒、分、时、日、日期、星期、月、年的能力&#xff0c;还有闰年调整的能力。内部含有31个字节静态RAM&#xff0c;可提供用户访问。采用串行数据传送方式&#xff0c;使得管脚数量最少&#xff0c;简单SPI 3线接口。工作电压…

初识表及什么是数据表

一、了解表 1.1.概述 表是处理数据和建立关系型数据库及应用程序的基本单元&#xff0c;是构成数据库的基本元素之一&#xff0c;是数据库中数据组织并储存的单元&#xff0c;所有的数据都能以表格的形式组织&#xff0c;目的是可读性强。 1.2.表结构简述 一个表中包括行和列…

下载 axios.js 文件到本地【linux】

方式一 npm install axios在$NODE_PATH/node_modules/axios/dist路径下即可找到axios.js。 方式二 1、百度搜索 GitHub 官网&#xff1a;https://github.com/ 2、搜索 axios 3、点击 axios/axios 4、下载到本地 5、解压&#xff0c;进入到 dist 文件夹** 参考&#x…

实现可拖拽的页面元素排序更新数据库排序

摘要&#xff1a; 拖拽列表改变路边排序&#xff0c;并且更新后台数据库列表的排序&#xff0c;重新请求的时候获取拖拽后的排序&#xff01; Layui&#xff1a; // 拖拽内页顺序list document.querySelector(#view_side_tab);// 创建cruentItem存放将要拖动的元素let cruen…

Zookeeper经典应用场景实战

Zookeeper经典应用场景实战 ZK的不足之处 watcher检测是一次性的&#xff0c;每次触发之后都需要重新注册会话超时之后没有实现重连机制异常处理繁琐仅提供byte数组类型的接口&#xff0c;没提供java实体序列化级接口创建节点时如果抛出异常&#xff0c;需要自行检查节点是否…

【深度学习】Pytorch教程(十):PyTorch数据结构:4、张量操作(1):张量形状操作

文章目录 一、前言二、实验环境三、PyTorch数据结构1、Tensor&#xff08;张量&#xff09;1. 维度&#xff08;Dimensions&#xff09;2. 数据类型&#xff08;Data Types&#xff09;3. GPU加速&#xff08;GPU Acceleration&#xff09; 2、张量的数学运算1. 向量运算2. 矩阵…

【MySQL】多表操作、事务、索引

MySQL MYSQL 多表设计 一对多插入测试数据外键约束(物理外键)使用逻辑外键 MYSQL 多表设计 一对一表结构 MYSQL 多表设计 多对多 MYSQL 多表设计 一对多 建表语句 员工表 CREATE TABLE tb_emp (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT ID,username VARCHAR(20) N…

130 如何通过vs2017开发linux c++程序

使用VS2017开发linux下的应用程序&#xff08;C/C&#xff09;_vc_linux.exe vs2017-CSDN博客 参考上面这哥们的&#xff0c;写的很详细 前言 本文章记录如何使用VS2017进行linux应用程序的开发&#xff08;针对新手小白&#xff09;&#xff0c;VS2017能较为方便的通过SSH编辑…

强大的文本绘图——PlantUML

PlantUML是一款开源工具&#xff0c;它允许用户通过简单的文本描述来创建UML图&#xff08;统一建模语言图&#xff09;。这种方法可以快速地绘制类图、用例图、序列图、状态图、活动图、组件图和部署图等UML图表。PlantUML使用一种领域特定语言&#xff08;DSL&#xff09;&am…

【Java程序设计】【C00282】基于Springboot的校园台球厅人员与设备管理系统(有论文)

基于Springboot的校园台球厅人员与设备管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的校园台球厅人员与设备管理系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xf…

【可申请试用】RT-Thread专业版全面支持瑞芯微RK3568系列平台并可实现混合部署...

RT-Thread 专业版是面向任务关键领域的高安全实时操作系统&#xff0c;已被广泛应用于航空航天&#xff0c;电力&#xff0c;轨交&#xff0c;车载&#xff0c;工业控制&#xff0c;新能源&#xff0c;医疗等国家重要领域&#xff0c;是各领域高可靠装备的基础核心软件。该版本…

C#,计算几何,计算机图形学(Computer Graphics)洪水填充算法(Flood Fill Algorithm)与源代码

1 泛洪填充算法(Flood Fill Algorithm) 泛洪填充算法(Flood Fill Algorithm) &#xff0c;又称洪水填充算法&#xff0c;是在很多图形绘制软件中常用的填充算法&#xff0c;最熟悉不过就是 windows 自带画图软件的油漆桶功能。 2 源程序 using System; using System.Collecti…

基于PostGIS的慢查询引起的空间索引提升实践

目录 前言 一、问题定位 1、前端接口定位 2、后台应用定位 3、找到问题所在 二、空间索引优化 1、数据库查询 2、创建空间索引 3、geography索引 4、再看前端响应 总结 前言 这是一个真实的案例&#xff0c;也是一个新入门的工程师很容易忽略的点。往往在设计数据库的…

【JVM】Java中SPI机制

打破双亲委派模型中提到SPI和JDBC相关内容&#xff0c;那么是如何打破双亲委派模型呢?本文进行一个讲解&#xff0c;在开始讲解之前&#xff0c;我们需要先了解Java中的SPI机制 是什么 SPI 全称Service Provider Interface&#xff0c;是 Java 提供的一套用来被第三方实现或…

《TCP/IP详解 卷一》第6章 DHCP

目录 6.1 引言 6.2 DHCP 6.2.1 地址池和租用 6.2.2 DHCP和BOOTP消息格式 6.2.3 DHCP和BOOTP选项 6.2.4 DHCP协议操作 6.2.5 DHCPv6 6.2.6 DCHP中继 6.2.7 DHCP认证 6.2.8 重新配置扩展 6.2.9 快速确认 6.2.10 位置信息&#xff08;LCI和LoST&#xff09; 6.2.11 移…

股票量化系统QTYX“单针探底”迎战A股V型反转|24年2月春节后第一周记录

前言 “实战案例个股画像”系列和大家分享我基于QTYX选股框架&#xff0c;在实战中选股的案例&#xff0c;和大家一起见证QTYX选股框架逐步完善的过程&#xff0c;帮助大家理解QTYX的精髓。 关于QTYX的使用攻略可以查看链接&#xff1a;QTYX使用攻略 关于QTYX初衷和精髓可以查看…

【计算机毕业设计】541鲜花商城系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Unity 2021.3发布WebGL设置以及nginx的配置

使用unity2021.3发布webgl 使用Unity制作好项目之后建议进行代码清理&#xff0c;这样会即将不用的命名空间去除&#xff0c;不然一会在发布的时候有些命名空间webgl会报错。 平台转换 将平台设置为webgl 设置色彩空间压缩方式 Compression Format 设置为DisabledDecompre…

Java 学习和实践笔记(19):this的使用方法

this用来指向当前对象的地址。 this的用法&#xff1a; 1&#xff09;在普通方法中&#xff0c;this总是指向调用该方法的对象。在普通方法中&#xff0c;它是作为一种隐式参数一直就存在着&#xff08;这句话的意思&#xff0c;就是其实在普通方法中&#xff0c;编译器一直就…