本文共 4436 字,大约阅读时间需要 14 分钟。
首先,这节用移植会比较快
USART中断控制LED我很早就已经解决了,这个是在我第二版本的基础上,将按键变成了中断,就这么简单,话不多说,开始
1.需要移植的文件首先是bsp_exti.c
/**
****************************************************************************** * @file bsp_exti.c * @author fire * @version V1.0 * @date 2015-xx-xx * @brief I/O线中断应用bsp ****************************************************************************** * @attention * * 实验平台:秉火 STM32 F429 开发板 * 论坛 :http://www.firebbs.cn * 淘宝 :https://fire-stm32.taobao.com * ****************************************************************************** */ #include "./key_exti/bsp_exti.h"/**
* @brief 配置嵌套向量中断控制器NVIC * @param 无 * @retval 无 */ static void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* 配置NVIC为优先级组1 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* 配置中断源:按键1 */ NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ; /* 配置抢占优先级:1 */ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; /* 配置子优先级:1 */ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; /* 使能中断通道 */ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* 配置中断源:按键2,其他使用上面相关配置 */ NVIC_InitStructure.NVIC_IRQChannel = KEY2_INT_EXTI_IRQ; NVIC_Init(&NVIC_InitStructure); }/**
* @brief 配置 PA0 为线中断口,并设置中断优先级 * @param 无 * @retval 无 */ void EXTI_Key_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; /*开启按键GPIO口的时钟*/ RCC_AHB1PeriphClockCmd(KEY1_INT_GPIO_CLK|KEY2_INT_GPIO_CLK ,ENABLE); /* 使能 SYSCFG 时钟 ,使用GPIO外部中断时必须使能SYSCFG时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); /* 配置 NVIC */ NVIC_Configuration(); //配置GPIO /* 选择按键1的引脚 */ GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN; /* 设置引脚为输入模式 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; /* 设置引脚不上拉也不下拉 */ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; /* 使用上面的结构体初始化按键 */ GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStructure); //配置EXTI中断源1/* 连接 EXTI 中断源 到key1引脚 */
SYSCFG_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE,KEY1_INT_EXTI_PINSOURCE);/* 选择 EXTI 中断源 */
EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE; /* 中断模式 */ EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; /* 下降沿触发 */ EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; /* 使能中断/事件线 */ EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); //配置EXTI中断源2以及相应的GPIO口 /* 选择按键2的引脚 */ GPIO_InitStructure.GPIO_Pin = KEY2_INT_GPIO_PIN; /* 其他配置与上面相同 */ GPIO_Init(KEY2_INT_GPIO_PORT, &GPIO_InitStructure);/* 连接 EXTI 中断源 到key2 引脚 */
SYSCFG_EXTILineConfig(KEY2_INT_EXTI_PORTSOURCE,KEY2_INT_EXTI_PINSOURCE);/* 选择 EXTI 中断源 */
EXTI_InitStructure.EXTI_Line = KEY2_INT_EXTI_LINE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; /* 上升沿触发 */ EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } /*********************************************END OF FILE**********************/
2.接着是bsp_exti.h
#ifndef __EXTI_H
#define __EXTI_H#include "stm32f4xx.h"
//引脚定义
/*******************************************************/ #define KEY1_INT_GPIO_PORT GPIOA #define KEY1_INT_GPIO_CLK RCC_AHB1Periph_GPIOA #define KEY1_INT_GPIO_PIN GPIO_Pin_0 #define KEY1_INT_EXTI_PORTSOURCE EXTI_PortSourceGPIOA #define KEY1_INT_EXTI_PINSOURCE EXTI_PinSource0 #define KEY1_INT_EXTI_LINE EXTI_Line0 #define KEY1_INT_EXTI_IRQ EXTI0_IRQn#define KEY1_IRQHandler EXTI0_IRQHandler
#define KEY2_INT_GPIO_PORT GPIOC
#define KEY2_INT_GPIO_CLK RCC_AHB1Periph_GPIOC #define KEY2_INT_GPIO_PIN GPIO_Pin_13 #define KEY2_INT_EXTI_PORTSOURCE EXTI_PortSourceGPIOC #define KEY2_INT_EXTI_PINSOURCE EXTI_PinSource13 #define KEY2_INT_EXTI_LINE EXTI_Line13 #define KEY2_INT_EXTI_IRQ EXTI15_10_IRQn#define KEY2_IRQHandler EXTI15_10_IRQHandler
/*******************************************************/
void EXTI_Key_Config(void);#endif /* __EXTI_H */
在移植的过程中,一定要注意在user文件夹当中,这两个文件需要放置在你新建的一个文件夹中,所以头文件的书写要注意哟
3.再在stm32f4xx_it.c文件中,添加两个中断的函数。中断服务函数的书写,依旧是重点考虑中断标志位和中断函数名字!!!而且别忘记了中断里面产生的哪些行为所要的头文件哟
#include "./key_exti/bsp_exti.h"
void EXTI0_IRQHandler(void)
{ //确保是否产生了EXTI Line中断 if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET) { // LED1 取反 LED1_TOGGLE; //清除中断标志位 EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE); } }void EXTI15_10_IRQHandler(void)
{ //确保是否产生了EXTI Line中断 if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET) { // LED2 取反 LED3_TOGGLE; //清除中断标志位 EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE); } }
4.在最后的main文件中,需要添加的是:
#include "./key_exti/bsp_exti.h"
EXTI_Key_Config();
大功告成!!写了中断服务函数以后,程序从main开始以后直接进入中断哟
转载地址:http://osfzz.baihongyu.com/