PA0,PB0...PG0--->EXTI0
PA1,PB1...PG1--->EXTI1
.......
PA15,PB15...PG15--->EXTI15
以上为GPIO和中断线的映射关系图
STM32实际上只有16个中断线.
每个中断组内,同时只能有一IO口起中断作用.当PA0中断的时候,PB0...PG0都不能起作用....
IO口设置是在EXTIx的函数组内设置.
(这里设置中断的触发模式等初始化参数)
1.选择中断触发EXTIx的线程,比如PE4作为外部中断触发,就要选择 EXTI_InitStructure.EXTI_Line=EXTI_Line4
2.选择是触发中断,......=EXTI_Mode_Interrrupt
3.选择触发模式 下降沿.....=EXTI_Trigger_Falling
4.EXTI线使能.....EXTI_LineCmd=ENABLE
5.最后一步把结构体参数一起写到EXTI寄存器中 EXTI_Init(&EXTI_InitStruture)
下一步要配置中断优先级才能使刚才配置的外部中断生效
1.使能外部中断通道.....=EXTI2_IRQn //使能按键所在的外部中断通道线 这里是第二个中断线(EXTI2)
2.设置抢占优先级 = 0x02 //抢占优先级2
3.设置子优先级....=0x02 //子优先级2
4.使能外部中断通道 ..... = ENABLE
5.最后一步,还是把刚才设置的结构体参数导入寄存器 NVIC_Init(&NVIC_InitStructure)
这里需要注意到一点
中断线0~4每条线都对应一个中断函数.
5~9共用EXTI9_5_IRQHandler这个中断函数
10~15共用EXTI15_10_IRQHandler这个中断函数
在编写中断服务函数的时候 经常用到两个函数
1.ITStatus EXTI_GetITStatus(uint32_t EXTI_Line) //这个函数一般在中断开头判断某个中断线是否发生中断
2.void EXTI_ClearITPendingBIt(uint32_t EXTI_Line) //这个函数是清除某个中断线上的中断标志位
以下为常用的中断服务函数格式:
void EXTI2_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line3)!=RESET)//判断某个线上的中断是否发生
{
中断逻辑…
EXTI_ClearITPendingBit(EXTI_Line3); //清除 LINE 上的中断标志位
}
}
具体细节部分阅读原子STM32开发指南上中的外部中断部分.
这里只是手工打印出来以示增强自己的影响.
看到这里的朋友,在STM32的学习路上,坚持下去,在此与诸君共勉!