day 8 TIM定时器

news2025/4/6 10:31:33

一、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.coloradmin.cn/o/2329155.html

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

相关文章

全星 研发项目管理APQP 软件:驱动汽车及制造业研发升级的数字化引擎

全星 APQP 软件:驱动汽车及制造业研发升级的数字化引擎 在汽车及制造业竞争白热化的当下,如何高效推进研发项目,同时确保严格合规,成为企业亟待解决的难题。 全星研发项目管理 APQP 软件系统,凭借卓越的功能与显著优势…

【VUE】RuoYi-Vue3项目结构的分析

【VUE】RuoYi-Vue3项目结构的分析 1. 项目地址2. RuoYi-Vue3项目结构2.1 整体结构2.2 package.json2.2.1 🧾 基本信息2.2.2 🔧 脚本命令(scripts)2.2.3 🌍 仓库信息2.2.4 📦 项目依赖(dependenc…

智能体和RPA都需要程序思维,如何使用影刀的变量?

欢迎来到涛涛聊AI, 不管AI还是RPA,都需要用到编程思想才能完成批量工作。今天研究了下影刀的变量。 变量类型 根据变量值选择相应的类型,可选择任意一种影刀所支持的数据类型 变量值 指定变量中保存的值,会根据不同的类型设置…

论文笔记(七十五)Auto-Encoding Variational Bayes

Auto-Encoding Variational Bayes 文章概括摘要1 引言2 方法2.1 问题场景2.2 变分下界2.3 SGVB估计器与AEVB算法2.4 重参数化技巧 3 示例:变分自编码器(Variational Auto-Encoder)4 相关工作5 实验6 结论7 未来工作 文章概括 引用&#xff1…

Sentinel[超详细讲解]-7 -之 -熔断降级[异常比例阈值]

📖 主要讲解熔断降级之 --- 异常比例阈值 🚀 1️⃣ 背景 Sentinel 以流量作为切入点,提供了很多的丰富的功能,例如🤗: 流量控制,熔断降级等,它能够有效的适用各个复杂的业务场景&am…

C++11观察者模式示例

该示例代码采用C11标准&#xff0c;解决以下问题&#xff1a; 消除了类继承的强耦合方式&#xff1b;通知接口使用可变参数模板&#xff0c;支持任意参数&#xff1b; 示例代码 .h文件如下&#xff1a; #include <functional> #include <string> #include <…

win10 笔记本电脑安装 pytorch+cuda+gpu 大模型开发环境过程记录

win10 笔记本电脑安装 pytorchcudagpu 大模型开发环境过程记录 文章部分内容参考 deepseek。 以下使用命令行工具 mingw64。 安装 Anaconda 安装位置&#xff1a; /c/DEVPACK/Anaconda3 然后安装 Python 3.10.16 &#xff08;略&#xff09; $ conda create -n pytorch_…

Layout Inspector平替跨平台布局分析器のAppium Inspector

引言 因为我有一个api为26的设备&#xff0c;因为 Layout Inspector 无法在 API 26 以下设备上使用&#xff0c;并且现在AS的 Hierarchy Viewer 和Android Device Monitor 均已经在SDK中剔除&#xff0c;故想再搜一个pc版的布局查看器&#xff0c;发现Appium Inspector学习成本…

常见NLP指标PPL,F1,Rouge-L,Accuracy (CLS),Accuracy (EM)总结

常见NLP指标PPL&#xff0c;F1&#xff0c;Rouge-L总结 1.PPL 2.F1 3.Rouge-L 4.Accuracy (CLS) 5.Accuracy (EM)

Redis数据结构之ZSet

目录 1.概述2.常见操作2.1 ZADD2.2 ZRANGE2.3 ZREVRANGE2.4 ZRANGEBYSCORE2.5 ZSCORE2.6 ZCARD2.6 ZREM2.7 ZINCRBY2.8 ZCOUNT2.9 ZMPOP2.10 ZRANK2.11 ZREVRANK 3.总结 1.概述 ZSet和Set一样也是String类型元素的集合&#xff0c;且不允许重复的成员&#xff0c;不同的是ZSet…

磁盘分析工具合集:告别C盘焦虑!

今天李师傅带大家盘点五款硬盘空间分析利器&#xff0c;帮你精准定位那些"吃空间"的元凶&#xff0c;让C盘告别臃肿烦恼&#xff01; 一、WizTree 这款NTFS磁盘的"透视眼"堪称效率典范。它通过直接读取硬盘主文件表(MFT)实现秒级扫描&#xff0c;1TB机械…

20250405在荣品的PRO-RK3566开发板使用Rockchip原厂的buildroot系统来适配gmac1

【暂时还没有解决让PRO-RK3566的eth0/gmac1开机就启动】 PRO-RK3566作为iperf服务器&#xff1a; rootrk3566-buildroot:/# ifconfig rootrk3566-buildroot:/# ifconfig -a rootrk3566-buildroot:/# ifconfig eth0 up rootrk3566-buildroot:/# ifconfig rootrk3566-buildroot:/…

每日一题(小白)模拟娱乐篇14

直接理解题意&#xff0c;一分钟扩散一次&#xff0c;那么2020分钟也就是需要循环2020次&#xff0c;然后加入扩散后的条件&#xff0c;每一个次扩散使方格子的总量1&#xff08;只要有一个点扩散就无需看其他的点&#xff09;&#xff0c;若干次循环过后总数之和即所有黑色格子…

使用 Python 爬取并打印双色球近期 5 场开奖数据

使用 Python 爬取并打印双色球近期 5 场开奖数据 前期准备安装所需库 完整代码代码解析 1. 导入必要的库2. 定义函数 get_recent_five_ssq 3. 设置请求的 URL 和 Headers 4. 发送请求并处理响应5. 解析 HTML 内容6. 提取并打印数据7. 错误处理 首先看下运行的效果图&#xff1a…

再见VS Code!Google IDE 正颠覆传统开发体验

云端开发的革命&#xff1a;Google Project IDX 如何颠覆传统开发体验 在软件开发领域&#xff0c;Google 最新推出的 Project IDX 绝非仅仅是另一个“基于浏览器的 VS Code”——它是一次真正的范式转变。与 VS Code、Cursor 等传统工具不同&#xff0c;IDX 是一个完全云原生的…

AI+自动化测试:如何让测试编写效率提升10倍?

文章目录 摘要传统自动化测试的痛点编写测试用例太费时间测试覆盖率难以保证UI 测试维护成本高 AI 如何优化自动化测试&#xff1f;AI 生成单元测试&#xff1a;减少重复工作&#xff0c;提高覆盖率传统方法 VS AI 方法 使用 AI 生成 Python 单元测试自动补全边界情况传统方法 …

01-STM32(介绍、工具准备、新建工程)p1-4

文章目录 工具准备和介绍硬件设备stm32简介和arm简介stm32简介STM32命名规则STM32选型STM32F103C8T6最小系统板引脚定义STM32启动配置STM32最小系统电路ARM简介 软件安装注册器件支持包安装ST-LINK驱动安装USB转串口驱动 新建工程创建stm32工程STM32工程编译和下载型号分类及缩…

Win10定时任务计划无法显示要执行的EXE任务程序界面,问题解决办法

用C#开发的一款WINFORM程序&#xff0c;在电脑测试一切顺利&#xff0c;运行结果正确。但用电脑的定时任务执行时&#xff0c;程序界面不显示&#xff0c;重启电脑、各种试都不行&#xff0c;最终问题解决。 解决办法&#xff1a; 要选“只在用户登陆时运行”&#xff0c;才能执…

STM32CubeMX-H7-12-IIC读写MPU6050模块(中)-MPU6050模块详解以及软件IIC驱动

前言 上一篇我们已经完成对IIC代码基本框架的编写&#xff0c;以及获取MPU6050的ID&#xff0c;接下来我们逐一分析这个模块的功能&#xff0c;并用IIC驱动 建议看完上一篇再来看这篇 MPU6050寄存器介绍 1.电源管理寄存器&#xff08;PWR_MGMT_1&#xff0c;地址&#xff1a;0…

springboot2.7.x整合nacos+seata

1、nacos及seata下载地址 Nacos Server 下载 | Nacos 官网 Seata Java Download | Apache Seata 这里的seata版本用2.1.0版本。 2、启动nacos D:\本地-seata-nacos\nacos-server\bin>startup.cmd -m standalone 3、修改seata的conf下的application的内容 这里的数据库…