本文章以STM32F407ZGTx为例:
STM32F407的外部中断有22个:
从图中可以看出STM32F407供IO口使用的中断线有16个,但其每个IO口都能够作为外部中断的输入,他是如何做到的呢?
从上图我们可以发现STM32F407是通过映射的方式来将16个中断线分配到每一个IO口上,但这样的映射有个限制:一个中断线每次只能连接一个IO口。
配置外部中断首先我们要配置对应的IO口,使能IO口的时钟、外部中断的时钟,设置IO口与外部中断线的映射关系。(这里以PA0为例)
一般开启时钟的函数都在stm32f4xx_rcc.c文件中,因为GPIOA的时钟在AHB1这条总线上,所以我们用的是RCC_AHB1PeriphClockCmd()函数,所有的外部中断都要开启SYSCFG时钟。SYSCFG_EXTILineConfig()函数原型在stm32f4xx_syscfg.c文件中,配置其他的外部中断的话可以看看函数原型,改一下入口参数。接下来就GPIO的标准输入配置了。
配置完GPIO后接下来就是对外部中断的配置。
外部中断的配置主要是对外部中断线的初始化,这里使用的是stm32f4xx_exti.c文件里的EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)函数对外部中断初始化,初始化的内容主要是对EXTI_InitStruct里面的元素进行赋值,然后传递给该函数。
最后是对总中断的配置。
NVIC的配置主要是对NVIC的初始化,这里使用的是misc.c文件里的NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)函数对NVIC初始化,初始化的内容主要是对NVIC_InitStruct里面的元素进行赋值,然后传递给该函数。
配置完NVIC后就可以编写外部中断函数啦。
我们可以通过获取外部中断0的中断标志位来判断是否为外部中断0产生的中断,获取中断标志位的函数在stm32f4xx_exti.c文件中EXTI_GetFlagStatus(uint32_t EXTI_Line)或EXTI_GetITStatus(uint32_t EXTI_Line)我主要使用的第二个函数。每次进入中断后要对中断标志位进行软件清零。我这里通过stm32f4xx_exti.c文件中的EXTI_ClearITPendingBit(uint32_t EXTI_Line)函数进行清零。我这里主要是通过PA0按键来实现LED的亮灭。
以上就已经将外部中断配置完毕了,但这样配置的可移植性很差,所有我在其头文件中加了一些宏定义来扩展他的可移植性。
这样初始化函数就可以改成这样
外部中断服务函数可以改成这样
这样就可以之间通过改变宏定义来更改初始化的外部中断线啦。
PS:其实这种方法也不是很完整,只是我比较懒并且这个方法我修改起来也比较熟练。
STM32配置GPIO--外部中断的配置(库函数版本)
最新推荐文章于 2023-06-06 23:40:53 发布