前言:这些问题都是我之前在工作中遇到的,后来觉得需要总结,自己**不好,所以在这个给自己打个mark。 一:触发方式
STM32 的外部中断是通过边沿来触发的,不支持电平触发;
二:外部中断分组
STM32 的每一个GPIO都能配置成一个外部中断触发源,STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0为第一组,那么依此类推,我们能得出一共有16 组,STM32 规定,每一组中同时只能有一个中断触发源工作,那么,最多工作的也就是16个外部中断。 STM32 分组和对应中断处理函数分配: 管脚
| 中断标志
| 中断处理函数分配
| PA0~PG0
| EXTI0
| EXTI0_IRQHandler
| PA1~PG1
| EXTI1
| EXTI1_IRQHandler
| PA2~PG2
| EXTI2
| EXTI2_IRQHandler
| PA3~PG3
| EXTI3
| EXTI3_IRQHandler
| PA4~PG4
| EXTI4
| EXTI4_IRQHandler
| PA5~PG5
| EXTI5
| EXTI9_5_IRQHandler
| PA6~PG6
| EXTI6
| PA7~PG7
| EXTI7
| PA8~PG8
| EXTI8
| PA9~PG9
| EXTI9
| PA10~PG10
| EXTI10
| EXTI15_10_IRQHandler
| PA11~PG11
| EXTI11
| PA12~PG12
| EXTI12
| PA13~PG13
| EXTI13
| PA14~PG14
| EXTI14
| PA15~PG15
| EXTI15
|
三:外部中断的配置过程
l 配置触发源 -GPIO 触发源为通过GPIO端口输入,所以,要配置GPIO的模式,输入方式,输入方式有以下几种: 1.GPIO_Mode_AIN ,模拟输入(ADC模拟输入,或者低功耗下省电) 2.GPIO_Mode_IN_FLOATING ,浮空输入 3.GPIO_Mode_IPD = 0x28,带下拉输入 4.GPIO_Mode_IPU = 0x48,带上拉输入 l 引脚与外部中断关联 l 外部中断AFIO时钟开启 l 外部中断配置 这个主要是中断线路选择,中断触发方式,中断使能。 l 中断优先级配置 NVIC l 中断处理函数的编写。
四:外部中断函数不能进入的原因分析
结合我工作中的遇到的问题可以分为: 1)GPIO或者AFIO的时钟没有开启; 2)GPIO和配置的中断线路不匹配; 3)中断触发方式和实际不相符合; 4)中断处理函数用库函数时,写错,经常可能出现数字和字母之间没有下划线; 5)外部中断是沿触发,有可能不能检测到沿,比如 中断线是低电平(浮空输入),触发是下降沿触发,可能会出现一直是低电平,高电平的时候是一样的情况,电平持续为高电平; 6)没有用软件中断来触发外部中断,调用函数EXTI_GenerateSWInterrupt;,因为软件中断先于边沿中断处理。
|