一,SIM32 IO中断
1.STM32每个IO口都 可以作为外部中断输入口
2.STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位,
19 个外部中断为:
线 0~15:对应外部 IO 口的输入中断。
线 16:连接到 PVD 输出。
线 17:连接到 RTC 闹钟事件。
线 18:连接到 USB 唤醒事件。
3.STM32 供 IO 口使用的中断线只有 16 个,但是 STM32 的 IO 口却远远不
止 16 个,那么 STM32 是怎么把 16 个中断线和 IO 口一一对应起来的呢?于是 STM32 就这样设计,GPIO 的管教 GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线 0~15。这样每个中断线对应了最多 7 个 IO 口,以线 0 为例:它对应了 GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。而中断线每次只能连接到 1 个 IO 口上,这样就需要通过配置来决定对应的中断线配置到哪个 GPIO 上了。
4.STM32 的 IO 口外部中断函数只有 6 个,分别为
EXPORT EXTI0_IRQHandler
EXPORT EXTI1_IRQHandler
EXPORT EXTI2_IRQHandler
EXPORT EXTI3_IRQHandler
EXPORT EXTI4_IRQHandler
EXPORT EXTI9_5_IRQHandler
EXPORT EXTI15_10_IRQHandler
中断线 0-4 每个中断线对应一个中断函数,中断线 5-9 共用中断函数EXTI9_5_IRQHandler,中断线 10-15 共用中断函数 EXTI15_10_IRQHandler。
下使用 IO 口外部中断的一般步骤:
1)初始化 IO 口为输入。
2)开启 AFIO 时钟
3)设置 IO 口与中断线的映射关系。
4)初始化线上中断,设置触发条件等。
5)配置中断分组(NVIC),并使能中断。
6)编写中断服务函数。
二、中断分组及优先级
2.1 对STM32中断进行分组,组0~4。同时,对每个中断组设置一个抢占优先级和一个响应优先级值。中断优先级分组是为了给抢占式优先级和响应优先级在中断优先级寄丛器的高四位分配各个优先级数字所占的位数。在一个程序中只能设定一次假如你选择中断优先级分组的第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级,那么抢占式优先级就有000-111共八种数据选择,也就是有八个中断嵌套,而响应优先级中有0和1两种,总共有8*2=16种优先级。
第0组:所有4位用于指定响应优先级
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:所有4位用于指定抢占式优先级
2.2 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。
2.3抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
2.4抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
2.5如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行。
2.6、NVIC_PreemptionPriority:抢占优先级
NVIC_SubPriority :响应优先级
NVIC_Channel :中断编号
NVIC_Group :中断分组 0~4
//NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先