Day04 嵌入式---基本定时器

news2024/11/17 10:43:37

定时器概述

1、软件定时原理

使⽤纯软件的⽅式实现定时功能。

存在的问题:定时不太精准。CPU死等。

1)压栈出栈需要花费时间

2)ARM流⽔线体系架构的原因

2、定时器定时原理

使用精准的时基,通过硬件方式,实现定时功能

时基单元:

分频模块(PSC):对外来的时钟进⾏分频。

计数模块(CNT):对来⾃分频模块输出的时钟脉冲进⾏计数。

⾃动重装载模块(ARR):它存储的是计数器的⽬标值,计数器每次累加就⽐较⼆者,⼆者相等计数器溢

出,当计数器溢出时,然后清零计数器寄存器。

核心:计时器

特性表:

常规定时器个数:TIM1 ~ TIM14 ⼗四个定时器

基本定时器:TIM6 TIM7

通⽤定时器:TIM2-TIM5 TIM9-TIM14

⾼级定时器:TIM1 TIM8

定时器类型定时器计数模式预分频系数产生DMA请求捕获/比较通道互补输出
基本定时器TIM6,TIM7161-65536可以0
通用定时器TIM2,TIM3,TIM4,TIM5161-65536可以4
高级定时器TIM1,TIM8161-65536可以4

3、定时器分类

计数模式和溢出条件

基本定时器

1、概念

STM32F407 基本定时器由时钟源、控制器、时基单元组成。 有两个基本定时器 TIM6 和 TIM7,它们

的功能完全相同,资源是完全独⽴的,可以同时使⽤。

2、特性

<1>16位的递增计数器。(计数值:0-65535)

<2>16位的预分频器。(分频系数:1-65536)

<3>可以发出⼀个触发信号,触发DAC进⾏数模转换

<4>在事件更新时(计数器溢出),可以产⽣中断 和 DMA请求

框图

溢出条件:CNT == ARR

时钟源

<1>定时器的核⼼是计算器,要实现计数功能,⾸先要给它⼀个时钟源。基本定时器时钟挂

载在 APB1 总线,所以它的时钟来⾃于 APB1 总线,但是基本定时器时钟不是直接由 APB1总线直

接提供,⽽是先经过⼀个倍频器。

<2>当 APB1 的预分频器系数为 1 时,这个倍频器系数为 1,当 APB1 的预分频器系数≥2

分频时,这个倍频器系数就为 2 。

<3>我们知道APB1的分频系数为4,≥2,所以,倍频系数为2,基本定时器的时钟源为 42

x2=84MHZ

控制器:控制定时器复位、使能、计数等功能之外,还可以⽤于触发 DAC 转换。

时基单元

<1>fCK_CNT的时钟计算: fCK_PSC / (PSC[15:0]+1)

<2>预分频器寄存器(TIMx_PSC)可以在运⾏过程中修改它的数值,新的预分频数值将在下

⼀个更新事件时起作⽤。

<3>影⼦寄存器:实际起作⽤的寄存器,不可直接访问。当更新事件发⽣时,值才写⼊影⼦

寄存器(可配置)。

定时器中断配置

<1>开启TIM时钟, RCC_APB1PeriphClockCmd();//根据不同定时器选择对应时钟函数

<2>配置NVIC, NVIC_Init();

<3>配置TIM,TIM_TimeBaseInit();

<4>开启中断。TIM_ITConfig();

<5>使能定时器:TIM_ITCmd();

<6>重写中断函数,TIM6_DAC_IRQHandler()

<7>清除中断标志位。void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);

时间


Tout:溢出时间,即定时多长时间
TIMxCLK:定时器时钟频率

  1. //定时器时钟源 TIMxCLK = 2 * PCLK1 25     
  2. //        PCLK1 = HCLK / 4 26     
  3. //        => TIMxCLK=HCLK/2=SystemCoreClock/2=84MHz 

ARR:定时器周期,初始化结构体时用 TIM_Period 表示

PSC:预分频大小,初始化结构体时用 TIM_Prescaler 表示
 
比如我们需要一个 1s 周期的定时器,具体这两个寄存器值该如何设置。

假设,我们先设置 TIMx_ARR寄存器值为 9999 ,即当 TIMx_CNT 从 0 开始计算,刚好等于 9999 时生成事件,总共计数 10000 次,那么如果此时时钟源周期 为 100us 即可得到刚好 1s 的定时周期。

接下来问题就是设置 TIMx_PSC 寄存器值使得 CK_CNT 输出为 100us 周期 (10000Hz) 的时钟。预分频器的输入时钟 CK_PSC 为 84MHz,所以设置预分频器值为 (8400-1) 即可满 足。

实验

使⽤基本定时器实现定时中断的功能,当计数事件溢出时,点亮LED。

void Tim_Init()
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
    NVIC_InitTypeDef NVIC_InitStruct1;
    NVIC_InitStruct1.NVIC_IRQChannel=TIM6_DAC_IRQn;
    NVIC_InitStruct1.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStruct1.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_InitStruct1.NVIC_IRQChannelSubPriority=1;
    NVIC_Init(&NVIC_InitStruct1);
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct1;
    TIM_TimeBaseInitStruct1.TIM_Period=4999;
    TIM_TimeBaseInitStruct1.TIM_Prescaler=8399;
    TIM_TimeBaseInit(TIM6,&TIM_TimeBaseInitStruct1);
    TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); //定时中断配置
  TIM_Cmd(TIM6,ENABLE); //使能定时器
}
void TIM6_DAC_IRQHandler(void) //重写定时器中断函数
{
 if(TIM_GetITStatus(TIM6,TIM_IT_Update) == SET)
 {
 
 GPIO_ToggleBits(GPIOF,GPIO_Pin_9); //翻转电平
 GPIO_ToggleBits(GPIOF,GPIO_Pin_10);
 TIM_ClearITPendingBit(TIM6,TIM_IT_Update);
 } 
}
int main()
{
    Tim_Init();
    Led_Init();
    Led1_Close();
    Led2_Close();
    while(1)
    {
              TIM6_DAC_IRQHandler();
    }
}

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

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

相关文章

k-邻近算法(kNN)

目录 k-近邻算法概述 k-近邻算法的一般流程 kNN算法伪代码 k-近邻算法概述 优点&#xff1a;精度高、对异常值不敏感、无数据输入假定 缺点&#xff1a;计算复杂度高、空间复杂度高 适用数据范围&#xff1a;数值型和标称型 k-近邻算法的一般流程 &#xff08;1&#x…

mybatis数据操作语句

//基于注解 Mapper public interface reboudapt {Select("select * from dept")List<dept> huoqudept();//删除语句Delete("delete from dept where id #{id}")void deletesc(Integer id);//增加语句Insert("insert into dept(name, create_t…

Kubernetes服务网络Ingress网络模型分析、安装和高级用法

文章目录 1、Ingres简介2、Ingres网络模型分析3、安装Ingress4、使用4.1、搭建测试环境4.2、域名访问4.3、路径重写&#xff08;高级用法&#xff09;4.4、流量限制&#xff08;高级用法&#xff09; 5、总结 1、Ingres简介 Ingress翻译过来是“入口”的意思&#xff0c;也就是…

如何使用CanaryTokenScanner识别Microsoft Office文档中的Canary令牌和可疑URL

关于CanaryTokenScanner CanaryTokenScanner是一款功能强大的Canary令牌和可疑URL检测工具&#xff0c;该工具基于纯Python开发&#xff0c;可以帮助广大研究人员快速检测Microsoft Office和Zip压缩文件中的Canary令牌和可疑URL。 在网络安全领域中&#xff0c;保持警惕和主动…

小程序端学习

P2 创建Uni-app 分离窗口 一样的Ctrl S P3 细节知识点 创建新的小程序页面

Vulhub 练习 DC-4靶机完整复现

1.工具 kali:攻击机 IP地址&#xff1a;192.168.200.4 DC-4&#xff1a;靶机 IP地址&#xff1a;暂时未知 2.注意 这里搭建环境两台机器应该选用同类的网络连接方式&#xff1a;这里两台的连接方式为模式 二、信息收集 1.主机发现 找寻同网段下存活的主机&#xff08;可…

推荐几款项目经理常用的项目管理软件

随着科技的发展和项目需求&#xff0c;项目管理工具成为了确保工作顺利进行的关键。市场上有许多优秀的免费项目管理工具&#xff0c;它们功能强大、易于使用&#xff0c;并可以帮助团队更有效地规划、组织、执行和监控项目。以下是几款深受项目经理欢迎&#xff0c;好用且免费…

优化特征工程:创造性转换与有效处理

目录 前言1 利用领域知识2 多项式特征2.1 多项式特征的引入2.2 避免过拟合的策略2.3 模型解释性与多项式特征 3 缺失值处理3.1 填充缺失值的策略3.2 删除缺失值的考虑3.3 模型预测缺失值的应用 4 标准化和归一化4.1 标准化的应用4.2 归一化的适用场景4.3 特征缩放的注意事项 结…

【扩散模型:医学影像中的调查】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;深度学习 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 去噪扩散模型 去噪扩散模型是一类生成模型&#xff0c;最近在各种深度学习问题中引起了极大的兴趣。扩…

【day02】每天三道 java后端面试题:Java、C++和Go的区别 | Redis的特点和应用场景 | 计算机网络七层模型

文章目录 1. Java、C和 Go 语言的区别&#xff0c;各自的优缺点&#xff1f;2. 什么是Redis&#xff1f;Redis 有哪些特点&#xff1f; Redis有哪些常见的应用场景&#xff1f;3. 简述计算机网络七层模型和各自的作用&#xff1f; 1. Java、C和 Go 语言的区别&#xff0c;各自的…

干货分享 | TSMaster 序列发送模块在汽车开发测试中的应用

众所周知&#xff0c;序列发送模块可以不需要脚本代码实现测试中特定控制报文序列的发送&#xff0c;该模块多用于循环顺序控制的测试案例中。序列发送模块的常用场景&#xff0c;主要是针对一些新开发的产品需要通过该模块来验证产品功能等等。本文重点和大家分享一下关于TSMa…

Java SourceDataLine 播放音频 显示频谱

Java SourceDataLine 播放MP3音频 显示频谱 1 添加依赖2 快速傅里叶变换2.1 FFT.java2.2 Complex.java 3 音频播放3.1 Player.java3.1 XPlayer.java 4 显示频谱5 结果 项目Value音频格式 添加依赖*.wav(JDK 原生支持)*.pcm(JDK 原生支持)*.au(JDK 原生支持)*.aiff(JDK 原生支持…

【算法与数据结构】200、695、LeetCode岛屿数量(深搜+广搜) 岛屿的最大面积

文章目录 一、200、岛屿数量1.1 深度优先搜索DFS1.2 广度优先搜索BFS 二、695、岛屿的最大面积2.1 深度优先搜索DFS2.2 广度优先搜索BFS 三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、200、岛屿数量 1.1 深度优先搜…

C#算法(12)—对图像像素做X/Y方向的偏移

我们在上位机开发领域有时候需要对获取的图像的像素做整体的偏移,比如所有像素在X方向上偏移几个像素,或者所有像素在Y方向上偏移几个像素,本文就是开发了像素整体偏移算法来解决这个问题。 比如有一个图像大小为3*3,像素值如下图1,如果我想实现将这个幅图像的像素整体往右…

[ Python+OpenCV+Mediapipe ] 实现对象识别

一、写在前面 本文所用例子为个人学习的小结&#xff0c;如有不足之处请各位多多海涵&#xff0c;欢迎小伙伴一起学习进步&#xff0c;如果想法可在评论区指出&#xff0c;我会尽快回复您&#xff0c;不胜感激&#xff01; 所公布代码或截图均为运行成功后展示。 二、本文内容…

计网 - 域名解析的工作流程

文章目录 Pre引言1. DNS是什么2. 域名结构3. 域名解析的工作流程4. 常见的DNS记录类型5. DNS安全6. 未来的发展趋势 Pre 计网 - DNS 域名解析系统 引言 在我们日常使用互联网时&#xff0c;经常会输入各种域名来访问网站、发送电子邮件或连接其他网络服务。然而&#xff0c;我…

构建React TodoList应用:管理你的任务清单

构建React TodoList应用&#xff1a;管理你的任务清单 在日常生活和工作中&#xff0c;任务管理是一项至关重要的任务。为了更好地组织和管理我们的工作和生活&#xff0c;我们需要一个高效而简单的任务管理工具。本文将介绍如何使用React框架构建一个功能丰富的TodoList应用&…

C++动态分配内存知识点!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家好呀&#xff0c;又是分享干货的时间&#xff0c;今天我们来学习一下动态分配内存。 文章目录 1.动态分配内存的思想 2.动态分配内存的概念 2.1内存分配函数 2.2动态内存的申请和释放 2.3内存碎片问…

新手学习Cesium的几点建议

Cesium是当前非常火热的三维数字地球开发框架&#xff0c;很多公司基于Cesium做项目以及形成了自己的产品&#xff0c;关于Cesium的学习&#xff0c;有诸多网站、书籍、学习资料甚至培训教材&#xff0c;这里不再详细推荐&#xff0c;从学习Cesium的角度&#xff0c;资料和教程…

web开发中的长度单位详解

1、长度单位包括哪些&#xff1f; 长度单位&#xff1a;例如&#xff0c;厘米、毫米、英寸。还有像素&#xff08;px&#xff09;&#xff0c;元素的字体高度&#xff08;em&#xff09;、字母x的高度&#xff08;ex&#xff09;、百分比&#xff08;%&#xff09;等这些单位&…