学习笔记:STM32定时器(TIM)中断

Cortex-M4集成了嵌套式矢量型中断控制器(Nested Vectored Interrupt Controller (NVIC))来实现高效的异常和中断处理。NVIC实现了低延迟的异常和中断处理,以及电源管理控制。它和内核是紧密耦合的。

凡是打断程序顺序执行的事件都称为异常(exception),比如HardFault,外部中断等。所以中断​也可以说是异常的一种。

一、中断的作用

全局中断使能位控制着“所有”中断,它如果关闭,则会屏蔽其它中断。

1、时基单元包括:

  • 计数器寄存器 (TIMx_CNT)
  • 预分频器寄存器 (TIMx_PSC)
  • 自动重载寄存器 (TIMx_ARR)

在使用过程中,常关闭全局中断,以防止其他中断的干扰。
当GPIO模拟某个时序时,在GPIO传输数据过程中,若被某个中断干扰,会导致时序不准确问题,通常的做法是关闭全局中断,数据传输完成后打开全局中断,
同样在RTOS中对全局变量的保护基本上都使用了全局中断。

__disable_irq();
//数据传输
__enable_irq();

但关中断时间较长,导致串口接收FIFO溢出,数据丢失。

所以需要注意:全局中断关闭时间都不是太长,且严禁出现长时间关中断,严禁出现关中断时间不可控,这样会影响实时性。
时间不可控比如:长链表操作、环形缓冲区操作、循环操作等。

2、通用定时器功能

16 位/32 位(仅 TIM2 和 TIM5)向上、向下、向上/向下自动装载计数器(TIMx_CNT),注意:TIM9~TIM14 只支持向上(递增)计数方式。
16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的任意数值。
4 个独立通道(TIMx_CH1~4,TIM9~TIM14 最多 2 个通道),这些通道可以用来作为:
        A.输入捕获
        B.输出比较
        C. PWM 生成 ( 边缘或中间对齐模式 ) ,注意: TIM9~TIM14 不支持中间对齐模式
        D.单脉冲模式输出
4)可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。
5)如下事件发生时产生中断/DMA(TIM9~TIM14 不支持 DMA):
        A.更新:计数器向上溢出 / 向下溢出,计数器初始化 ( 通过软件或者内部 / 外部触发 )
        B.触发事件 ( 计数器启动、停止、初始化或者由内部 / 外部触发计数 )
        C.输入捕获
        D.输出比较
        E.支持针对定位的增量 ( 正交 ) 编码器和霍尔传感器电路( TIM9~TIM14 不支持)
        F.触发输入作为外部时钟或者按周期的电流管理( TIM9~TIM14 不支持)

3、 相关寄存器

TIMx_CR1控制寄存器
TIMx_DIER中断/DMA使能寄存器
TIMx_PSC预分频器
TIMx_CNT 计数器(存储计数值)
TIMx_ARR自动重装载寄存器

二、中断优先级

异常包括系统异常(异常编号1-15)和外部中断(异常编号16往上)。HardFault(-1)这三个异常优先级都是负数且固定不变,优先级高于其他异常,除了这三个异常之外其他异常优先级都是可以编程的。

1、中断抢占

每个中断优先级都包含两个部分,一部分称作抢占优先级,另一部分称作子优先级。

(1)抢占优先级(中断嵌套)
在执行低中断优先级中断函数时,高优先级中断到来,低优先级中断被打断,执行高优先级中断,高优先级中断执行完后回到低优先级中断继续执行。

标题

(蓝色方框为低优先级) 

具有高抢占优先级的中断能够抢占低抢占优先级的中断,也称之为中断嵌套。

(2)抢占优先级相同,子优先级不同

当两个中断的抢占优先级设置为相同级别时,这两个中断不会出现中断嵌套。

如果其中一个中断正在执行时,另外一个中断到来,后来的中断将会等到前一个中断执行完才能执行。如果这两个中断都处在等待响应状态,执行条件到来时,首先响应子优先级高的中断。

(3)抢占优先级相同,子优先级也相同

这种情况也不会出现中断嵌套,内核将会按照向量表中的排位选择,优先执行靠前的异常。

2、优先级分组

在Cortex-M4内核中,优先级分组是一个用于配置中断优先级的重要机制。它决定了在8位的中断优先级字段中,多少位用于表示抢占优先级,多少位用于表示子优先级。

Cortex-M4内核允许通过配置优先级分组寄存器(例如,ARM Cortex-M3中的AIRCR寄存器)来设置不同的优先级分组方案。优先级分组寄存器通常包含几位用于配置优先级的字段。通过设置这些位,可以选择不同的分组方式,从而决定抢占优先级和子优先级的位数分配。

具体的分组方式可以有多种,例如:

分组0:所有8位都用于表示子优先级,没有抢占优先级。
分组1:最高1位用于表示抢占优先级,最低的7位用于表示子优先级。
分组2:最高2位用于表示抢占优先级,最低的6位用于表示子优先级。
分组3:最高3位用于表示抢占优先级,最低的5位用于表示子优先级。
分组4:所有8位都用于表示抢占优先级,没有子优先级。
不同的分组方式可以根据具体的应用需求来选择。抢占优先级用于决定在中断发生时哪个中断应该被优先处理,而子优先级则在抢占优先级相同的情况下用于进一步区分中断的优先级。

示例:

nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
nvic_irq_enable((uint8)USBFS_IRQn,2U,0U);
nvic_irq_enable((uint8)USBFS_WKUP_IRQn,1U,0U);

三、定时器的寄存器。

1、控制寄存器 (TIMx_CR1)

该寄存器是一个16位的寄存器,在本实验中,只用到了 TIMx_CR1 的最低位,也就是计数器使能位,该位必须置 1,才能让定时器开始计数。

2、DMA/中断使能寄存器(TIMx_DIER)

该寄存器同样是16位的寄存器,这里同样仅关心它的第 0 位,该位是更新中断允许位,本章用到的是定时器的更新中断,所以该位要设置为 1,来允许由于更新事件所产生的中断。

3、预分频寄存器(TIMx_PSC)

该寄存器用设置对时钟进行分频,然后提供给计数器,作为计数器的时钟。在这里,定时器的时钟来源有 4 个:
1)内部时钟(CK_INT)

2)外部时钟模式 1:外部输入脚(TIx)

3)外部时钟模式 2:外部触发输入(ETR)

4)内部触发输入(ITRx):使用 A 定时器作为 B 定时器的预分频器(A 为 B 提供时钟)。这些时钟,具体选择哪个可以通过 TIMx_SMCR 寄存器的相关位来设置。这里的 CK_INT时钟是从 APB1倍频的来的,STM32 中除非APB1 的时钟分频数设置为 1,否则通用定时器TIMx的时钟是 APB1 时钟的 2 倍,当 APB1 的时钟不分频的时候,通用定时器 TIMx 的时钟就等于APB1 的时钟。这里还要注意的就是高级定时器的时钟不是来自 APB1,而是来自 APB2 的。

4、自动重装载寄存器(TIMx_ARR)

该寄存器在物理上实际对应着 2 个寄存器。一个是程序员可以直接操作的,另外一个是程序员看不到的,这个看不到的寄存器在《STM32参考手册》里面被叫做影子寄存器。事实上真正起作用的是影子寄存器。根据 TIMx_CR1 寄存器中 APRE 位的设置:APRE=0 时,预装载寄存器的内容可以随时传送到影子寄存器,此时 2者是连通的;而 APRE=1 时,在每一次更新事件(UEV)时,才把预装在寄存器的内容传送到影子寄存器。

5、状态寄存器(TIMx_SR)

该寄存器用来标记当前与定时器相关的各种事件/中断是否发生。 

四、中断配置

在使用ARM Cortex-M系列微控制器时,中断处理是一个非常重要的部分。在Cortex-M4(或类似的Cortex-M系列)中配置中断示例如下。(实际的实现细节可能会根据您使用的具体硬件和库有所不同。)

1、选择中断源:

首先确定要使用的中断源。这可能是外部中断、定时器中断或其他内部中断;时钟设置与使能。


//设置时钟频率:HSE=8M  M=8  N=336 P=2 Q=7
//PLL=HSE/M=1M  PLLCLK=PLL*N/P=168M  USB=PLL*N/Q=48M
Stm32_Clock_Init(336,8,2,7);

时间计算公式:Tout =  ( (arr+1) * (psc+1) )  /  Tclk;

Tclk:TIM3 的输入时钟频率(单位为 Mhz)

Tout:TIM3 溢出时间(单位为 us)

示例:

TIM(定时器)=84MHz       psc(分频系数)=8400     arr(重装在值)=5000

定时器计数频率 = 84MHz / 8400 =10KHz

Tout = 5000 / 10KHz = 0.5s

int main(void)
{  
	Stm32_Clock_Init(336,8,2,7);  //pll=1M pllclk=168M 
	delay_init(168);			
	LED_Init();		  			
 	TIM3_Int_Init(5000-1,8400-1);  //arr psc
	while(1)
	{
		LED0=!LED0;
		delay_ms(200);
	};
}

2、配置中断优先级:

Cortex-M4支持中断优先级。根据应用的需求为每个中断分配优先级

3、配置NVIC (Nested Vectored Interrupt Controller):

NVIC是Cortex-M系列中的中断控制器。需配置NVIC以启用和配置所需的中断。

4、编写中断服务程序 (ISR):

为每个中断编写中断服务程序。当中断发生时,这些程序将被执行。

以下示例基于ARM Cortex-M4 内核的 GD32 微控制器。

示例1:如何配置一个外部中断(EXTI)(例如,来自某个GPIO引脚的中断)

#include "gd32f3xx.h"  //确保已经包含了必要的头文件
  
// 假设您已经有一个系统时钟初始化的函数  
void SystemClock_Config(void);  
  
// EXTI0 的中断服务程序  
void EXTI0_IRQHandler(void)  
{  
    if (RESET != exti_interrupt_flag_get(EXTI_0)) // 检查 EXTI0 的中断标志  
    {  
        // 清除中断标志  
        exti_interrupt_flag_clear(EXTI_0);  
          
        // 在这里处理中断逻辑  
    }  
}  
  
int main(void)  
{  
    // 系统时钟初始化  
    SystemClock_Config();  
      
    // GPIO 端口时钟使能  
    rcu_periph_clock_enable(RCU_GPIOA);  
      
    // 配置 GPIOA 的第 0 号引脚为中断模式  
    gpio_mode_set(GPIOA, GPIO_MODE_IT, GPIO_PUPD_NONE, GPIO_PIN_0);  
    gpio_interrupt_enable(GPIOA, GPIO_INT_FALLING); // 下降沿触发  
      
    // 配置 EXTI 的中断线 0  
    exti_interrupt_flag_clear(EXTI_0); // 清除可能存在的挂起中断  
    exti_line_config(EXTI_SOURCE_GPIOA, EXTI_LINE_0);  
    exti_mode_set(EXTI_MODE_INTERRUPT, EXTI_LINE_0);  
    exti_trigger_type_set(EXTI_TRIGGER_FALLING, EXTI_LINE_0); // 下降沿触发  
      
    // 配置 NVIC  
    nvic_irq_enable(EXTI0_IRQn, 0, 0); // 使能 EXTI0 的中断,并设置优先级  
      
    while (1)  
    {  
        // 主循环代码  
    }  
}


五、使用方法总结

中断响应过程

步骤1、中断源发出中断请求

步骤2、判断处理器是否允许中断,以及该中断源是否被屏蔽

步骤3、中断优先级排队

步骤4、处理器暂停当前程序,保存断点地址和当前处理器的当前状态,根据中断类型号,查找中断向量表,转到对应的中断服务程序

步骤5、执行中断服务程序

步骤6、恢复被保护的状态,执行中断返回指令,回到被中断的程序

  • 18
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32TIM中断是指在STM32单片机中使用定时器(TIM)模块时,通过配置中断来实现定时器中断功能。在配置STM32TIM中断时,需要进行以下步骤: 1. 配置NVIC:首先要配置NVIC(Nested Vectored Interrupt Controller),设置中断优先级分组。通过NVIC_PriorityGroupConfig函数设置中断优先级分组,并通过NVIC_InitTypeDef结构体配置具体的中断参数。 2. 使能TIM外设:使用TIM_Cmd函数使能TIM外设,即使能定时器TIM。 3. 编写中断函数:编写相应的中断处理函数。在中断函数中,可以根据需要执行特定的操作。例如,可以检查指定的TIM中断是否发生,并执行相应的操作,如加数或清除中断待处理位。 4. 配置TIM中断:使用TIM_ITConfig函数配置定时器TIM中断源。通过该函数可以选择使能或禁用定时器的不同中断源,如更新中断、捕获比较中断等。 5. 对TIM进行初始化:使用TIM_TimeBaseInit函数初始化TIM。通过TIM_TimeBaseInitTypeDef结构体定义TIM的参数,如时钟分割、计数器模式、重装载寄存器周期值和预分频值等。 以上是配置STM32TIM中断的基本步骤,通过这些步骤可以实现在STM32单片机中使用定时器时的中断功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [STM32学习---TIM中断](https://blog.csdn.net/m0_71044959/article/details/131528729)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [STM32——TIM简介与TIM中断](https://blog.csdn.net/NRWHF/article/details/128529354)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值