野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3634|回复: 1

stm32F407按键中断失败

[复制链接]
发表于 2023-2-14 14:17:28 | 显示全部楼层 |阅读模式

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);/*清除中断标志*/
        }       
}

回复

使用道具 举报

发表于 2023-2-14 17:58:24 | 显示全部楼层
按键3对应引脚13的中断线是EXTI13,对应中断源是EXTI15_10_IRQn,以及对应EXTI15_10_IRQHandler中断函数
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-5 10:44 , Processed in 0.033613 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表