编写完exti.h后,开始在exti.c中编写驱动程序。使用外部中断与使用GPIO的输入/输出类似,步骤如下:
(1)开启按键GPIO时钟和SYSCFG时钟。
(2)配置NVIC。
(3)配置按键GPIO为输入模式。
(4)将按键GPIO连接到EXTI源输入。
(5)配置按键EXTI中断/事件线。
(6)编写EXTI中断服务函数。
根据步骤,编写exti.c如下:
程序编写了NVIC配置函数NVIC_Configuration()与外部中断配置函数EXTI_Key_Config(),下面就两个函数展开说明。
1.配置NVIC、NVIC-Configuration()函数
NVIC_Configuration()函数是一个静态函数,即局部函数,只在exti.c文件中使用,无形参,无返回值。此函数的作用是对NVIC进行设置,为外部中断设置做好准备。
首先,使用函数NVIC_PriorityGroupConfig()设置优先级组。这里设置组别为NVIC_PriorityGroup_1,即第1组,此分组的真值表参考表5-8。
表5-8 STM32F407优先级分组表
其次,定义NVIC初始化结构体。结构体在前面章节有介绍,结构体的4个成员需要进行赋值设置。
·结构体成员NVIC_InitStructure.NVIC_IRQChannel要赋值中断源,这里赋值宏定义的KEY1_INT_EXTI_IRQ,即EXTI0_IRQn。
·结构体成员NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority要设置抢占优先级,这里赋值抢占优先级为1。
·结构体成员NVIC_InitStructure.NVIC_IRQChannelSubPriority要设置子优先级,这里赋值子优先级为1。
·结构体成员NVIC_InitStructure.NVIC_IRQChannelCmd要设置中断使能,这里要使能中断,因此赋值ENABLE。
最后,配置好结构体后,使用NVIC_Init()函数进行初始化。
NVIC_Init(& NVIC_InitStructure)进行EXTI0的NVIC初始化,这是对PA0的外部中断源的NVIC初始化。对PC13的初始化的步骤与PAO的初始化类似,如果不改变抢占优先级与子优先级,则只需对结构体成员NVIC_InitStructure.NVIC_IRQChannel设置中断源为KEY2_INT_EXTI_IRQ,即设置中断源为EXTI15_10_IRQn,然后再用NVIC_Init(& NVIC_InitStructure)初始化一遍。
完成两次NVIC_Init(& NVIC_InitStructure)初始化后,就完成了PA0和PC13的NVIC初始化,这段代码在PA0和PC13的优先级设置中都是一样的参数,即抢占优先级与子优先级都是1,因此PA0的优先级>PC13的优先级。(www.xing528.com)
2.配置按键外部中断函数EXTI-Key-Config()
配置步骤:开启时钟—配置NVIC—设置GPIO输入模式—将按键GPIO连接到EXTI源输入—配置EXTI中断/事件线。该函数要分别对PA0与PC13进行设置。
(1)EXTI_Key_Config()函数首先定义了两个初始化结构体:GPIO_InitTypeDef GPIO_InitStructure和EXTI_InitTypeDef EXTI_InitStructure,用于GPIO初始化和EXTI设置。
(2)开启时钟函数RCC_AHB1PeriphClockCmd(KEY1_INT_GPIO_CLK|KEY2_INT_GPIO_CLK,ENABLE)与RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE)。一个函数用于开启AHB1外设时钟,GPIOA与GPIOC均在AHB1上,因此同时开启了GPIOA与GPIOC,使用“|”运算作为实参;另一个函数用于开启APB2外设时钟,而SYSCFG属于外设时钟,位于APB2上,因此使用了RCC_APB2PeriphClockCmd()函数。
(3)配置NVIC。使用之前编写的NVIC_Configuration()函数进行配置。
(4)GPIO输入初始化。作为外部中断的触发源,GPIO应该设置为输入,因此要对PA0与PC13进行GPIO的输入设置。代码如下:
对GPIO初始化结构体进行配置涉及引脚号KEY1_INT_GPIO_PIN、输入模式GPIO_Mode_IN与上下拉模式GPIO_PuPd_NOPULL这三个参数,具体方法参考上一章节GPIO输入部分。
最后使用GPIO_Init()函数进行初始化。这个函数与之前学习的GPIO初始化步骤一致。
(5)将GPIO连接外部中断源,GPIO作为事件需要连接外部中断源来触发中断,所以使用函数SYSCFG_EXTILineConfig()。这个函数可以在stm32f4xx_syscfg.c中找到,如图5-14所示。该函数有两个形参,一个是EXTI_PortSourceGPIOx,意味着GPIO口,数据类型为无符号字符型;另一个是EXTI_PinSourcex,意味着引脚号,数据类型为无符号字符型。要设置PA0连接外部中断源,因此第一个参数是GPIOA,第二个参数是GPIO_Pin_0,于是根据PA0参数写出该函数:SYSCFG_EXTILineConfig(GPIOA,GPIO_Pin_0),而在exti.h中已经对这两个参数进行过宏定义,因此函数SYSCFG_EXTILineConfig()最后可写成:
SYSCFG_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE,KEY1_INT_EXTI_PINSOURCE);
图5-14 SYSCFG_EXTILineConfig函数
(6)配置EXTI中断/事件线并完成初始化,这时使用EXTI初始化结构体EXTI_InitStructure,可参考5.2.2内容。这部分代码如下:
第一个成员EXTI_InitStructure.EXTI_Line的含义是选择中断线。PA0的外部中断选择EXTI_Line0,由于exti.h中已经对EXTI_Line0进行了宏定义,因此赋值KEY1_INT_EXTI_LINE。
第二个成员EXTI_InitStructure.EXTI_Mode的含义是模式选择,选择中断模式或者事件模式。按要求这里选择中断,即EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt。
第三个成员EXTI_InitStructure.EXTI_Trigger的含义是选择触发模式,这里选择上升沿触发,因此EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising。
第四个成员EXTI_InitStructure.EXTI_LineCmd的含义是使能外部中断线,这里设置打开使能,才能使用PA0作为外部中断,因此设置EXTI_InitStructure.EXTI_LineCmd=ENABLE。
最后使用函数EXTI_Init(& EXTI_InitStructure)完成EXTI的初始化工作。
PC13的设置方法和步骤与PA0的类似,只需改一下GPIO与对应的中断/事件线,为了区分上升沿与下降沿,将PC13设置为下降沿触发,其他不变。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。