13.定时器中断

news2024/9/29 19:23:08

1.通用定时器工作过程:

2.时钟选择:

  • 内部时钟(CK_INT);
  • 外部时钟模式1:外部输入脚(TIx);
  • 外部时钟模式2:外部触发输入(ETR);
  • 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,例如可以配置一个定时器Timer1而作为一个定时器Timer2的预分频器;

3.内部时钟选择:

4.时钟计算方法:

 

 5.计数器模式:

(1)通用定时器可以向上计数、向下计数、向上向下双向计数模式:

①向上计数模式:
计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件;

②向下计数模式:
计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件;

③中央对齐模式(向上/向下计数):
计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件,然后0再从0开始重新计数。

(2)向下计数模式(时钟分频因子=1):

 (3)向上计数模式(时钟分频因子=1):

 (4)中央对齐计数模式(时钟分频因子=1  ARR=6):        

 6.定时器中断相关寄存器:

  1. 计数器当前值寄存器:TIMx_CNT;
  2. 预分频寄存器:TIMx_PSC;
  3. 自动重装载寄存器:TIMx_ARR;
  4. 控制寄存器1:TIMx_CR1;
  5. DMA中断使能寄存器:TIMx_DIER;

7.常用库函数:

  1. 定时器参数初始化:void TIM_TimeBaseInit(TIM_TypeDef* TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
  2. 定时器使能:void TIM_Cmd(TIM_TypeDef* TIMx,FunctionalState NewState);
  3. 定时器中断使能函数:void TIM_ITConfig(TIM_TypeDef* TIMx,uint16_t TIM_IT,FunctionalState NewState);
  4. 状态标志位获取和清除:                                                                                                          ①FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx,uint16_t TIM_FLAG);                       ②void TIM_ClearFlag(TIM_TypeDef* TIMx,uint16_t TIM_FLAG);                                         ③ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx,uint16_t TIM_IT);                                     ④void TIM_ClearITPendingBit(TIM_TypeDef* TIMx,uint16_t TIM_IT);

8.定时器中断实现步骤:

  1. 使能定时器时钟:RCC_APB1PeriphClockCmd();
  2. 初始化定时器,配置ARR,PSC寄存器:TIM_TimeBaseInit();
  3. 开启定时器中断,配置NVIC:void TIM_ITConfig();       NVIC_Init();
  4. 使能定时器:TIM_Cmd();
  5. 编写中断服务函数:TIMx_IRQHandler();

9.定时器中断试验:

通过定时器中断配置,每隔500ms中断一次,然后中断服务函数中控制LED实现LED1的闪烁;

(1)主函数:

#include "delay.h"
#include "led.h"
#include "timer.h"

/*
   溢出时间计算:
      ①Tout(溢出时间)=(ARR+1)(PSC+1)/TCLK;
      ②TCLK:系统时钟(72MHz)
      ③72MHz/(7199+1)=10KHz
      ④1/10KHz=0.1ms
      ⑤0.1ms*(4999+1)=500ms
*/

int main(){
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);      //设置中断优先级分组->2组
    delay_init();                                        //延时初始化
    LED_Init();                                          //LED初始化
    TIME3_Init(4999,7199);                               //定时器3中断初始化
    
    while(1){
        LED0=!LED0;
    }       
}

(2)头文件:

#ifndef __TIMER_H
#define __TIMER_H

typedef unsigned short u16;

void TIME3_Init(u16 arr,u16 psc);   //定时器3初始化


#endif

(3)定时器中断功能函数:

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "timer.h"



/*
   功能:定时器3中断初始化
   变量:arr:自动重装载值计数周期值   psc:分频系数
   返回值:无
*/
void TIME3_Init(u16 arr,u16 psc)
{
   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
   NVIC_InitTypeDef NVIC_InitStruct;
   
   
   //1.使能定时器3时钟
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
   
   //2.初始化定时器3
   TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;          //设置时钟分频因子->这里选择1分频
   TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;      //设置计数模式->这里选择向上计数
   TIM_TimeBaseInitStruct.TIM_Period=arr;                          //设置自动重装载计数周期值
   TIM_TimeBaseInitStruct.TIM_Prescaler=psc;                       //设置分频系数
   TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
   
   //3.开启定时器中断
   TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);                         //设置定时器3为更新中断
   
   //4.中断服务管理
   NVIC_InitStruct.NVIC_IRQChannel=TIM3_IRQn;                       //设置中断通道
   NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
   NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;             //抢占优先级
   NVIC_InitStruct.NVIC_IRQChannelSubPriority=3;                    //子优先级
   NVIC_Init(&NVIC_InitStruct);
   
   //5.使能定时器
   TIM_Cmd(TIM3,ENABLE);
   
}


/*
   功能:定时器3中断服务函数
   变量:无
   返回值:无
*/
void TIM3_IRQHandler(void)
{
   if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)                           //判断定时器3的中断是否是更新中断->这里指是
   {
       LED1=!LED1;                                                        //LED1闪烁
      TIM_ClearITPendingBit(TIM3,TIM_IT_Update);                          //清除中断标志位
      
   }
  
}


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

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

相关文章

【Kafka面试题1】Kafka消费者是pull(拉)还是push(推)模式,这种模式有什么好处?

Kafka消费者是pull(拉)还是push(推)模式,这种模式有什么好处? 一、概述回答 Kafka中的Producer和consumer采用的是push-and-pull模式,即Producer只管向broker push消息,consumer只管从broker pull消息,两者对消息的生…

从零用自己数据跑R3LIVE

1、相机内参标定 相机选用4mm的广角相机,相机内参标定选择用最常见的棋盘格方法,首先安装ROS自带的包 sudo apt install ros-melodic-camera-calibration 用usb_cam启动相机后进行标定 。 rosrun camera_calibration cameracalibrator.py --size 8x6…

【Linux】网络编程相关概念介绍、UDP套接字简单演示、最简单的UDP公共聊天室实现~

文章目录 [toc] 网络编程 - 套接字一些概念1. 源ip地址与目的ip地址2. 端口号 和 socket套接字 **问题 3. 源端口号和目的端口号4. 认识TCP协议基本特点5. 认识UDP协议基本特点6. 网络字节序 socket编程接口**struct sockaddr**接口演示: 简单的UDP网络通信int socket()UDP网络…

读书笔记-《ON JAVA 中文版》-摘要18[第十八章 字符串-1]

文章目录 第十八章 字符串1. 字符串的不可变2. 的重载与 StringBuilder3. 意外递归4. 字符串操作5. 格式化输出5.1 printf()5.2 System.out.format()5.3 Formatter 类5.3.1 格式化修饰符5.3.2 Formatter 转换 5.4 String.format() 6. 自我学习总结 第十八章 字符串 字符串操作…

【专题速递】更多的解决方案:传统行业不再「传统」

// 音视频技术作为企业数字化转型的关键技术与能力之一,为众多传统行业在生产、服务、管理与维护等方面提供了强有力的支持。那么,音视频技术是如何助力企业数字化转型的?7月28日LiveVideoStackCon上海站数字化与行业案例专场,为…

【AI】PyTorch安装记录及Anaconda环境配置

【AI】PyTorch安装记录及Anaconda环境配置 说下本地环境,RTX4070 12GB GPU;618刚买,不能让他闲着,配置一下炼丹环境,开始为打工人工作。为了方便后续部署模型之间依赖不冲突,所以使用Anaconda管理Python环…

【数据结构】第 1~10 章:思维导图与重点汇总

目录 一、概论 (1)思维导图 (2)常见名词 (3)数据结构的定义 (4)抽象数据类型 ADT (5)算法 (6)评价算法的好坏的因素 &am…

Python基础 —— 循环语句

如约来更新循环语句了.说到循环,有一定编程基础的小伙伴们都知道,我们最常用的循环莫过于 while循环,for循环和goto循环(不过goto也不怎么常用),所以今天就来说一说 while循环和 for循环 来看一下本文大致…

IMX6ULL系统移植篇-uboot基础命令

一. uboot 启动 当设备上电启动时,需要马上按下回车键,开发板启动会停止在 uboot的启动Log信息时刻。 这就是 uboot的命令模式,即可以输入 uboot命令进行一些操作。 二. uboot 基础命令 1. help 命令 当开发板上电启动后,马…

电脑如何设置外网内网一起使用

如果你的电脑支持连接无线网,就可以设置内网外网一起使用。一般情况下,连接无线网还是网线都是系统自动链接的,但有时候开发中需要内网外网一块使用,不用手动切换网络。 首先确保我们的电脑有双网卡,可以两个都是有线网卡&#xf…

【机械臂视觉抓取从理论到实战】

1. 概述 GR-CNN:https://paperswithcode.com/paper/antipodal-robotic-grasping-using-generative 2. 环境搭建及模型训练 GR-CNN:https://github.com/skumra/robotic-grasping 下载源码创建环境 #下载robotic-grasping源码 git clone https://github.…

CVE-2021-3493:Overlay 文件系统 Ubuntu 本地提权漏洞分析

分析此漏洞的文章非常多,在此只是记录一下复现漏洞的过程以及对漏洞的个人理解。Linux 内核漏洞有一定的准入门槛,不适合小白阅读。 基本信息 [影响范围] Ubuntu 14.04 ~20.10 [漏洞描述] Ubuntu 内核代码允许低权限用户在使用 unshare() 函数创建的…

李彦宏:AI原生应用比大模型数量更重要

6月26日,百度创始人、董事长兼首席执行官李彦宏出席“世界互联网大会数字文明尼山对话”,发表了题为 《大模型重塑数字世界》 的演讲。 大模型是当下全球科技创新的焦点,也是全球人工智能竞赛的主战场。李彦宏认为,“新的国际竞争…

箱线图概念和使用介绍

箱线图时一种针对连续型变量的统计图。通常用作比较。 箱子中间的一条线,是数据的中位数,代表了数据的平均水平。 箱子的上限和下限,分别是数据的上四分位数和下四分位数,意味着箱子包含50%的数据。因此,箱子的高度在…

23.RocketMQ之NameServer处理Broker心跳包,更新本地路由信息

NameServer处理Broker心跳包,更新本地路由信息 DefaultRequestProcessor继承自NettyRequestProcessor:处理各种客户端的请求,如果请求类型是为REGISTER_BROKER,则将请求转发到RouteInfoManager#regiesterBroker,主要是服务器端 或者客户端或者broker发送…

go语言环境安装

文章目录 环境介绍安装软件包步骤环境变量设置来一个经典的hello worldNice 最近的项目需要用到go来开发了,前几天就已经在看书了,今天是个周末,先在家里的机器上把环境搭好,特此记录一下。 环境介绍 下载地址:https:…

RRT 算法研究(附 Python / C++ 实现)

RRT 算法研究 参考 机器人路径规划、轨迹优化课程-第五讲-RRT算法原理和代码讲解 机器人路径规划之RRT算法(附C源码) RRT算法(快速拓展随机树)的Python实现 《基于改进RRT算法的路径规划研究》 《面向室内复杂场景的移动机器人快速路径规划算法研究》 理论基础 RRT&#xff0…

meb stm32开发

matlab1028b以上 stm32cubemx5.6.0以上 stm32-mat/target 教程与代码分享 - 知乎 安装好这些后,打开matlab,打开路径STM32-MAT\STM32 打开simulink,view-lib 可以看到 在STM32CUBEMX完成底层配置,生成ioc文件

UI的绘制流程

1.App的启动流程 每个App都是一个独立的进程,当一个app启动的时候,当前进程也被启动,在Android中有一个类ActivityThread,就是进程的初始类,其中main方法就是整个app的入口。ActivityThread并不是一个线程,…

Java并发编程中的JMM、3个基本属性、synchronized和volatile

1、Java内存模型JMM (Java Meemory Model) JMM规定,所有变量均存储在主内存中每个线程都有自己的工作内存,保存了该线程中用到的变量的主内存副本拷贝线程对变量的所有操作,必须在自己的工作内存中,不可直接读写主内存不同线程无法…