基本步骤

  1. 初始化I/O口为输入
  2. 开启AFIO时钟
  3. 设置I/O口与中断线的映射关系
  4. 初始化线上中断,设置触发条件等
  5. 配置中断分组(NVIC),并使能中断
  6. 编写中断服务函数

基本原理

STM32F103有19个外部中断: - Line 0~15:对应外部 I/O 口的输入中断 - Line 16:连接到 PVD 输出 - Line 17:连接到 RTC 闹钟事件 - Line 18:连接到 USB 唤醒事件

不过 I/O 口外部中断函数只有6个,Line 0~4每个中断线对应一个中断函数,Line 5~9共用中断函数,Line 10~15共用中断函数

对于中断线,你可能感觉很抽象的感觉,下面上一张中断线对应I/O口的图:

Line 0对应的是 PA0 ~ PG0,Line 1对应的是 PA1 ~ PG1,同理其他中断线。

中断初始化

STM32有两个中断优先级一个是抢占优先级(NVIC_IRQChannelPreemptionPriority),一个是子优先级(NVIC_IRQChannelSubPriority), 必须对这两个优先级都进行初始化才行。

遇到中断同时发生,先会判断抢占优先级,如果相同会继续判断子优先级,来确定响应那个中断。

中断函数

示例中断:

1
2
3
4
5
6
7
void EXTI2_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line2) != RESET) {
... //中断逻辑
EXTI_ClearITPendingBit(EXTI_Line2); //清除LINE2上的中断标志位  
}
}

STM32也有6个中断函数 EXTIx_IRQHandler ,类似于51单片机的 interrupt x