STM32F4X定时器之基本定时器

一、定时器的概述

进行有规律的计数,每记一次数的时间都是固定的

定时器的本质:计数的总时间 = 记一次数的时间(时钟的频率) * 记多少次(重装载值)。

基本定时器属于片上外设,系统滴答定时器是属于内核级别。

STM32的定时器分类

基本定时器:主要做一些基本定时功能,触发DAC转换

通用定时器:包含了基本定时器的所有功能,并且还有PWM波(电机调速)和输入捕获功能

高级定时器:包含了通用定时器的所有功能,死区和刹车的功能。

 基本定时器介绍

基本定时器TIM6和TIM7包含一个16位自动重载(每次计数结束就会把重装载值加载到计数器里,让它重新开始计数)计数器,该计数器由可编程预分频器(做除法)驱动。此类定时器不仅可用作通用定时器以生成时基,还可以专门用于驱动数模转换器(DAC)。实际上,此类定时器内部连接到DAC并能够通过其触发输出驱动DAC。这些定时器彼此完全独立,不共享任何资源。

基本定时器特征

基本定时器(TIM6和TIM7)的特性包括:

16位自动重载递增计数器

16位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数介于1和65536之间

用于触发DAC的同步电路

发生更新事件时会生成中断DMA请求,计数器上溢。

二、基本定时器框架

当前可以操作到的只能是上层寄存器,但是真正起作用的是影子寄存器,但是影子寄存器是看不见摸不着的所以需要做的是把上层寄存器的值加载到影子寄存器里

三、基本定时器定时预装载过程分析

预分频器

自动重载寄存器

基本时基单元:预分频值、重装载值、计数器的值(硬件自动计数)

基本定时器相关寄存器

TIM6 TIM7 控制寄存器 1 (TIMx_CR1)
15:8 保留,必须保持复位值。
7 ARPE :自动重载预装载使能 (Auto-reload preload enable)
0 TIMx_ARR 寄存器不进行缓冲。
1 TIMx_ARR 寄存器进行缓冲。
为0代表没有影子寄存器
为1代表有影子寄存器
6:4 保留,必须保持复位值。
3 OPM :单脉冲模式 (One-pulse mode)
0 :计数器在发生更新事件时不会停止计数
1 :计数器在发生下一更新事件时停止计数(将 CEN 位清零)。
0:就是连续计数
1:单次计数
2 URS :更新请求源 (Update request source)
此位由软件置 1 和清零,用以选择 UEV 事件源。
0 :使能时,所有以下事件都会生成更新中断或 DMA 请求。此类事件包括:
— 计数器上溢/ 下溢
— 将 UG 位置 1
— 通过从模式控制器生成的更新事件
1 :使能时,只有计数器上溢 / 下溢会生成更新中断或 DMA 请求。
1 UDIS :更新禁止 (Update disable)
此位由软件置 1 和清零,用以使能 / 禁止 UEV 事件生成。
0 :使能 UEV 。更新 (UEV) 事件可通过以下事件之一生成:
— 计数器上溢/ 下溢
— 将 UG 位置 1
— 通过从模式控制器生成的更新事件
然后更新影子寄存器的值。
1 :禁止 UEV 。不会生成更新事件,各影子寄存器的值( ARR PSC )保持不变。但如果将
UG 位置 1 ,或者从从模式控制器接收到硬件复位,则会重新初始化计数器和预分频器。
位1首先要置为0才能让位2有效
位1置0:代表当前会有更新事件生成(更新影子寄存器的值)
位2置1:代表当前只有计数器上溢可以进入中断
0 CEN :计数器使能 (Counter enable)
0 :禁止计数器
1 :使能计数器
注意:只有事先通过软件将 CEN 位置 1 ,才可以使用门控模式。而触发模式可通过硬件自动将 CEN 位置 1
在单脉冲模式下,当发生更新事件时会自动将 CEN 位清零。
TIM6 TIM7 DMA/ 中断使能寄存器 (TIMx_DIER)
15:9 保留,必须保持复位值。
8 UDE :更新 DMA 请求使能 (Update DMA request enable)
0 :禁止更新 DMA 请求。
1 :使能更新 DMA 请求。
7:1 保留,必须保持复位值。
0 UIE :更新中断使能 (Update interrupt enable)
0 :禁止更新中断。
1 :使能更新中断。
0 UIE :更新中断使能 (Update interrupt enable)
0 :禁止更新中断。
1 :使能更新中断。
如果置1,当发生更新事件时,就可以进入中断服务函数
TIM6 TIM7 状态寄存器 (TIMx_SR)
15:1 保留,必须保持复位值。
0 UIF :更新中断标志 (Update interrupt flag)
该位在发生更新事件时通过硬件置 1 。但需要通过软件清零。
0 :未发生更新。
1 :更新中断挂起。该位在以下情况下更新寄存器时由硬件置 1
上溢或下溢并且当 TIMx_CR1 寄存器中 UDIS = 0 时。
当由于 TIMx_CR1 寄存器中 URS = 0 UDIS = 0 而通过软件使用 TIMx_EGR 寄存器中
UG 位重新初始化 CNT 时。
TIM6 TIM7 事件生成寄存器 (TIMx_EGR)
15:1 保留,必须保持复位值。
0 UG :更新生成 (Update generation)
该位可通过软件置 1 ,并由硬件自动清零。
0 :不执行任何操作。
1 :重新初始化定时器计数器并生成寄存器更新事件。请注意,预分频器计数器也将清零(但
预分频比不受影响)。

把UG位置1就可以把上层寄存器的值加载到影子寄存器里来

TIM6 TIM7 计数器 (TIMx_CNT)
15:0
CNT[15:0] :计数器值 (Counter value)
TIM6 TIM7 预分频器 (TIMx_PSC)
15:0 PSC[15:0] :预分频器值 (Prescaler value)
计数器时钟频率 CK_CNT 等于 f CK_PSC / (PSC[15:0] + 1)
PSC 包含在每次发生更新事件时要装载到实际预分频器寄存器的值
TIM6 TIM7 自动重载寄存器 (TIMx_ARR)
15:0 ARR[15:0] :自动重载值 (Auto-reload value)
ARR 为要装载到实际自动重载寄存器的值。
有关 ARR 更新和行为的详细信息,请参见 17.3.1 节:第 484 页的时基单元
当自动重载值为空时,计数器不工作。

1. 配置时钟:在使用定时器之前,需要先配置时钟。定时器的时钟源可以是内部时钟或外部时钟。 
2. 配置定时器模式:在基本定时器中,有两种模式,分别是计数模式和自动重载模式。需要根据实际需求选择合适的模式。
3. 配置定时器周期:设置定时器的自动重载值,即计数器的最大值。 
4. 配置计数器:设置定时器的初始值,一般为0。 
5. 启动定时器:将定时器控制寄存器中的使能位设置为1,即可启动定时器。 
6. 判断定时器是否完成:可以通过读取定时器的状态寄存器来判断定时器是否完成了一次计数。 
7. 重置定时器:如果需要再次使用定时器,需要将定时器的计数器和状态寄存器清零。 
8. 处理定时器中断:如果开启了定时器中断,当定时器完成一次计数时,会触发中断,需要在中断服务函数中进行相应的处理。

中断方式
1. 打开TIM6的时钟
2. 往预分频器里写预分频值(记一次数的时间)
3. 往重装载寄存器里写值(记多少次)
4. 上层寄存器加载到影子寄存器里(配置CR1寄存器)
5. 产生一次更新事件(让UG位置1)
6. 使能更新中断
7. 配置中断优先级
8. 使能核心响应中断
9. 使能计数器
10. 编写中断服务函数

#include "time7.h"
/************************************
函数功能:定时器7的初始化
函数形参:u32 nms   65536 / 1000 = 65ms
函数返回值:void
函数说明:最大的定时时间由预分频值和重装载值来决定
作者:
日期:
************************************/void TIM7_Init(u32 nms)
{//1. 打开TIM7的时钟RCC->APB1ENR = (0X1 << 5); //2. 往预分频器里写预分频值(记一次数的时间)范围:0-65535之间TIM7->PSC = 8400 - 1;//84分频,10us记一次数//3. 往重装载寄存器里写值(记多少次)TIM7->ARR = nms * 10;//4. 上层寄存器加载到影子寄存器里(配置CR1寄存器)TIM7->CR1 |= 0X1 << 7;//配置ARR有影子寄存器TIM7->CR1 &= ~(0X1 << 3);//不停进行计数TIM7->CR1 &= ~(0X1 << 1);//使能EUV,让更新事件有效TIM7->CR1 |= (0X1 << 2);//只有计数器上溢才能产生中断或DMA请求//5. 产生一次更新事件(让UG位置1)TIM7->EGR |= 0X1 << 0;//6. 使能更新中断TIM7->DIER |= 0X1 <<0;//7. 配置中断优先级NVIC_SetPriority(TIM7_IRQn,NVIC_EncodePriority(7-2,1,1));//8. 使能核心响应中断NVIC_EnableIRQ(TIM7_IRQn);//9. 使能计数器TIM7->CR1 |= 0X1 << 0; }
//10. 编写中断服务函数
void TIM7_IRQHandler(void)
{TIM7->SR=0;//状态位清0printf("3s\r\n");
}/************************************
函数功能:定时器7的初始化
函数形参:u32 nms   65536 / 1000 = 65ms
函数返回值:void
函数说明:最大的定时时间由预分频值和重装载值来决定
作者:
日期:
************************************/
void TIM7_Delay(u32 nms)
{//1. 打开TIM7的时钟RCC->APB1ENR = (0X1 << 5); //2. 往预分频器里写预分频值(记一次数的时间)范围:0-65535之间TIM7->PSC = 8400 - 1;//84分频,10us记一次数//3. 往重装载寄存器里写值(记多少次)TIM7->ARR = nms * 10;//4. 上层寄存器加载到影子寄存器里(配置CR1寄存器)TIM7->CR1 |= 0X1 << 7;//配置ARR有影子寄存器TIM7->CR1 &= ~(0X1 << 3);//不停进行计数TIM7->CR1 &= ~(0X1 << 1);//使能EUV,让更新事件有效TIM7->CR1 |= (0X1 << 2);//只有计数器上溢才能产生中断或DMA请求//5. 产生一次更新事件(让UG位置1)TIM7->EGR |= 0X1 << 0;//6. 使能更新中断TIM7->DIER |= 0X1 <<0;//7. 使能计数器TIM7->CR1 |= 0X1 << 0; //8. 等待计数时间到while(!(TIM7->SR)){}//9. 关闭计时器TIM7->CR1 &= ~(0X1 << 0); 	
}
int main(void)
{NVIC_SetPriorityGrouping(7-2);//选择了优先级分组为第5组,抢占优先级所占位数为2位,响应优先级所占位数为2位TIM7_Init(3000);while(1){TIM7_Delay(500);}
}

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

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

相关文章

GitHub下载太慢的解决方案

修改hosts文件&#xff1a; windows的hosts文件在 C:\Windows\System32\drivers\etc\hosts cmd管理员运行命令notepad C:\Windows\System32\drivers\etc\hosts 然后cmd命令重启网络ipconfig /flushdns windows修改hosts Ubuntu22.04修改hosts sudo vim /etc/hosts # This fil…

openEuler 服务器安装 JumpServer (all-in-one 模式)

openEuler 服务器安装 JumpServer JumpServer 简介什么是 JumpServer &#xff1f;JumpServer 的各种类型资产JumpServer 产品特色或优势JumpServer 符合 4A 规范 JumpServer 系统架构应用架构组件说明 JumpServer 安装部署环境要求网络端口网络端口列表防火墙常用命令 在线脚本…

vlookup函数踩坑(wps)

使用wps的朋友看过来 vlookup函数踩坑&#xff0c;vlookup&#xff08;查找值&#xff0c;查找范围&#xff0c;返回值的索引&#xff0c;精确查找or模糊查找&#xff09; 我们要查找的数据的那一列&#xff0c;必须是查找范围的第一列&#xff01; 案例&#xff0c;看下面的…

02、Python 字符串

目录 字符串的基础用法字符串包含引号字符串拼接获取用户输入长字符串原始字符串字节串字符串与字节串转换 字符串的基础用法 列字符串的内容几乎可以包含任何字符&#xff0c;英文字符也行&#xff0c;中文字符也行。 既可用单引号&#xff0c;也可用双引号 字符串包含引号…

shell的for循环与结构化

shell笔记 列表for循环不带列表for循环for循环举例1.例1 所有文件名大写替换为小写2. 例2 读取/etc/passwd文件&#xff0c;依次输出ip段3. 例3 读取/etc/hosts内容for循环&#xff0c;执行ping4. 例4 循环ip列表&#xff0c;输出对应编号5. 例5 批量添加用户 break1. 例1 brea…

C++ vector 的模拟实现

目录 1. vector 类的成员变量 2. 无参构造 3. 析构函数 4. size_t capacity() 5. size_t size() 6. void reserve(size_t n) 7. 迭代器 8. void push_back(const T& x) 9. T& operator[](size_t pos) 10. iterator insert(iterator pos, const T& val…

MySQL 三大日志(bin log、redo log、undo log)

redo log redo log (重做日志) 是 InnoDB 存储引擎独有的&#xff0c;它让 MySQL有了崩溃恢复的能力&#xff0c;是事务中实现 持久化的重要操作 比如 MySQL 实例宕机了&#xff0c;重启时&#xff0c;InnoDB 存储引擎会使用 redo log 恢复数据&#xff0c;保证数据的持久性与…

设计模式——七大原则详解

目录 设计模式单一职责原则应用实例注意事项和细节 接口隔离原则应用实例 依赖倒转&#xff08;倒置&#xff09;原则基本介绍实例代码依赖关系传递的三种方式注意事项和细节 里氏替换原则基本介绍实例代码 开闭原则基本介绍实例代码 迪米特法则基本介绍实例代码注意事项和细节…

golang笔记17--编译调试go源码

golang笔记17--编译调试go源码 前置条件编译源码在 fmt 包中加自定义函数说明 当前go语言越来越流行了&#xff0c;各大厂商都有加大go工程师的需求&#xff0c;作为go语言的学习者&#xff0c;我们除了要了解如何使用go语言外&#xff0c;也有必要了解一下如何编译、调试go源码…

解决XXLJOB重复执行问题--Redis加锁+注解+AOP

基于Redis加锁注解AOP解决JOB重复执行问题 现象解决方案自定义注解定义AOP策略redis 加锁实践 现象 线上xxljob有时候会遇到同一个任务在调度的时候重复执行&#xff0c;如下图&#xff1a; 线上JOB服务运行了2个实例&#xff0c;有时候会重复调度到同一个实例&#xff0c;有…

交换机端口灯常亮 端口up状态 服务器设置ip交换机获取不到服务器网卡mac地址 不能通信

环境: 深信服防火墙 8.0.75 AF-2000-FH2130B-SC S6520X-24ST-SI交换机 version 7.1.070, Release 6530P02 问题描述: 交换机一个vlan下有3台服务器,连接端口2、3、4,2和3连接的服务器正常,交换机3端口灯常亮 端口up状态 服务器自动获取不了地址,改为手动设置ip后,交…

Xubuntu16.04系统中安装create_ap创建无线AP

1.背景说明 在Xubuntu16.04系统的设备上安装无线WIFI模块后&#xff0c;想通过设备自身的无线AP&#xff0c;进行和外部设备的连接&#xff0c;需要安装create_ap软件&#xff0c;并设置无线AP的名称和密码&#xff0c;并设置为开机自启动。 create_ap是一个用于在Linux系统上创…

开源贡献难吗?

本文整理自字节跳动 Flink SQL 技术负责人李本超在 CommunityOverCode Asia 2023 上的 Keynote 演讲&#xff0c;李本超根据自己在开源社区的贡献经历&#xff0c;基于他在贡献开源社区过程中的一些小故事和思考&#xff0c;如何克服困难&#xff0c;在开源社区取得突破&#x…

BetaFlight飞控AOCODAF435V2MPU6500固件编译

BetaFlight飞控AOCODAF435V2MPU6500固件编译 1. 源由2. 准备2.1 板子2.2 代码2.3 工具 3. 配置修改4. 编译4.1 获取代码4.2 获取配置4.3 编译固件4.4 DFU烧录4.5 版本核对 5. 总结 1. 源由 刚拿到一块Aocoda F405V2 (MPU6500) AT32F435飞控板(替换主控芯片)。 Aocoda-RC F40…

金融机器学习方法:K-均值算法

目录 1.算法介绍 2.算法原理 3.python实现示例 1.算法介绍 K均值聚类算法是机器学习和数据分析中常用的无监督学习方法之一&#xff0c;主要用于数据的分类。它的目标是将数据划分为几个独特的、互不重叠的子集或“集群”&#xff0c;以使得同一集群内的数据点彼此相似&…

tomcat 服务器

tomcat 服务器 tomcat: 是一个开源的web应用服务器。区别nginx&#xff0c;nginx主要处理静态页面&#xff0c;那么动态请求&#xff08;连接数据库&#xff0c;动态页面&#xff09;并不是nginx的长处&#xff0c;动态的请求会交给tomcat进行处理。 nginx-----转发动态请求-…

【5G PHY】5G SS/PBCH块介绍(一)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

使用crul库和R语言的下载器程序

以下是一个使用crul库和R语言的下载器程序&#xff0c;用于从下载音频。此程序使用了jshk.com.cn/get_proxy的代码。 // 导入必要的库 import ("fmt""github.com/cjlapa/crul""io""net/http""net/url""os" )// 主…

在 Python 中使用 Pillow 进行图像处理【3/4】

第三部分 一、腐蚀和膨胀 您可以查看名为 的图像文件dot_and_hole.jpg&#xff0c;您可以从本教程链接的存储库中下载该文件&#xff1a; 该二值图像的左侧显示黑色背景上的白点&#xff0c;而右侧显示纯白色部分中的黑洞。 侵蚀是从图像边界去除白色像素的过程。您可以通过使用…

运算符重载的三种实现方法

一、重载为一般函数 格式&#xff1a;返回类型 operator 运算符(参数列表) struct Complex{//定义一个复数结构&#xff1a;包括实部与虚部两部分 double real;//实部 double imag;//虚部 }; Complex operator(Complex c1,Complex c2){//对加法运算的重载&#xff1a;将运算符…