抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

中断介绍

相关概念百度或查找其它资料

中断源
中断屏蔽
中断处理过程(响应中断、执行中断服务函数、中断返回)
中断优先级(抢占优先级、子优先级)
中断嵌套

中断系统

嵌套向量中断控制器NVIC

中断优先级

优先级分组

Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:
第0组:所有4位用于指定响应优先级,此时不会发生中断嵌套
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:所有4位用于指定抢占式优先级

可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:

1
2
3
4
5
NVIC_PriorityGroup_0 //选择第0组
NVIC_PriorityGroup_1 // 选择第1组
NVIC_PriorityGroup_2 // 选择第2组
NVIC_PriorityGroup_3 // 选择第3组
NVIC_PriorityGroup_4 // 选择第4组

中断服务函数
中断服务函数通常以PPP_IRQHandler命名,PPP是对应外设名

中断设置过程
  1. 建立中断向量表(必须在用户程序执行前完成,通常在启动过程中完成可以在Flash、RAM中建立中断向量表)
    • 在Flash建立(默认情况下):无需重定位中断向量表,即每个中断对应的中断服务函数不能被修改
    • 在RAM中建立:需要重定向中断向量表,在用户程序运行过程,可根据需要动态修改中断服务程序
  2. 分配栈空间并初始化
  3. 设置中断优先级
    • 分组
    • 抢占优先级、子优先级
  4. 使能中断
  5. 编写中断服务函数

外部中断/事件控制器EXTI

原理框图

image-20211004225919271

外部中断输入线
  • 一共16个中断输入线EXTI0~EXTI15

  • 每个输入线都可以源于PA~PG共7个端口(同一时刻只能启用其中一个端口,比如对于EXTI0,用了PA0作为外部输入,就不能用PB0或者PC0、PD0……)

image-20211004230108522

原理实现

image-20211005000126353

  1. 外部信号通过输入线(GPIO端口)进入EXTIx

  2. 信号经过边沿检测电路,可以选择上升沿或下降沿触发,或者2种触发都选择

  3. 然后经过或门,一路输出到NVIC控制器(用于产生中断),一路经过脉冲发生器输出一个脉冲;在这个过程中信号可以被屏蔽。用于产生中断的信号称为“中断”,用于产生脉冲的信号被称为“事件”

image-20211005002054791

EXTI_InitTypeDef 定义于文件“stm32f10x_exti.h”:

1
2
3
4
5
6
7
typedef struct 
{
u32 EXTI_Line;
EXTIMode_TypeDef EXTI_Mode;
EXTIrigger_TypeDef EXTI_Trigger;
FunctionalState EXTI_LineCmd;
} EXTI_InitTypeDef;

评论