exti.c完成了EXTI的初始化驱动。剩下的工作是编写中断服务函数,让CPU知道发生中断时要做什么工作。按照设计好的程序结构,中断服务函数写在stm32f4xx_it.c里。该文件的内容主要是为异常服务,可以看到NMI_Handler函数、HardFault_Handler函数等,这些函数名字很熟悉,其实它们正是表5-1内对应的除了Reset之外的9个系统异常服务函数,名字与其一一对应,如图5-13所示。当这些异常发生,系统将立刻进入相应的服务函数内。固件库已经将系统异常服务函数的框架写好,内容为空。而中断服务函数却没有写,在文件最后的帮助说明也讲述了这个问题,因此,中断服务函数要由用户自行编写,而且中断服务函数的名字必须与startup_stm32f4xx.s内的中断向量名字一致,比如PA0对应外部中断EXTI0,则中断服务函数名字应为EXTI0_IRQHandler()。同理,PC13对应外部中断EXTI15_10,则中断服务函数名字应为EXTI15_10_IRQHandler()。
图5-15 stm32f4xx_it.c文件
编辑stm32f4xx_it.c文件,因为要用到预先做好的宏定义,首先在程序的开头加入包含exti.h头文件“#include"exti.h"”。
中断服务函数在stm32f4xx_it.c文件最后。读者可以看到对中断函数书写的说明,可以删除它们。最后添加PA0与PC13的中断服务函数EXTI0_IRQHandler()与EXTI15_10_IRQHandler()。为了提高程序的可读性与可移植性,exti.h中对EXTI0_IRQHandler和EXTI15_10_IRQHandler做了宏定义。读者可以将函数名改为KEY1_IRQHandler()与KEY2_IRQHandler(),如图5-16所示。
图5-16 添加中断服务函数(www.xing528.com)
按照项目要求,我们需要在中断时改变LED状态,因此在中断服务函数中写入GPIO_ToggleBits()对GPIO进行取反输出。外部中断还有一个非常重要而且容易疏忽的地方,就是当中断服务结束后要对中断服务标志进行清除,否则中断将一直进行下去,无法返回主函数。清除中断标志的函数是EXTI_ClearITPendingBit()函数,该函数在stm32f4xx_exti.c内可以找到,如图5-17所示,形参是外部中断线EXTI_Line。将对应的外部中断线填入即可清除。因此,对PA0外部中断的清除函数为EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);对PC13外部中断的清除函数为EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE)。
图5-17 EXTI_Clear ITPendingBit()函数
PA0与PC13的中断服务函数如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。