首页 理论教育 STM32固件库编程:exti.c编写

STM32固件库编程:exti.c编写

时间:2023-10-21 理论教育 版权反馈
【摘要】:编写完exti.h后,开始在exti.c中编写驱动程序。根据步骤,编写exti.c如下:程序编写了NVIC配置函数NVIC_Configuration()与外部中断配置函数EXTI_Key_Config(),下面就两个函数展开说明。·结构体成员NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority要设置抢占优先级,这里赋值抢占优先级为1。

STM32固件库编程:exti.c编写

编写完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设置为下降沿触发,其他不变。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈