《STM32定时器定时中断详解:从原理到实战应用》

目录

1. 引言

2. STM32定时器概述

2.1 定时器的种类

1. 基本定时器(Basic Timers)

2. 通用定时器(General-purpose Timers)

3. 高级定时器(Advanced Timers)

4. 低功耗定时器(Low-power Timers)

5. 系统定时器(SysTick Timer)

2.2 定时器的工作原理

1. 计数器的核心作用CNT

2. 时钟源与预分频器PCS

3. 自动重装载寄存器(ARR, Auto-reload Register)

4. 计数模式

5. 更新事件与中断

​编辑

6. 捕获/比较功能(可选)

7. 定时器的工作流程

2.3定时中断的作用

1. 精准定时

2. 事件触发

3. 周期性任务管理

4. 超时检测

5. 多任务协调

6. 低功耗应用

3. 定时器中断配置步骤

3.1 时钟配置

3.2 定时器基本配置

3.3 中断使能

3.4 编写中断服务函数

4. 代码实现

补充:外部时钟ETR和外部中断EXTI比较

1. 功能定义

2. 信号输入

3. 工作原理

4. 应用场景

5. 配置方式

6. 中断处理

7. 性能与资源占用

选择建议


1. 引言

        在嵌入式开发中,定时器是一个非常重要的外设,它能够帮助我们实现精确的时间控制、周期性任务调度以及各种与时间相关的功能。STM32微控制器作为嵌入式领域的热门选择,其内置的定时器功能强大且灵活,能够满足从简单定时到复杂PWM输出的多种需求。而定时器中断则是定时器功能的核心应用之一,通过中断机制,我们可以在特定的时间点触发事件,从而实现精准的任务调度和实时响应。

        在实际应用中,定时器通常被应用于以下场景:精准控制LED闪烁频率、定时采集传感器数据、实现多任务系统中的时间片轮转调度、生成精确的PWM信号以控制电机以及LED亮度。 

        本篇博客将深入探讨STM32定时器中断的原理与实现方法,从基础的定时器配置到中断服务函数的编写,逐步引导读者掌握这一关键技术。通过详细的代码示例和实际应用案例,帮助读者快速上手并应用于自己的项目中。无论你是初学者还是有一定经验的开发者,相信本篇内容都能为你带来新的启发和实用的技巧。

        接下来,我们将从STM32定时器的基本概念开始,逐步深入到定时器中断的配置与使用。让我们一起开启STM32定时器中断的学习之旅吧!

2. STM32定时器概述

2.1 定时器的种类

        STM32微控制器内置了多种类型的定时器,每种定时器都有其特定的功能和适用场景。根据功能和复杂度的不同,STM32的定时器可以分为以下几类:

1. 基本定时器(Basic Timers)

  • 代表型号:TIM6、TIM7(具体型号可能因STM32系列不同而有所变化)。

  • 主要特点

    • 功能简单,主要用于基础的定时任务。

    • 仅支持向上计数模式。

    • 没有输入捕获或输出比较功能。

  • 典型应用

    • 用于简单的定时任务,如延时、周期任务触发等。

    • 作为其他外设的时钟基准。

2. 通用定时器(General-purpose Timers)

  • 代表型号:TIM2、TIM3、TIM4、TIM5(具体型号和数量因STM32系列不同而有所差异)。

  • 主要特点:  

    • 功能丰富,支持多种计数模式(向上、向下、中央对齐)。

    • 支持输入捕获、输出比较、PWM生成等功能。

    • 通常具有多个通道,可以同时处理多个任务。

  • 典型应用

    • 精确测量输入信号的频率或脉宽(输入捕获)。

    • 生成PWM信号以控制电机、LED亮度等(输出比较)。

    • 实现复杂的定时任务和事件触发。

3. 高级定时器(Advanced Timers)

  • 代表型号:TIM1、TIM8(具体型号可能因STM32系列不同而有所变化)。

  • 主要特点

    • 功能最强大,适用于复杂的控制任务。

    • 支持所有通用定时器的功能,并增加了更高级的特性,如:

      • 带死区控制的互补PWM输出(用于电机控制)。

      • 编码器接口(用于读取旋转编码器信号)。

      • 刹车功能(用于紧急停止电机等应用)。

  • 典型应用

    • 电机控制(如BLDC、步进电机)。

    • 高精度PWM信号生成。

    • 复杂的定时和事件管理。

4. 低功耗定时器(Low-power Timers)

  • 代表型号:LPTIM1(具体型号可能因STM32系列不同而有所变化)。

  • 主要特点

    • 专为低功耗应用设计,能够在低功耗模式下运行。

    • 功能相对简单,主要用于低功耗场景下的定时任务。

  • 典型应用

    • 低功耗设备中的周期性唤醒。

    • 电池供电设备中的定时任务。

5. 系统定时器(SysTick Timer)

  • 特点

    • 这是一个内核级别的定时器,集成在Cortex-M系列内核中。

    • 主要用于操作系统的任务调度或简单的延时功能。

  • 典型应用

    • 实时操作系统(RTOS)中的时间片轮转调度。

    • 简单的延时功能。

        注意STM32F103C8T6只有TIM1、TIM2、TIM3、TIM4定时器,而且基本定时器和通用定时器是挂载在APB1总线上面的外设,高级定时器是挂载在APB2上面的外设

2.2 定时器的工作原理

  STM32的定时器是一个基于计数器的外设,其核心功能是通过计数器的累加或递减来实现时间的测量和控制。定时器的工作原理可以概括为以下几个关键部分:

1. 计数器的核心作用CNT

  • 定时器的核心是一个计数器寄存器(CNT),它可以向上计数、向下计数或中央对齐计数(先向上后向下)。

  • 计数器的工作频率由时钟源决定,通常来自内部时钟(如APB总线)或外部时钟(从上图可以看出外部时钟可以是ETR、ITRx 、TIx)

  • 计数器的值会随着每个时钟周期递增或递减,当计数器的值达到设定条件时,会触发相应的事件(如溢出、匹配等)。

2. 时钟源与预分频器PCS

  • 时钟源

    • 定时器的时钟源可以来自内部时钟(如APB总线)或外部时钟(如外部引脚输入)。

    • 内部时钟的频率通常由系统时钟(SYSCLK)分频得到。

  • 预分频器(PSC, Prescaler)

    • 预分频器用于将时钟源的频率分频,从而降低计数器的计数频率。

    • 例如,如果时钟源频率为72MHz,预分频器设置为7199,则计数器的实际工作频率为:

      计数器频率=72MHz/(7199+1)=10kHz
    • 预分频器的值可以通过寄存器配置。

3. 自动重装载寄存器(ARR, Auto-reload Register)

  • ARR的作用

    • ARR定义了计数器的计数上限。当计数器达到ARR的值时,会触发更新事件(Update Event)

    • 在向上计数模式下,计数器从0开始计数,达到ARR的值后溢出并重新从0开始。

    • 在向下计数模式下,计数器从ARR的值开始递减,达到0后重新从ARR的值开始。

  • ARR的配置

    • ARR的值决定了定时器的周期。例如,如果计数器频率为10kHz,ARR设置为9999,则定时器的周期为:

      定时器周期=9999+110kHz=1秒定时器周期=10kHz9999+1​=1秒

4. 计数模式

STM32定时器支持多种计数模式,常见的有:

  • 向上计数模式(Upcounting)

    • 计数器从0开始递增,达到ARR的值后溢出并重新从0开始。

  • 向下计数模式(Downcounting)

    • 计数器从ARR的值开始递减,达到0后重新从ARR的值开始。

  • 中央对齐模式(Center-aligned)

    • 计数器先向上计数到ARR的值,然后向下计数到0,如此循环。

5. 更新事件与中断

  • 更新事件(Update Event)

    • 当计数器溢出(向上计数模式)或下溢(向下计数模式)时,会触发更新事件。

    • 更新事件可以用于触发中断、DMA请求或更新寄存器的值。

  • 中断

    • 通过使能更新中断(UIE, Update Interrupt Enable),可以在更新事件发生时触发中断。

    • 在中断服务函数中,可以执行特定的任务(如翻转LED状态、读取传感器数据等)。

6. 捕获/比较功能(可选)

  • 输入捕获(Input Capture)

    • 用于测量外部信号的脉宽或频率。当外部信号触发时,计数器的当前值会被捕获到捕获寄存器中。

  • 输出比较(Output Compare)

    • 用于生成PWM信号或定时触发事件。当计数器的值与比较寄存器的值匹配时,会触发输出比较事件。

        关于输入捕获和输出比较的功能,在后面的章节会详细介绍,这里不做过多赘述。

7. 定时器的工作流程

  1. 配置时钟源和预分频器,确定计数器的工作频率。

  2. 配置ARR,确定定时器的周期。

  3. 选择计数模式(向上、向下或中央对齐)。

  4. 使能更新中断(如果需要)。

  5. 启动定时器,计数器开始工作。

  6. 当计数器达到设定条件时,触发更新事件或中断。

  7. 在中断服务函数中处理事件。

        STM32定时器的工作原理基于计数器的累加或递减,通过预分频器和自动重装载寄存器的配置,可以实现精确的定时功能。结合中断机制,定时器能够高效地处理周期性任务和事件触发。理解这些基本原理是掌握STM32定时器应用的关键。在接下来的章节中,我们将通过具体的代码示例,演示如何配置和使用定时器中断。

2.3定时中断的作用

定时器中断是STM32定时器功能的核心应用之一,它通过中断机制实现了精准的时间控制和事件触发。定时器中断的主要作用可以归纳为以下几个方面:

1. 精准定时

  • 功能描述

    • 定时器中断可以实现高精度的定时任务,例如每隔固定时间执行一次特定的操作。

  • 应用场景

    • LED闪烁控制:通过定时器中断精确控制LED的亮灭时间。

    • 数据采集:定时读取传感器数据,确保数据采集的周期性和稳定性。

    • 任务调度:在实时操作系统(RTOS)中,定时器中断用于实现任务的时间片轮转调度。

2. 事件触发

  • 功能描述

    • 定时器中断可以在特定的时间点触发事件,例如生成PWM信号、控制电机转速或触发其他外设的操作。

  • 应用场景

    • PWM信号生成:通过定时器中断控制PWM信号的占空比和频率。

    • 电机控制:定时触发电机驱动信号,实现精确的转速控制。

    • 通信协议:在UART、SPI等通信协议中,定时器中断用于控制数据传输的时序。

3. 周期性任务管理

  • 功能描述

    • 定时器中断可以用于管理周期性任务,例如定时更新显示内容、定时发送数据包等。

  • 应用场景

    • 实时时钟(RTC):通过定时器中断实现秒、分、时的更新。

    • 数据发送:定时发送数据包到远程设备,确保通信的实时性。

    • 显示刷新:定时更新LCD或LED显示屏的内容,确保显示效果的流畅性。

4. 超时检测

  • 功能描述

    • 定时器中断可以用于检测超时事件,例如检测按键长按、通信超时等。

  • 应用场景

    • 按键检测:通过定时器中断检测按键的按下时间,实现单击、双击、长按等功能的区分。

    • 通信超时:在通信协议中,定时器中断用于检测数据接收是否超时,避免通信死锁。

5. 多任务协调

  • 功能描述

    • 定时器中断可以用于协调多个任务的执行顺序和时间分配,确保系统的实时性和稳定性。

  • 应用场景

    • 多任务系统:在RTOS中,定时器中断用于实现任务调度和时间片分配。

    • 复杂控制逻辑:在工业控制系统中,定时器中断用于协调多个外设的操作,确保系统的同步性。

6. 低功耗应用

  • 功能描述

    • 定时器中断可以用于实现低功耗设备的周期性唤醒,例如在电池供电的设备中定时唤醒CPU执行任务。

  • 应用场景

    • 低功耗设备:通过定时器中断实现设备的周期性唤醒,执行数据采集或通信任务后再次进入低功耗模式。

    • 传感器网络:在无线传感器网络中,定时器中断用于协调节点的唤醒和休眠,延长电池寿命。

        定时器中断在STM32开发中扮演着至关重要的角色,它通过精准的时间控制和事件触发机制,实现了多种复杂的功能。无论是简单的LED闪烁控制,还是复杂的多任务调度和通信协议,定时器中断都能提供高效、可靠的解决方案。理解并掌握定时器中断的使用方法,是STM32开发中的一项核心技能。

        本小节我们主要来学习下精准定时的功能,实现每隔1秒数值自动加一,下一节我们再来学习事件触发功能,通过输出PWM波实现对呼吸灯、舵机和直流电机的控制。

3. 定时器中断配置步骤

如上图,我们只要从时钟选择、时基单元、中断输出控制、NVIC这条链路打通即可。

3.1 时钟配置

  • 作用

    • 使能定时器的时钟,确保定时器能够正常工作。

  • 步骤

    1. 打开定时器所在总线的时钟(如APB1或APB2)。

    2. 如果使用外部时钟源,还需要配置相应的GPIO引脚和时钟输入。

3.2 定时器基本配置

  • 作用

    • 配置定时器的工作模式、计数频率和计数范围。

  • 步骤

    1. 设置预分频器(PSC)

      • 预分频器用于将时钟源的频率分频,得到计数器的实际工作频率。

      • 公式:计数器频率 = 时钟源频率 / (PSC + 1)。

    2. 设置自动重装载寄存器(ARR)

      • ARR定义了计数器的计数上限,决定了定时器的周期。

      • 公式:定时器周期 = (ARR + 1) / 计数器频率。

    3. 选择计数模式

      • 可以选择向上计数、向下计数或中央对齐计数模式。

    4. 启动定时器

      • 使能定时器,开始计数。

3.3 中断使能

  • 作用

    • 使能定时器的更新中断,并配置中断优先级。

  • 步骤

    1. 使能更新中断

      • 通过设置定时器的中断使能寄存器,使能更新中断(UIE)。

    2. 配置NVIC(嵌套向量中断控制器)

      • 设置中断优先级,并使能定时器中断。

3.4 编写中断服务函数

  • 作用

    • 在中断服务函数中处理定时器中断事件,例如更新状态、执行任务等。

  • 步骤

    1. 实现中断服务函数

      • 在中断服务函数中,首先清除中断标志位,然后执行具体的任务逻辑,注意一定要先清楚标志位,不然就会一直申请中断,程序就会在中断里面卡死。

    2. 处理中断标志位

      • 通过读取定时器的状态寄存器,判断中断类型并清除标志位。

4. 代码实现

      定时器外部时钟中断程序代码,当定时器时钟信号到来时,执行CNT加一,这里我们选用了ETR外部时钟,注意TIM_ETR只能是PA0引脚,这个在引脚定义表里面可以查到,我们通过外部连接的模块手动给PA0引脚一个时钟信号,这时就会执行CNT加一

在外部时钟模式下,CNT的自增机制如下:

  1. 外部时钟信号通过特定引脚输入到定时器。

  2. 每个外部时钟信号的有效边沿,CNT的值根据计数模式自增或自减。

  3. 当CNT的值达到ARR的值时,溢出或下溢,并触发更新事件(如果使能了中断,则触发中断)。

外部时钟模式适用于需要外部信号驱动的应用场景,例如编码器信号处理、外部事件计数等。通过合理配置外部时钟源和定时器参数,可以实现灵活且高效的定时功能。

#include "stm32f10x.h"                  // Device header

/**
  * 函    数:定时中断初始化
  * 参    数:无
  * 返 回 值:无
  * 注意事项:此函数配置为外部时钟,定时器相当于计数器
  */
void Timer_Init(void)
{
	/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);			//开启TIM2的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			//开启GPIOA的时钟
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);						//将PA0引脚初始化为上拉输入
	
	/*外部时钟配置*/
	TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x0F);
																//选择外部时钟模式2,时钟从TIM_ETR引脚输入
																//注意TIM2的ETR引脚固定为PA0,无法随意更改
																//最后一个滤波器参数加到最大0x0F,可滤除时钟信号抖动,滤波器原理就是在频率f下连续采样N个点,如果N个点的采样值都是一样的才会输出有效值
	
	/*时基单元初始化*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				//定义结构体变量
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;		//时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能,由于这里没有预分频所以每遮挡一次CNT加一,如果有预分频则是遮挡几次CNT加一,CNT加到9以后申请中断Num加一
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	//计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 10 - 1;					//计数周期,即ARR的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;				//预分频器,即PSC的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;			//重复计数器,高级定时器才会用到
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);				//将结构体变量交给TIM_TimeBaseInit,配置TIM2的时基单元	
	
	/*中断输出配置*/
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);						//清除定时器更新标志位
																//TIM_TimeBaseInit函数末尾,手动产生了更新事件
																//若不清除此标志位,则开启中断后,会立刻进入一次中断
																//如果不介意此问题,则不清除此标志位也可
																
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);					//开启TIM2的更新中断
	
	/*NVIC中断分组*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				//配置NVIC为分组2
																//即抢占优先级范围:0~3,响应优先级范围:0~3
																//此分组配置在整个工程中仅需调用一次
																//若有多个中断,可以把此代码放在main函数内,while循环之前
																//若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置
	
	/*NVIC配置*/
	NVIC_InitTypeDef NVIC_InitStructure;						//定义结构体变量
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;				//选择配置NVIC的TIM2线
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//指定NVIC线路使能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	//指定NVIC线路的抢占优先级为2
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//指定NVIC线路的响应优先级为1
	NVIC_Init(&NVIC_InitStructure);								//将结构体变量交给NVIC_Init,配置NVIC外设
	
	/*TIM使能*/
	TIM_Cmd(TIM2, ENABLE);			//使能TIM2,定时器开始运行
}

/**
  * 函    数:返回定时器CNT的值
  * 参    数:无
  * 返 回 值:定时器CNT的值,范围:0~65535
  */
uint16_t Timer_GetCounter(void)
{
	return TIM_GetCounter(TIM2);	//返回定时器TIM2的CNT
}

/* 定时器中断函数,可以复制到使用它的地方
void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
	{
		
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}
*/

        定时器内部时钟中断程序代码 ,每当定时器的时钟信号到来时,这里也就是系统内部时钟信号到来时,CNT的值会根据计数模式自增

在内部时钟模式下,CNT的自增机制如下:

  1. 内部时钟信号经过预分频器分频后,作为CNT的计数时钟。

  2. 每个时钟周期,CNT的值根据计数模式自增或自减。

  3. 当CNT的值达到ARR的值时,溢出或下溢,并触发更新事件(如果使能了中断,则触发中断)。

理解CNT的自增机制是掌握STM32定时器功能的关键。通过合理配置预分频器和ARR,可以实现精确的定时功能。

#include "stm32f10x.h"                  // Device header


extern uint16_t Num;


/*定时器中断配置*/
void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启TIM2外设时钟
	
	TIM_InternalClockConfig(TIM2);//选择TIM2时钟为内部时钟,其实这个代码也可以不写,因为定时器上电以后默认就是内部时钟
	
	/*初始化时基单元*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision =TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//在向上计数 向下计数和中央对齐三种计数模式中选择向上计数模式
	TIM_TimeBaseInitStructure.TIM_Period = 10000-1;//ARR自动重装器的值 定时频率=72M/(PCS+1)/(ARR+1) 定时一秒也就是1Hz
	TIM_TimeBaseInitStructure.TIM_Prescaler = 7200-1;//PSC预分频器的值  注意PSC和ARR的取值0-65535之间
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器的值,高级定时器才有的值,这里不需要用,直接给0就好了
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
	
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//定时器中断使能,这样就开启了更新中断到NVIC的通路
	
		/*中断输出配置*/
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);						//清除定时器更新标志位
																//TIM_TimeBaseInit函数末尾,手动产生了更新事件
																//若不清除此标志位,则开启中断后,会立刻进入一次中断
																//如果不介意此问题,则不清除此标志位也可
	/*NVIC配置*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC优先级分组选择分组2,即2位抢占 2位响应
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
	
	TIM_Cmd(TIM2,ENABLE);
}

/*定时器中断函数配置,当定时器产生更新中断时,这个函数就会被自动执行*/

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

补充:外部时钟ETR和外部中断EXTI比较

在STM32中,外部时钟ETR(External Trigger)外部中断EXTI(External Interrupt)是两个不同的功能模块,尽管它们都涉及外部信号的输入,但其工作原理和应用场景有显著区别。以下是它们的详细对比:

1. 功能定义

  • 外部时钟ETR

    • ETR是定时器的一个功能,用于将外部信号作为定时器的时钟源或触发源。

    • 它通常用于驱动定时器的计数器(CNT),或者触发定时器的特定事件(如捕获、比较等)。

  • 外部中断EXTI

    • EXTI是STM32的中断控制器,用于检测外部引脚的电平变化(如上升沿、下降沿或双边沿)并触发中断。

    • 它通常用于响应外部设备的信号,例如按键按下、传感器触发等。

2. 信号输入

  • 外部时钟ETR

    • 信号通过定时器的特定引脚(如TIMx_ETR)输入。

    • 例如,TIM2的ETR引脚可能是PA0(具体取决于芯片型号和引脚复用)。

  • 外部中断EXTI

    • 信号通过GPIO引脚输入,且每个GPIO引脚都可以配置为EXTI的输入源。

    • 例如,PA0、PB0、PC0等引脚都可以配置为EXTI0的输入。

3. 工作原理

  • 外部时钟ETR

    • ETR信号用于驱动定时器的计数器(CNT),或者触发定时器的特定事件。

    • ETR信号的有效边沿(上升沿或下降沿)会导致CNT自增或自减,或者触发捕获、比较等事件。

  • 外部中断EXTI

    • EXTI信号用于触发CPU的中断。

    • 当检测到GPIO引脚的电平变化(如上升沿、下降沿或双边沿)时,EXTI会向NVIC发送中断请求,CPU跳转到中断服务函数执行任务。

4. 应用场景

  • 外部时钟ETR

    • 用于需要外部信号驱动定时器的场景,例如:

      • 外部时钟源输入(如高频信号)。

      • 编码器信号处理(用于电机控制)。

      • 外部事件计数(如脉冲计数)。

  • 外部中断EXTI

    • 用于需要快速响应外部事件的场景,例如:

      • 按键检测(如按下、释放)。

      • 传感器触发(如光电传感器、红外传感器)。

      • 外部设备的状态变化检测。

5. 配置方式

  • 外部时钟ETR

    • 通过定时器的寄存器配置ETR引脚的功能,例如:

      • 选择ETR的时钟源。

      • 配置ETR的预分频器和极性。

      • 使能ETR功能。

     外部中断EXTI

  • 通过GPIO和EXTI寄存器配置外部中断,例如:

    • 选择GPIO引脚作为EXTI输入。

    • 配置EXTI的触发条件(上升沿、下降沿或双边沿)。

    • 配置NVIC中断优先级并使能中断。

6. 中断处理

  • 外部时钟ETR

    • ETR本身不会直接触发中断,但它可以触发定时器的事件(如更新事件、捕获事件等),这些事件可以配置为触发中断。

  • 外部中断EXTI

    • EXTI直接触发中断,CPU会跳转到中断服务函数执行任务。

7. 性能与资源占用

  • 外部时钟ETR

    • ETR功能由定时器硬件实现,对CPU的占用较低,适合高频信号处理。

  • 外部中断EXTI

    • EXTI需要CPU参与中断处理,适合低频事件检测,但对CPU的实时性要求较高

选择建议

  • 如果需要处理高频信号或驱动定时器,选择外部时钟ETR

  • 如果需要快速响应外部事件(如按键按下),选择外部中断EXTI

理解ETR和EXTI的区别,能够帮助我们在实际项目中更合理地选择和使用这两种功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值