STM32 定时器中断

通用定时器工作过程:
在这里插入图片描述
时钟选择:

计数器时钟可以由下列时钟源提供:

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

内部时钟选择
在这里插入图片描述
在这里插入图片描述
时钟计算方法:
在这里插入图片描述默认调用SystemInit函数情况下:
SYSCLK=72M
AHB时钟=72M
APB1时钟=36M
所以APB1的分频系数=AHB/APB1时钟=2
所以,通用定时器时钟CK_INT=2*36M=72M

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

  • 向下计数模式(时钟分频因子=1(意思就是:CK_PSC=CK_CNT))

在这里插入图片描述在这里插入图片描述

  • 向上计数模式(时钟分频因子=1)
    在这里插入图片描述
    在这里插入图片描述

  • 中央对齐计数模式(时钟分频因子=1 ARR=6)
    在这里插入图片描述
    在这里插入图片描述
    定时器中断实验相关寄存器:

  • 计数器当前值寄存器CNT
    在这里插入图片描述

  • 预分频寄存器TIMx_PSC

在这里插入图片描述

  • 自动重装载寄存器(TIMx_ARR)
    在这里插入图片描述
  • 控制寄存器1(TIMx_CR1)
    在这里插入图片描述
  • DMA中断使能寄存器(TIMx_DIER)
    在这里插入图片描述

常用库函数

定时器参数初始化:

 void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
ypedef struct
{uint16_t TIM_Prescaler;//预分频系数的设置      uint16_t TIM_CounterMode;//计数模式   uint16_t TIM_Period;//自动装载值uint16_t TIM_ClockDivision;//输入捕获会用到 uint8_t TIM_RepetitionCounter;//高级定时器会用到
} TIM_TimeBaseInitTypeDef; 
TIM_TimeBaseStructure.TIM_Period = 4999;
TIM_TimeBaseStructure.TIM_Prescaler =7199; 
TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1; 
TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up; 
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 

定时器使能函数:

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)

定时器中断使能函数:

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

状态标志位获取和清除:

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

定时器中断实现步骤:

  • 能定时器时钟。
 RCC_APB1PeriphClockCmd();
  • 初始化定时器,配置ARR,PSC。
 TIM_TimeBaseInit();
  • 开启定时器中断,配置NVIC。
void TIM_ITConfig();NVIC_Init();
  • 使能定时器。
TIM_Cmd();
  • 编写中断服务函数。
TIMx_IRQHandler();//中断函数要判断中断标志位,和手动清除中断标志位
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

Tout(溢出时间)=(ARR+1)(PSC+1)/Tclk

其中arr为你重装的值,

psc是预分频计时器的值(预分频系数),

Tclk是时钟频率

Tclk/(psc+1)是定时器的时钟

(psc+1))/Tclk*1是计算的计数器 减少/增加 一个数所用的时间;

那么(psc+1))/Tclk*(arr+1)就是一次定时器的时间:

然后继续重装arr再次计数,计时:

就构成一个循环;

  • TIM2-TIM5的时钟不是直接来自于APB1,而是来自于输入为APB1的一个倍频器。这个倍频器的作用是:当APB1的预分频系数为1时,这个倍频器不起作用,当APB1的预分频系数为其他数值时(即预分频系数为2、4、8或16),这个倍频器起作用,定时器的时钟频率等于APB1的频率的2倍。
  • 分频系数就是对定时器时钟进行多少分频之后在使用,最好设置为定时器时钟的倍数,方便运算;重新装载值是计算这么多值,时间到了之后重新开始计算的值,每一次计数的时间为分频之后时钟的到时;

假设定时器时钟为72M,分频系数设置为7200-1,那现在定时器的时钟为10kHz,每计一个数花费1/(10000)秒,重装值设置为5000-1,那一次溢出的时间为500ms。
分频值是是指你将系统时钟的频率减小,假设时钟频率是 72Mhz,然后分频值是 7199,现在你的定时器值就是 10kHz,表示每计一个数,然后过了 1/(10^4)秒,然后你的重装值就是你的时间了,如果值是 9999,就表示定时时间为 1s。

定时器配置代码:

void TIM4_Init(u16 ar,u16 rs)
{TIM_TimeBaseInitTypeDef TIM_InitStrue;NVIC_InitTypeDef NVIC_InitStrue;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能定时器时钟TIM_InitStrue.TIM_Period=ar;//自动装载值TIM_InitStrue.TIM_Prescaler=rs;//预分频系数的设置TIM_InitStrue.TIM_CounterMode=TIM_CounterMode_Up;TIM_InitStrue.TIM_ClockDivision=TIM_CKD_DIV1;//设置时钟分割:TDTS = Tck_timTIM_TimeBaseInit(TIM4,&TIM_InitStrue);//初始化定时器,对定时器进行配置TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);//开启定时器中断NVIC_InitStrue.NVIC_IRQChannel=TIM4_IRQn;NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStrue.NVIC_IRQChannelSubPriority=2;NVIC_Init(&NVIC_InitStrue);//初始化中断,设置中断的优先级TIM_Cmd(TIM4,ENABLE);//使能定时器
}void TIM4_IRQHandler(void)
{if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET){LED1=!LED1;TIM_ClearITPendingBit(TIM4,TIM_IT_Update);//清除中断标志位}
}	

实验现象:LED0闪烁,时间间隔就是定时器的溢出时间

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

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

相关文章

Debian8.3.0下安装Odoo8.0步骤

Debian8.3.0下安装Odoo8.0的方法 假设你已经安装好了Debian 系统,使用root帐号执行如下命令 # apt-get update && apt-get upgrade # Install system updates # apt-get install sudo # Make sure sudo is installed 使用如下命令来创建一个Odoo用户&am…

STM32 PWM输出实验

定时器用来产生PWM输出: STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样,STM32 最多可以同时产生…

docker镜像和容器区别

docker镜像 docker容器,容器是用镜像创建的运行实例

域名相关的一些基础知识

DNS DNS,Domain Name System或者Domain Name Service(域名系统或者域名服务)。域名系统为Internet上的主机分配域名地址和IP地址。由于网络中的计算机都必须有个IP地址,这样相互之间才能通信,但让我们记住一大串的IP地址来访问网站显然是不可…

定时器输入捕获实验

输入捕获简介: 输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能。STM32 的输入捕获,简单的说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变&a…

Linux查看内置命令和非内置命令帮助的几种方法(man、help、info)

❤️作者主页:IT技术分享社区 ❤️作者简介:大家好,我是IT技术分享社区的博主,从事C#、Java开发九年,对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉: 数据库领域优质创作者🏆&#x…

电容触摸按键 实验

RC充放电电路原理: RC电路充放电公式: Vt V0(V1-V0)* [1-exp(-t/RC)]V0 为电容上的初始电压值; V1 为电容最终可充到或放到的电压值; Vt 为t时刻电容上的电压值。如果V0为0,也就是从0V开始充…

tomcat调优方案Maximum number of threads (200) created for connector with address null and port 8091...

1.tomcat6大并发出现:INFO: Maximum number of threads (200) created for connector with address null and port 8091 说明:最大线程数错误 解决方案:使用线程池,用较少的线程处理较多的访问,可以提高tomcat处理请…

SFTP是什么?与FTP之间有什么区别

什么是SFTP? SFTP是一种安全的文件传输协议,一种通过网络传输文件的安全方法;它确保使用私有和安全的数据流来安全地传输数据。 SFTP要求客户端用户必须由服务器进行身份验证,并且数据传输必须通过安全通道(SSH&#x…

C++基础( C++初识、数据类型、运算符、程序流程结构、)

前言&#xff1a; C专栏笔记来源于观看视频笔记 配套视频&#xff1a; https://www.bilibili.com/video/BV1et411b73Z?p16 基本代码框架&#xff1a; #include <iostream> using namespace std; int main() {system("pause");//等待程序return 0; }输出Hell…

C#判断某天是否是周末或者节假日示例

/// <summary> /// 判断是不是周末/节假日 /// </summary> /// <param name"date">日期</param> /// <returns>周末和节假日返回true&#xff0c;工作日返回false</returns> public static async Task<bool> IsHolidayByD…

查看docker版本命令docker version

查看docker版本 docker version

spring security原理

spring security通过一系列过滤器实现其功能&#xff0c;入口过滤器如下&#xff08;web.xml&#xff09;&#xff1a; <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilt…

程序员太牛了 公司年会整成代码讨论会

作者丨前端小乔 https://blog.csdn.net/weixin_44330260/article/details/86478512 公司年底年会&#xff0c;被程序员开成代码讨论大会&#xff0c;是一种什么样的体验&#xff01;最近某公司举行了一场年会&#xff0c;本来热热闹闹&#xff0c;结果被程序员给搅煳了&#xf…

嵌入式C语言基础(一)

嵌入式C语言基础&#xff1a; system函数&#xff1a;功能是运行windows命令 #include <stdio.h> #include <stdlib.h> int main() {//main是程序的入口&#xff0c;操作系统运行程序先找mainsystem("ipconfig");//在windows下ipconfig查看本地的网络状…

docker info 显示 Docker 系统信息

docker info : 显示 Docker 系统信息&#xff0c;包括镜像和容器数

Syncd - 开源自动化部署工具

官网地址&#xff1a;https://gitee.com/dreamans/syncd/issues syncd是一款开源的代码部署工具&#xff0c;它具有简单、高效、易用等特点&#xff0c;可以提高团队的工作效率. 目前只支持类Linux系统. 特性 Go语言开发&#xff0c;编译简单、运行高效 Web界面访问&#xff0…