day 8 TIM定时器

一、STM32 定时器概述

1. 定时器的概述定时器的基本功能,但是 STM32 的定时器除了具有定时功能之外,也具有定时器中断功能,还具有输入捕获(检测外部信号)以及输出比较功能(输出不同的脉冲),可以利用 STM32定时器输出某种频率的脉冲信号来控制产品(控制灯的亮度、控制直流电机的转速、控制舵机的角度.......)

2. 定时器的种类STM32 由于资源丰富,所以提供了多种定时器,一共提供 14 个定时器(不包含系统定时器、不包含看门狗定时器),分为高级定时器(TIM1 和 TIM8)、通用定时器(TIM2~TIM5 +TIM9~TIM14,一共 10 个)、基本定时器(TIM6 和 TIM7)

3. 定时器的使用

基本定时器STM32 提供 TIM6 和 TIM7 作为基本定时器,属于 STM32 内部资源,都是 16bit 定时器,并没有和 GPIO 引脚连接,TIM6 和 TIM7 都挂载在 APB1 总线下,而 APB1 定时器时钟频率为84MHZ。     

 时基单元包括:

1计数器寄存器         CNT       记录当前计数的次数

2预分频器寄存器        PSC        设置计数一次的周期

3自动重装载寄存器    ARR            设置定时的次数(定时时间)

TIM6 的时钟频率为 84MHZ,如果想要降低频率,公式:1MHZ = 84MHZ /(83+1),频率就降为 1MHZ,也就意味着 TIM_CNT 寄存器累计计数 1 次的时间是 1us,如果打算利用TIM6 定时 1ms,也就是说 TIM_ARR 寄存器的值应该设置为 1000-1,只要 TIM_CNT == TIM_ARR,
就说明时间到了,如果时间到了则 TIM_CNT 清 0,然后重新开始计数

对时钟进行分频的目的就是为了延长定时时间

1设置定时器的分频系数 TIM_Prescaler 范围 0x0000 and 0xFFFF

设置分频n,分频系数n-1

2设置定时器的计数模式TIM_CounterMode 基本定时器只能选择向上计数

3设置定时器的计数周期 TIM_Period 指的是重载寄存器中的值 0x0000 and 0xFFFF

4设置定时器的时钟分频因子 TIM_ClockDivision 在输入捕获的采样使用 不需要设置

5设置定时器的重复计数器 TIM_RepetitionCounter 只有高级定时器需要设置

设置中断源函数:

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)

函数参数参数一:TIMx 打算产生中断的定时器号 如 TIM6

参数二:TIM_IT 指定定时器的中断源 一般为 TIM_IT_Update 表示更新时中断

参数三:NewState 打开或关闭中断源 ENABLE or DISABLE

初始化定时器:

可以调用 TIM_TimeBaseInit 函数实现函数原型

voidTIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct)函数参数参数一:TIMx 打算配置参数的定时器号 如 TIM6

参数二:TIM_TimeBaseInitStruct 指的是配置的参数信息 记得取地址 &

#include "stm32f4xx.h"  

__IO uint32_t TimingDelay;

//LED初始化
void LED_Init(void)
{
    GPIO_InitTypeDef   GPIO_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
    
    GPIO_InitStructure.GPIO_Mode     = GPIO_Mode_OUT;            //输出模式
    GPIO_InitStructure.GPIO_OType    = GPIO_OType_PP;            //推挽输出
    GPIO_InitStructure.GPIO_Speed    = GPIO_Speed_100MHz;        //输出速率
    GPIO_InitStructure.GPIO_PuPd     = GPIO_PuPd_NOPULL;            //无上下拉
    GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_9;                //引脚编号
    GPIO_Init(GPIOF, &GPIO_InitStructure);
    
    GPIO_SetBits(GPIOF,GPIO_Pin_9); //默认不亮

}
//TIM6定时器的初始化
void TIM6_Init(void)
{
    TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure ;
    
    NVIC_InitTypeDef   NVIC_InitStructure ;
//1.打开时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
//2.配置定时时间,定时200ms,APB1定时时钟84MHZ  1us数84次  200ms:  84*1000*200(次)
//                定时200ms,经过8400分频,8400us数84次,即100us数1次,1ms=1000us,10次即可,200ms 2000次

    TIM_TimeBaseStructure.TIM_Prescaler = 8400-1;//预分频
    TIM_TimeBaseStructure.TIM_Period = 2000-1;//计数周期
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数模式,向上计数
    TIM_TimeBaseInit ( TIM6 , &TIM_TimeBaseStructure);
    
//3.配置NVIC (中断通道+优先级)    
    NVIC_InitStructure.NVIC_IRQChannel = TIM6_DAC_IRQn;//中断通道去f4xx.h里面找
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断通道
    NVIC_Init(&NVIC_InitStructure);
    
//4.选择TIM6的中断源
 TIM_ITConfig(TIM6,TIM_IT_Update, ENABLE);//更新事件
 
 //5.使能定时器
 TIM_Cmd(TIM6,ENABLE);

}

void Delay_ms(__IO uint32_t nTime)
{
    TimingDelay=nTime;
    while(TimingDelay);

}

int main()
{
    //1.硬件初始化
    LED_Init();
    TIM6_Init();
    

    
    
    //2.进入死循环
    while(1)
    {
        
    }
    
}

void TIM6_DAC_IRQHandler(void)
{
    //检测中断是否发生
    if (TIM_GetITStatus(TIM6, TIM_IT_CC1) != RESET)
    {
        TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);//清空中断标志
        //异常处理

        GPIO_ToggleBits(GPIOF,GPIO_Pin_9);//翻转
    }

}
 

优化:

 通用定时器

STM32 一共提供 10 个通用定时器(TIM2~TIM5、TIM9~TIM14),TIM2 和 TIM5 是 32bit 定时器,其他的定时器都是 16bit 定时器。

     TIM2~TIM5 的计数方式有多种可以选择,分别为递增计数、递减计数、递增/递减计数。

递增计数:计数器从 0 计数到自动重载值(TIMx_ARR 寄存器的内容),然后重新从 0 开始计数并生成计数器上溢事件。

递减计数:计数器从自动重载值(TIMx_ARR 寄存器的内容)开始递减计数到 0,然后重新从自动重载值开始计数并生成计数器下溢事件。

中心对齐:计数器从 0 开始计数到自动重载值(TIMx_ARR 寄存器的内容)— 1,生成计数器上溢事件;然后从自动重载值开始向下计数到 1 并生成计数器下溢事件。之后从 0 开始重新计数。  

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

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

相关文章

Spring Boot 中使用 Redis:从入门到实战

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

hi3516cv610通过menuconfig关闭的宏记录

hi3516cv610通过menuconfig关闭的宏记录 defconfig为 hi3516cv610_debug_defconfig或hi3516cv610_new_defconfig 1、 变为 2、 变为 3、 变为 4、 变为 5、 变为

WebSocket 详解:构建一个复杂的实时聊天应用

文章目录 一、前言二、WebSocket 基础2.1 WebSocket 与 HTTP 的区别2.2 WebSocket 的优点 三、搭建 WebSocket 服务端3.1 安装 ws 和 redis 库3.2 创建 WebSocket 服务端3.3 创建用户身份验证 四、前端实现 WebSocket 客户端4.1 创建 Vue 3 项目4.2 实现 WebSocket 连接和用户注…

【JavaEE进阶】Spring AOP入门

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗 如有错误,欢迎指出~ AOP是Spring框架的第⼆⼤核⼼(第⼀⼤核⼼是 IoC) 什么是AOP? • AspectOrientedProgramming(⾯向切⾯编程) 什么是⾯向切⾯编程呢? 切…

算法思想之双指针(一)

欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之双指针(一) 发布时间:2025.4.4 隶属专栏:算法 目录 双指针算法介绍对撞指针:快慢指针: 例题移动零题目链接题目描述算法思路代码实现 复写零题目链接题目描…

【11408学习记录】英语写作黄金模板+语法全解:用FTC数据泄漏案掌握书信结构与长难句拆解(附思维导图)

2025.04.04 英语写作书信写作第一段私人信件公务信函 语法总结——简单句简单句的核心:谓语动词的变化词性的拓展限定词 形容词与副词介词短语 成分的扩展同位语插入语 非谓语动词 每日一句词汇 第一步:辨别第二步:断开第三步:简化…

手机显示5GA图标的条件

最近有星友问在什么情况下才能显示5G-A?虽然这个我也不知道,但是我有几个运营商的5G终端白皮书,从上面就可以找到答案。 如上是几个运营商显示5G-A的条件,基本上考虑的都是3CC的情况,联通还有考虑200M CA 2CC的场景&am…

网络:华为数通HCIA学习:IP路由基础

华为HCIA学习 IP路由基础路由协议或路由种类以及对应路由的优先级按工作区域分类:按工作机制及算法分类:路由的优先级路由器选择最优路由的顺序是什么? 前言自治系统LAN和广播域路由选路IP路由表路由度量建立路由表最长匹配原则路由器转发数据包总结 IP…

Docker 镜像相关的基本操作

一、Docker 镜像基本操作 1. 查找镜像 命令&#xff1a; docker search <镜像名称> 示例&#xff1a;查找 CentOS 镜像&#xff1a; docker search centos 命令解释&#xff1a; 默认从 Docker Hub 官方仓库上搜索镜像。搜索结果包含多个列&#xff1a; NAME&…

Linux文件特殊权限管理及进程和线程

acl 权限优先级 拥有者 > 特殊指定用户 > 权限多的组 >权限少的组 > 其他 mask阈值 mask是能够赋予指定用户权限的最大阀值 当设定完毕文件的acl列表之后用chmod缩小了文件拥有组的权力 mask会发生变化 恢复&#xff1a; setfacl -m m: 权限 :rwx 文件/…

NVIDIA AgentIQ 详细介绍

NVIDIA AgentIQ 详细介绍 1. 引言 NVIDIA AgentIQ 是一个灵活的库&#xff0c;旨在将企业代理&#xff08;无论使用何种框架&#xff09;与各种数据源和工具无缝集成。通过将代理、工具和代理工作流视为简单的函数调用&#xff0c;AgentIQ 实现了真正的可组合性&#xff1a;一…

算法设计与分析5(动态规划)

动态规划的基本思想 将一个问题划分为多个不独立的子问题&#xff0c;这些子问题在求解过程中可能会有些数据进行了重复计算。我们可以把计算过的数据保存起来&#xff0c;当下次遇到同样的数据计算时&#xff0c;就可以查表直接得到答案&#xff0c;而不是再次计算 动态规划…

怎么理解量子比特模型,迁移到量子计算机开始编程

怎么理解量子比特模型&#xff0c;迁移到量子计算机开始编程 视频链接&#xff1a; 好的现在是2025年的3月最后一天,3月31号,今天我们讨论的话题是量子编程,也就是在量子计算机上,使用特定的语言进行软件开发。当然我们要讨论的,不是,量子编程的某一门语言的技术细节,而是考虑…

使用Expo框架开发APP——详细教程

在移动应用开发日益普及的今天&#xff0c;跨平台开发工具越来越受到开发者青睐。Expo 是基于 React Native 的一整套工具和服务&#xff0c;它能够大幅降低原生开发的门槛&#xff0c;让开发者只需关注业务逻辑和界面实现&#xff0c;而不用纠结于复杂的原生配置。本文将从零开…

windows技术基础知识

NT架构 NT 就是new techonology 的英文单词缩写&#xff0c;是微软1993年推出操作系统的重大升级&#xff0c;如内存管理&#xff0c;安全机制&#xff0c;多任务&#xff0c;多线程支持。在此之前操作系统都是基于MS-DOS上面的图形化界面&#xff0c;只有有限的内存管理和多任…

迪杰斯特拉+二分+优先队列+拓扑+堆优化(奶牛航线Cowroute、架设电话线dd、路障Roadblocks、奶牛交通Traffic)

原文地址 https://fmcraft.top/index.php/Programming/2025040402.html 主要算法 迪杰斯特拉Dijkstra 题目列表 P1&#xff1a;奶牛航线Cowroute 题目描述 题目描述 Bessie已经厌倦了农场冬天的寒冷气候&#xff0c;她决定坐飞机去更温暖的地方去度假。不幸的是&#xf…

#Liunx内存管理# 在32bit Linux内核中,用户空间和内核空间的比例通常是3:1,可以修改成2:2吗?

在32位Linux内核中&#xff0c;用户空间和内核空间的3:1默认比例可以修改为2:2&#xff0c;但需要权衡实际需求和潜在影响。以下是具体分析&#xff1a; 一、修改可行性 1.技术实现 通过内核启动参数调整虚拟地址空间划分&#xff0c;例如在GRUB配置中添加mem2G参数&#xff0c…

JAVA:使用 Curator 进行 ZooKeeper 操作的技术指南

1、简述 Apache Curator 是一个基于 ZooKeeper 的 Java 客户端库&#xff0c;它极大地简化了使用 ZooKeeper 的开发工作。Curator 提供了高层次的 API&#xff0c;封装了很多复杂的 ZooKeeper 操作&#xff0c;例如连接管理、分布式锁、Leader 选举等。 在分布式系统中&#…

Julia语言的测试覆盖率

Julia语言的测试覆盖率探讨 引言 在现代软件开发中&#xff0c;测试是确保软件质量的重要环节。随着软件的复杂度不断增加&#xff0c;测试覆盖率作为衡量测试质量的一个重要指标&#xff0c;受到了越来越多开发者的关注。Julia语言作为一种高性能的动态编程语言&#xff0c;…

【万字总结】前端全方位性能优化指南(八)——Webpack 6调优、模块联邦升级、Tree Shaking突破

构建工具深度优化——从机械配置到智能工程革命 当Webpack配置项突破2000行、Node进程内存耗尽告警时,传统构建优化已触及工具链的物理极限:Babel转译耗时占比超60%、跨项目模块复用催生冗余构建、Tree Shaking误删关键代码引发线上事故……构建流程正从「工程问题」演变为「…