标准库学习 中断

STM32中断机制详解

中断:在主程序运行的过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在执行的程序,转而去处理中断程序,处理完成后又反复会原来被暂停的位置继续运行。

中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。

中断嵌套:当一个中断程序证正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。

STM32中断:

1.68个可屏蔽中断通道包含,EXIT、TMI、ADC、USART、SPI、IIC、RTC等多个外设。

2.使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先级等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级。

NVIC基本结构:

NVIC优先级分组

NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-N位的响应优先级。抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队。

核心要点总结

  1. 整个系统只能设置一次优先级分组

  2. 抢占优先级决定嵌套能力,子优先级决定相同抢占级内的执行顺序

  3. 数值越小优先级越高​(0是最高优先级)

  4. 合理规划优先级对系统实时性至关重要

  5. 实际项目中建议使用Group_2或Group_4,平衡灵活性和复杂度

//Group_2
抢占优先级2位、响应优先级2位。
抢占优先级2位:优先级等级分为3等 0、1、2
响应优先级2位:优先级等级分为3等 0、1、2

EXIT外部中断:

EXIT可以检测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化是,EXIT将立即向NVIC发出中断请求,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXIT对应的中断程序。

支持的触发方式:上升沿、下降沿、双边沿。

支持的GPIO口:所有的GPIO口,但相同的PIN不能同时触发中断。

通道数:16个GPIO-PIN,外加PVD输出,RTC闹钟,USB唤醒,以太网唤醒。

触发响应方式:中断响应,事件响应 

EXIT基本结构:

AFIO复用IO口:

AFIO主要用于引脚复用功能的选择和重定义。

在STM32中,AFIO主要完成两个任务:复用功能引脚重映射,中断引脚选择。

中断配置过程:(以外部中断为例)

1.开启相关时钟

STM32的外设时钟需要先使能才能使用。

// 开启GPIO时钟和AFIO时钟(EXTI需要AFIO)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

2.配置GPIO引脚为输入模式

//根据需要配置GPIO为输入模式(如上拉输入、下拉输入等)
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // 下拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);

3.配置EXIT线

将GPIO引脚与EXTI线路连接,并配置触发方式(上升沿、下降沿或双边沿)。

// 将GPIOA0连接到EXTI0
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);

EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

4.配置NVIC

设置中断优先级和使能中断。

NVIC_InitTypeDef NVIC_InitStructure;
// 设置优先级组(先设置优先级组,整个系统只需设置一次)
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

// 配置EXTI0中断
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;       // 子优先级(响应优先级)
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

5.编写中断服务函数

在stm32f10x_it.c中编写中断服务函数,并清除中断标志位。

void EXTI0_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line0) != RESET)
    {
        // 处理中断事件
        // ...

        // 清除中断标志位
        EXTI_ClearITPendingBit(EXTI_Line0);
    }
}

中断服务函数名:在启动文件中找以Handler结尾的对应的 即为函数名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值