1、2、4、5按键都能中断,3号按键不能中断,把中断入口EXTI1_IRQn改为EXTI15_10_IRQn就可以了,这是为什么?
以下是代码
:
exti.h文件
#ifndef __EXTI_H
#define __EXTI_H
#include "stm32f4xx.h"
void EXTI_key_Config(void);
/*引脚定义*/
/*按键1*/
#define KEY1_EXTI_GPIO_PORT GPIOA
#define KEY1_EXTI_GPIO_CLK_ENABLE() __GPIOA_CLK_ENABLE()
#define KEY1_EXTI_GPIO_PIN GPIO_PIN_0
#define KEY1_EXTI_IRQ EXTI0_IRQn
#define KEY1_IRQHandler EXTI0_IRQHandler
/*按键2*/
#define KEY2_EXTI_GPIO_PORT GPIOG
#define KEY2_EXTI_GPIO_CLK_ENABLE() __GPIOG_CLK_ENABLE()
#define KEY2_EXTI_GPIO_PIN GPIO_PIN_2
#define KEY2_EXTI_IRQ EXTI2_IRQn
#define KEY2_IRQHandler EXTI2_IRQHandler
/*按键3*/
#define KEY3_EXTI_GPIO_PORT GPIOC
#define KEY3_EXTI_GPIO_CLK_ENABLE() __GPIOA_CLK_ENABLE()
#define KEY3_EXTI_GPIO_PIN GPIO_PIN_13
#define KEY3_EXTI_IRQ EXTI1_IRQn //将这个改为EXTI15_10_IRQn就可以了
#define KEY3_IRQHandler EXTI1_IRQHandler //将这个改为EXTI15_10_IRQHandler就可以了
/*按键4*/
#define KEY4_EXTI_GPIO_PORT GPIOG
#define KEY4_EXTI_GPIO_CLK_ENABLE() __GPIOG_CLK_ENABLE()
#define KEY4_EXTI_GPIO_PIN GPIO_PIN_3
#define KEY4_EXTI_IRQ EXTI3_IRQn
#define KEY4_IRQHandler EXTI3_IRQHandler
/*按键5*/
#define KEY5_EXTI_GPIO_PORT GPIOG
#define KEY5_EXTI_GPIO_CLK_ENABLE() __GPIOG_CLK_ENABLE()
#define KEY5_EXTI_GPIO_PIN GPIO_PIN_4
#define KEY5_EXTI_IRQ EXTI4_IRQn
#define KEY5_IRQHandler EXTI4_IRQHandler
#endif
exti.c文件
#include "./exti.h"
void EXTI_key_Config(void)
{
GPIO_InitTypeDef EXTI_GPIO_Init; //定义一个GPIO_InitTypeDef结构体
/*开启GPIO时钟*/
KEY1_EXTI_GPIO_CLK_ENABLE();
KEY2_EXTI_GPIO_CLK_ENABLE();
KEY3_EXTI_GPIO_CLK_ENABLE();
KEY4_EXTI_GPIO_CLK_ENABLE();
KEY5_EXTI_GPIO_CLK_ENABLE();
/*设置GPIO_KEY1工作模式*/
EXTI_GPIO_Init.Pin = KEY1_EXTI_GPIO_PIN;
EXTI_GPIO_Init.Mode = GPIO_MODE_IT_RISING;
EXTI_GPIO_Init.Pull = GPIO_NOPULL;
HAL_GPIO_Init(KEY1_EXTI_GPIO_PORT,&EXTI_GPIO_Init);
HAL_NVIC_SetPriority(KEY1_EXTI_IRQ,0,0);
HAL_NVIC_EnableIRQ(KEY1_EXTI_IRQ);
/*设置GPIO_KEY2工作模式*/
EXTI_GPIO_Init.Pin = KEY2_EXTI_GPIO_PIN;
EXTI_GPIO_Init.Mode = GPIO_MODE_IT_RISING;
EXTI_GPIO_Init.Pull = GPIO_NOPULL;
HAL_GPIO_Init(KEY2_EXTI_GPIO_PORT,&EXTI_GPIO_Init);
HAL_NVIC_SetPriority(KEY2_EXTI_IRQ,0,0);
HAL_NVIC_EnableIRQ(KEY2_EXTI_IRQ);
/*设置GPIO_KEY3工作模式*/
EXTI_GPIO_Init.Pin = KEY3_EXTI_GPIO_PIN;
EXTI_GPIO_Init.Mode = GPIO_MODE_IT_RISING;
EXTI_GPIO_Init.Pull = GPIO_NOPULL;
HAL_GPIO_Init(KEY3_EXTI_GPIO_PORT,&EXTI_GPIO_Init);
HAL_NVIC_SetPriority(KEY3_EXTI_IRQ,0,0);
HAL_NVIC_EnableIRQ(KEY3_EXTI_IRQ);
/*设置GPIO_KEY4工作模式*/
EXTI_GPIO_Init.Pin = KEY4_EXTI_GPIO_PIN;
EXTI_GPIO_Init.Mode = GPIO_MODE_IT_RISING;
EXTI_GPIO_Init.Pull = GPIO_NOPULL;
HAL_GPIO_Init(KEY4_EXTI_GPIO_PORT,&EXTI_GPIO_Init);
HAL_NVIC_SetPriority(KEY4_EXTI_IRQ,0,0);
HAL_NVIC_EnableIRQ(KEY4_EXTI_IRQ);
/*设置GPIO_KEY5工作模式*/
EXTI_GPIO_Init.Pin = KEY5_EXTI_GPIO_PIN;
EXTI_GPIO_Init.Mode = GPIO_MODE_IT_RISING;
EXTI_GPIO_Init.Pull = GPIO_NOPULL;
HAL_GPIO_Init(KEY5_EXTI_GPIO_PORT,&EXTI_GPIO_Init);
HAL_NVIC_SetPriority(KEY5_EXTI_IRQ,0,0);
HAL_NVIC_EnableIRQ(KEY5_EXTI_IRQ);
}
main.c
#include "main.h"
#include "stm32f4xx.h"
#include "./led.h"
#include "./exti.h"
static void SystemClock_Config(void);
int main(void)
{
SystemClock_Config();//初始化系统时钟
LED_GPIO_Init(); //初始化LED引脚
EXTI_key_Config(); //初始化中断
/* 等待中断发生*/
while(1)
{
}
}
static void SystemClock_Config(void)
{
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitTypeDef RCC_OscInitStruct;
/* Enable Power Control clock */
__HAL_RCC_PWR_CLK_ENABLE();
/* The voltage scaling allows optimizing the power consumption when the device is
clocked below the maximum system frequency, to update the voltage scaling value
regarding system frequency refer to product datasheet. */
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
/* Enable HSE Oscillator and activate PLL with HSE as source */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 25;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 7;
if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
while(1) {};
}
/* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
clocks dividers */
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
{
while(1) {};
}
/* STM32F405x/407x/415x/417x Revision Z devices: prefetch is supported */
if (HAL_GetREVID() == 0x1001)
{
/* Enable the Flash prefetch */
__HAL_FLASH_PREFETCH_BUFFER_ENABLE();
}
}
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
it.c 内容
void KEY1_IRQHandler(void)
{
/*判断是否产生了中断*/
if(__HAL_GPIO_EXTI_GET_IT(KEY1_EXTI_GPIO_PIN)!=RESET)
{
LED1_TOGGLE;/*LED反转*/
__HAL_GPIO_EXTI_CLEAR_IT(KEY1_EXTI_GPIO_PIN);/*清除中断标志*/
}
}
void KEY2_IRQHandler(void)
{
/*判断是否产生了中断*/
if(__HAL_GPIO_EXTI_GET_IT(KEY2_EXTI_GPIO_PIN)!=RESET)
{
LED2_TOGGLE;/*LED反转*/
__HAL_GPIO_EXTI_CLEAR_IT(KEY2_EXTI_GPIO_PIN);/*清除中断标志*/
}
}
void KEY3_IRQHandler(void)
{
/*判断是否产生了中断*/
if(__HAL_GPIO_EXTI_GET_IT(KEY3_EXTI_GPIO_PIN)!=RESET)
{
LED3_TOGGLE;/*LED反转*/
__HAL_GPIO_EXTI_CLEAR_IT(KEY3_EXTI_GPIO_PIN);/*清除中断标志*/
}
}
void KEY4_IRQHandler(void)
{
/*判断是否产生了中断*/
if(__HAL_GPIO_EXTI_GET_IT(KEY4_EXTI_GPIO_PIN)!=RESET)
{
LED4_TOGGLE;/*LED反转*/
__HAL_GPIO_EXTI_CLEAR_IT(KEY4_EXTI_GPIO_PIN);/*清除中断标志*/
}
}
void KEY5_IRQHandler(void)
{
/*判断是否产生了中断*/
if(__HAL_GPIO_EXTI_GET_IT(KEY5_EXTI_GPIO_PIN)!=RESET)
{
LED_ALLTOGGLE;/*LED反转*/
__HAL_GPIO_EXTI_CLEAR_IT(KEY5_EXTI_GPIO_PIN);/*清除中断标志*/
}
}
|