首页 > 其他分享 >定时器中断

定时器中断

时间:2025-01-21 22:54:11浏览次数:1  
标签:定时器 中断 APB1Periph NVIC TIM 时钟 RCC

Timer定时器对输入得到时钟进行计数,在计数达到设定值时触发中断。

时基单元 = 计数器 + 预分频器 + 自动重装寄存器

 

定时器功能:

(1)定时中断功能、内外时钟源选择

(2)输出比较

(3)输入捕获/主从触发模式

(4)编码器接口

 

定时器分类:

 基本定时器 + 通用定时器 + 高级定时器

STM32F103C8T6芯片的定时器资源:TIM1, TIM2, TIM3, TIM4

 

基本定时器的结构图:

(1)基本定时器只能选择内部时钟:系统主频72MHz

(2)时基单元: 预分频器 + 计数器 + 自动重装寄存器 

  (  输出频率 = 输入频率/ (PSC + 1) ,  实际分频系数等于PSC+1)

(3)更新中断:计数器的值等于自动重装寄存器值,通过NVIC触发CPU处理中断函数

(4)更新事件:计数器的值等于自动重装寄存器值,触发内部其他电路工作,但不会触发中断。 主模式:更新事件-->主模式映射到TRGO-->DAC。

 

通用定时器的结构图:

(1)通用定时器:内部时钟(系统主频72MHz) + 外部时钟(外部时钟模式1、外部时钟模式2)

 外部时钟模式1:触发输入外部时钟(ETR引脚、ITR信号、CH1引脚边沿、CH1引脚、CH2引脚) -----> TRGI ----->从模式控制器 ----->时基单元

 外部时钟模式2:TIMx_ETR引脚上的外部时钟 ----->极性选择、滤波、边沿检测和预分频 ------> 触发控制器----->时基单元

 

(2)计数模式:向上计数 + 向下计数 + 中央对齐计数

(3)输出比较寄存器+输出比较电路:4个通道CH1、CH2、CH3和CH4引脚,用于输出PWM波形驱动电机

(4)输入捕获寄存器+输入捕获电路:4个通道CH1、CH2、CH3和CH4引脚,用于测量输入方波的频率

 

高级定时器的结构图:

(1)增加重复次数计数器, 每隔几次计数周期更新一次

(2)死区生成电路 + 互补输出引脚:输出互补的PWM波,用于驱动三相无刷电机

(3)刹车输入功能:给电机驱动提供安全保障

 

定时中断基本结构图:

RCC内部时钟 ---> 内部时钟模式 ---> 时基单元

ETR外部时钟 ---> 外部时钟模式2 ---> 时基单元

ETR外部时钟 | ITRx其他定时器 | TIx捕获通道 ---> 外部时钟模式1 ---> 时基单元

 

预分频器时序图

计数器时序图

计数器溢出时,产生更新事件脉冲(UEV) + 更新中断标志位(UIF)

计数器溢出频率 CK_CNT_OV = CK_CNT / (ARR+1) = CK_PSC / (PSC + 1) / (ARR + 1)

 

计数器有无预装时序图

计数器有预装时序图(自动重装缓冲寄存器)

 

RCC时钟树(ST公司已在SystemInit函数中配置)

 

定时器初始化

(1)RCC开启时钟

(2)选择时基单元的时钟源

(3)配置时基单元

(4)配置输出中断控制

(5)配置NVIC

(6)配置运行控制,使能计数器

 

内部定时器中断实验

定时器模块文件Timer.c

#include "stm32f10x.h"                  // Device header

extern uint16_t uiNum;

void Timer_Init(void)
{
	/* RCC开始TIM2定时器的时钟 */
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/*  RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4,
 *  RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7,
 *  RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3,
 *  RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, 
 *  RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP,
 *  RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC,
 *  RCC_APB1Periph_TIM12, RCC_APB1Periph_TIM13, RCC_APB1Periph_TIM14
 */
	
	/* 选择时基单元的时钟 */
	TIM_InternalClockConfig(TIM2);
	
	/* 配置时基单元 */
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_Prescaler = 7200-1;   //预分频值
	TIM_TimeBaseInitStruct.TIM_Period = 10000-1;    //  自动重装值
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;	
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV2;
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; 
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
	
	TIM_ClearFlag(TIM2,TIM_FLAG_Update);
	
	/* 使能更新中断至NVIC */
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // TIM_IT_Update 表示更新中断
	
	/* 配置NVIC */
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef  NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn; 
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStruct);

	/* 启动定时器 */
	TIM_Cmd(TIM2, ENABLE);
}

void TIM2_IRQHandler(void)
{
	if( SET == TIM_GetITStatus(TIM2, TIM_IT_Update) )
	{
		uiNum ++;
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}	

 

定时器模块文件Timer.h

#ifndef __TIMER_H__
#define __TIMER_H__

extern void Timer_Init(void);

#endif

 

主函数文件

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"

uint16_t uiNum = 0;

int main(void)
{
	OLED_Init();	
	Timer_Init();
	
	while(1)
	{
		OLED_ShowNum(1,1,uiNum, 4);
	}	
}

标签:定时器,中断,APB1Periph,NVIC,TIM,时钟,RCC
From: https://www.cnblogs.com/czy363/p/18684319

相关文章

  • 外部中断
    1、中断系统中断源:引脚发生电平跳变、定时器时间到达、串口接收到通信数据EXTI外部中断:EXTI0-EXTI4,EXTI9—5,EXTI15—10TIM定时器中断、ADC模数转换中断、USART、SPI、I2C、RTC实时时钟、窗口看门狗中断、PVD中断中断优先级:区别多个中断源的轻重缓急中断嵌套:中断的中断中断......
  • 外中断引脚测试NVIC中断系统功能&USART程序设计
    文章目录一、STM32之NVIC中断系统二、外中断引脚测试NVIC中断系统功能三、STN32外设之USART四、USART程序设计&总结详解一、STM32之NVIC中断系统(一)、中断处理机制:NVIC的定义:NVIC又叫嵌套向量中断控制器,属于CM4内核。它控制着整个芯片中断相关的功能,是内核的一个外设......
  • 定时器与LED模式切换控制
    定时器是单片机内部功能,电路连接和运转均在单片机内部完成定时器用于计时系统,或者使程序每隔一段固定时间完成一项操作替代长时间的DELAY,提高效率每隔一个单位时间,内部的计数单元数值就增加一,当计数单元的数值达到设定值时,技术单元就会向端系统发出中断申请,产生响铃提醒,使程序......
  • 求助,51单片机定时器中断控制数码管
    遇到的问题是:动态显示时,如果位选变化间隔太小,会导致计数的部分失效,数码管一直显示0000,间隔在30时数字会有变化,但是显示闪烁的效果太明显了代码如下:#defineuintunsignedint#defineucharunsignedchar//位选定义sbitwei0=P1^3;sbitwei1=P1^4;sbitwei2=P1^5;sbi......
  • 27 Xbox蓝牙连接不稳定,游戏中断联,新手柄,反映延持,忽然失联的解决方法,蓝牙连接后无法自
    27新买了一个Xbox,蓝牙连接后有时会突然断联,游戏中会忽然失灵一般新手柄硬件绝对没问题,电脑自己的硬件以及软件驱动也没问题,那就是手柄自带驱动不行,!更新!一个新手柄驱动的即可解决方法1.下载一个软件“XboxAccessories”,微软商店或者网上直接找均可,我这用的网络的网址,因为微软......
  • 28、【OS】【Nuttx】最小系统初始化分析(4):定时器(二)
    背景接上篇wiki27、【OS】【Nuttx】最小系统初始化分析(4):定时器(一)分析了定时器初始化过程,以及初始化生成的定时器实例,并着重分析了实例对象里的sim_current方法,接下来对最小系统中,定时器的启动,以及执行的任务进行分析定时器启动来看定时器启动函数sim_start,这里有两......
  • don‘t sleep一款阻止系统意外中断,保证工作娱乐安全运行的软件!
    软件介绍给大家分享一款大小仅500多KB,用于防止系统进入关机、重启、待机、睡眠、休眠、注销、屏幕保护等状态功能的软件,避免工作或者娱乐受到打扰。软件主要由阻止和允许功能构成。例如当你在下载、暂时离开、工作的时候使用阻止功能可以避免系统进入不同的电源管理模式......
  • ch32L103_EVT_定时器TIM1
    参考博文:https://www.cnblogs.com/liaigu/p/17782198.html在CH32L103EVT开发板的范例TIM_INT中,TIM1_INT_Init函数需要适当修改。1主频96MHz,计数时钟预分频器(TIM1_PSC)为16位,取值0~65535,对应TIM_Prescaler。2TIM_RepetitionCounter对应重复计数值寄存器(TIM1_RPTCR)示例中初......
  • 第七章 中断
    第七章中断本文是对《操作系统真象还原》第七章学习的笔记,欢迎大家一起交流。a启用中断本节的主要任务是打开中断,并且使用时钟中断测试知识部分中断分类中断可以分为外部中断和内部中断,这已经是老生常谈的话题了,不再多说。外部中断又可以分为可屏蔽中断和不可屏蔽中断,其......
  • 如何处理Redis连接中断的问题?
    当您遇到Redis连接中断(如“Rediswentaway”)的问题时,这通常是由于网络连接不稳定、配置参数不合理或资源不足等原因引起的。为了解决这个问题,您可以按照以下步骤进行排查和优化:检查网络连接:确保服务器与Redis实例之间的网络连接稳定可靠。可以通过ping命令测试延迟情况,或者使......