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

定时器概述

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();
    }
}

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

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

相关文章

力扣日记2.21-【回溯算法篇】46. 全排列

力扣日记&#xff1a;【回溯算法篇】46. 全排列 日期&#xff1a;2023.2.21 参考&#xff1a;代码随想录、力扣 46. 全排列 题目描述 难度&#xff1a;中等 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&…

Spring6学习技术|IoC|手写IoC

学习材料 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09; 有关反射的知识回顾 IoC是基于反射机制实现的。 Java反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&…

P2957 [USACO09OCT] Barn Echoes G

P2957 [USACO09OCT] Barn Echoes G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P2957 题目分析 对于求单个字符串的哈希值相当于求前缀和&#xff0c;而求单个字符串的子串的哈希值则相当于求其区间和&#xff1b; 那么只需求两个…

面试经典150题——旋转图像

"You are never too old to set another goal or to dream a new dream." - C.S. Lewis​ 1. 题目描述 2. 题目分析与解析 2.1 思路一 还是最简单的尝试模拟人的思维&#xff0c;如果对于一个普通人解决该题目&#xff0c;那就是先把第一行放在最后一列 或者 把第…

入职字节外包才一个月,我就离职了

有一种打工人的羡慕&#xff0c;叫做“大厂”。 真是年少不知大厂香&#xff0c;错把青春插稻秧。 但是&#xff0c;在深圳有一群比大厂员工更庞大的群体&#xff0c;他们顶着大厂的“名”&#xff0c;做着大厂的工作&#xff0c;还可以享受大厂的伙食&#xff0c;却没有大厂…

惠尔顿 网络安全审计系统 任意文件读取漏洞复现

0x01 产品简介 惠尔顿网络安全审计产品致力于满足军工四证、军工保密室建设、国家涉密网络建设的审计要求&#xff0c;规范网络行为&#xff0c;满足国家的规范&#xff1b;支持1-3线路的internet接入、1-3对网桥&#xff1b;含强大的上网行为管理、审计、监控模块&#xff1b…

猫毛过敏不能养猫了吗?除猫毛好的宠物空气净化器品牌有哪些?

让我们来探讨一下如何让容易过敏的家庭成员和猫咪更好地相处。很多人喜欢猫咪&#xff0c;但与它们相处一段时间后&#xff0c;可能会出现鼻塞、喷嚏和眼泪不断的过敏症状。那么&#xff0c;为什么会过敏呢&#xff1f;这是因为猫的唾液中含有Fel d1蛋白质&#xff0c;当它们舔…

回显服务器的制作方法

文章目录 客户端和服务器TCP和UDP的特点UDP socket api的使用DatagramSocketDatagramPacketInetSocketAddress API 做一个简单的回显服务器UDP版本的回显服务器TCP版本的回显服务器 客户端和服务器 在网络中&#xff0c;主动发起通信的一方是客户端&#xff0c;被动接受的这一方…

SpringBoot+Vue+MySQL:图书管理系统的技术革新

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

怀孕了要把猫送走吗?推荐一款吸猫毛神器—宠物空气净化器

相信大部分家庭都会遇到这样一个二选一的难题&#xff1a;怀孕了还能养猫吗&#xff1f;还是要把猫送走&#xff1f; 许多人担心在孕期与宠物接触可能会导致健康问题&#xff0c;主要是因为弓形虫的存在。然而&#xff0c;实际上感染弓形虫并不容易。如果你真的很担心&#xf…

绘图神器VisIt初步使用

文章目录 安装绘图图像属性 VisIt是一款用于可视化科学数据的开源软件&#xff0c;适用于大型数据集&#xff0c;并提供了丰富的可视化和分析功能。 安装 首先下载VisIt&#xff0c;然后下载一些示例以及测试数据&#xff0c;地址在github上。 下载之后安装&#xff0c;有两…

基于Python的热点分析预警系统

项目&#xff1a;基于Python的热点分析预警系统 摘 要 基于网络爬虫的数据可视化服务系统是一种能自动从网络上收集信息的工具&#xff0c;可根据用户的需求定向采集特定数据信息的工具&#xff0c;本项目通过研究爬取微博网来实现微博热点分析数据信息可视化系统功能。对于采…

二叉搜索树(二叉排序树、二叉查找树)

二叉搜索树&#xff08;二叉排序树、二叉查找树&#xff09; 一、定义二、操作&#xff08;一&#xff09;中序遍历&#xff08;二&#xff09;查找&#xff08;三&#xff09;插入&#xff08;四&#xff09;删除 三、二叉搜索树的应用四、二叉搜索树操作的性能分析五、总结 一…

CCF-B类SGP‘24 4月10日截稿!速速行动!

会议之眼 快讯 第22届SGP(Eurographics Symposium on Geometry Processing)即欧洲图形学几何处理专题讨论会将于 2024 年 6月24 -日至26日在美国麻省理工学院举行&#xff01;SGP是传播几何处理新研究想法和尖端成果的首要学术会议。作为该领域的重要学术盛事&#xff0c;SGP会…

模型转换案例学习:等效替换不支持算子

文章介绍 Qualcomm Neural Processing SDK &#xff08;以下简称SNPE&#xff09;支持Caffe、ONNX、PyTorch和TensorFlow等不同ML框架的算子。对于某些特定的不支持的算子&#xff0c;我们介绍一种算子等效替换的方法来完成模型转换。本案例来源于https://github.com/quic/qidk…

从零开始手写mmo游戏从框架到爆炸(十六)— 客户端指定回调路由与登录

导航&#xff1a;从零开始手写mmo游戏从框架到爆炸&#xff08;零&#xff09;—— 导航-CSDN博客 我们这次来把注册、登录、选择英雄&#xff0c;进入主页-选择地图的功能完善。 在这之前&#xff0c;我们还要解决一个问题&#xff0c;就是服务端往客户端发消息的路由问题…

CSS 不同颜色的小圆角方块组成的旋转加载动画

<template><!-- 创建一个装载自定义旋转加载动画的容器 --><view class="spinner"><!-- 定义外部包裹容器,用于实现整体旋转动画 --><view class="outer"><!-- 定义四个内部小方块以形成十字形结构 --><view clas…

vtk.js加载dicom,获取世界点的坐标、两点之间的距离

通过点击vtk的renderWindow&#xff0c;获取坐标点。 获取点的坐标有vtkCellPicker和vtkPointPicker两个方法&#xff0c;区别在于vtkCellPicker可以区分是否点击在模型上&#xff0c;推荐使用vtkCellPicker。 获取两点之间距离使用vtkMath的方法&#xff0c;vtkMath.distance…

阿里云k8s容器部署consul集群的高可用方案

一、背景 原本consul集群是由三个server节点搭建的&#xff0c;购买的是三个ecs服务器&#xff0c; java服务在注册到consul的时候&#xff0c;随便选择其中一个节点。 从上图可以看出&#xff0c; consul-01有28个服务注册&#xff0c;而consul-02有94个服务&#xff0c;co…

一凸包----------12,分而治之(2)

在上节中&#xff0c;两部分子凸包有重合的部分&#xff0c;不简洁。这一节是沿着某个方向&#xff0c;子凸包不重叠&#xff0c;如下图 根据以前的方法&#xff0c;很可能认为是两个子凸包上顶点与上顶点相连&#xff0c;下顶点与下顶点相连&#xff0c;形成两条支撑线&#…