中断系统
嵌套向量中断控制器NVIC
中断优先级
优先级分组
Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:
第0组:所有4位用于指定响应优先级,此时不会发生中断嵌套
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:所有4位用于指定抢占式优先级
可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()
选择使用哪种优先级分组方式,这个函数的参数有下列5种:
1 | NVIC_PriorityGroup_0 //选择第0组 |
中断服务函数
中断服务函数通常以PPP_IRQHandler
命名,PPP是对应外设名
中断设置过程
- 建立中断向量表(必须在用户程序执行前完成,通常在启动过程中完成可以在Flash、RAM中建立中断向量表)
- 在Flash建立(默认情况下):无需重定位中断向量表,即每个中断对应的中断服务函数不能被修改
- 在RAM中建立:需要重定向中断向量表,在用户程序运行过程,可根据需要动态修改中断服务程序
- 分配栈空间并初始化
- 设置中断优先级
- 分组
- 抢占优先级、子优先级
- 使能中断
- 编写中断服务函数
外部中断/事件控制器EXTI
原理框图
外部中断输入线
一共16个中断输入线
EXTI0~EXTI15
每个输入线都可以源于
PA~PG
共7个端口(同一时刻只能启用其中一个端口,比如对于EXTI0,用了PA0作为外部输入,就不能用PB0或者PC0、PD0……)
原理实现
外部信号通过输入线(GPIO端口)进入EXTIx
信号经过边沿检测电路,可以选择上升沿或下降沿触发,或者2种触发都选择
然后经过或门,一路输出到NVIC控制器(用于产生中断),一路经过脉冲发生器输出一个脉冲;在这个过程中信号可以被屏蔽。用于产生中断的信号称为“中断”,用于产生脉冲的信号被称为“事件”
EXTI_InitTypeDef 定义于文件“stm32f10x_exti.h”:
1 | typedef struct |