目录
2. 通用定时器(General-purpose Timers)
3. 自动重装载寄存器(ARR, Auto-reload Register)
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. 定时器的工作流程
-
配置时钟源和预分频器,确定计数器的工作频率。
-
配置ARR,确定定时器的周期。
-
选择计数模式(向上、向下或中央对齐)。
-
使能更新中断(如果需要)。
-
启动定时器,计数器开始工作。
-
当计数器达到设定条件时,触发更新事件或中断。
-
在中断服务函数中处理事件。
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 时钟配置
-
作用:
-
使能定时器的时钟,确保定时器能够正常工作。
-
-
步骤:
-
打开定时器所在总线的时钟(如APB1或APB2)。
-
如果使用外部时钟源,还需要配置相应的GPIO引脚和时钟输入。
-
3.2 定时器基本配置
-
作用:
-
配置定时器的工作模式、计数频率和计数范围。
-
-
步骤:
-
设置预分频器(PSC):
-
预分频器用于将时钟源的频率分频,得到计数器的实际工作频率。
-
公式:计数器频率 = 时钟源频率 / (PSC + 1)。
-
-
设置自动重装载寄存器(ARR):
-
ARR定义了计数器的计数上限,决定了定时器的周期。
-
公式:定时器周期 = (ARR + 1) / 计数器频率。
-
-
选择计数模式:
-
可以选择向上计数、向下计数或中央对齐计数模式。
-
-
启动定时器:
-
使能定时器,开始计数。
-
-
3.3 中断使能
-
作用:
-
使能定时器的更新中断,并配置中断优先级。
-
-
步骤:
-
使能更新中断:
-
通过设置定时器的中断使能寄存器,使能更新中断(UIE)。
-
-
配置NVIC(嵌套向量中断控制器):
-
设置中断优先级,并使能定时器中断。
-
-
3.4 编写中断服务函数
-
作用:
-
在中断服务函数中处理定时器中断事件,例如更新状态、执行任务等。
-
-
步骤:
-
实现中断服务函数:
-
在中断服务函数中,首先清除中断标志位,然后执行具体的任务逻辑,注意一定要先清楚标志位,不然就会一直申请中断,程序就会在中断里面卡死。
-
-
处理中断标志位:
-
通过读取定时器的状态寄存器,判断中断类型并清除标志位。
-
-
4. 代码实现
定时器外部时钟中断程序代码,当定时器时钟信号到来时,执行CNT加一,这里我们选用了ETR外部时钟,注意TIM_ETR只能是PA0引脚,这个在引脚定义表里面可以查到,我们通过外部连接的模块手动给PA0引脚一个时钟信号,这时就会执行CNT加一
在外部时钟模式下,CNT的自增机制如下:
-
外部时钟信号通过特定引脚输入到定时器。
-
每个外部时钟信号的有效边沿,CNT的值根据计数模式自增或自减。
-
当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的自增机制如下:
-
内部时钟信号经过预分频器分频后,作为CNT的计数时钟。
-
每个时钟周期,CNT的值根据计数模式自增或自减。
-
当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的区别,能够帮助我们在实际项目中更合理地选择和使用这两种功能。