打印
[STM32F4]

stm32F407按键中断失败

[复制链接]
632|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
两只袜子|  楼主 | 2023-3-9 14:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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);/*清除中断标志*/
        }      
}

使用特权

评论回复
沙发
jcky001| | 2023-3-9 16:23 | 只看该作者
按键3对应引脚13的中断线是EXTI13,对应中断源是EXTI15_10_IRQn,以及对应EXTI15_10_IRQHandler中断函数

使用特权

评论回复
板凳
软核硬核| | 2023-3-10 14:23 | 只看该作者
因为你的按键3的中断线是13啊。

使用特权

评论回复
地板
Pretext| | 2023-3-10 14:24 | 只看该作者
#define  KEY3_EXTI_GPIO_PIN              GPIO_PIN_13对应的外部中断函数就是EXTI15_10_IRQn的

使用特权

评论回复
5
芯路例程| | 2023-3-10 14:24 | 只看该作者
后面改的代码才是对的,去看看手册外部中断就知道了

使用特权

评论回复
6
Wordsworth| | 2024-4-15 07:05 | 只看该作者

主从定时的方式占用CPU资源少

使用特权

评论回复
7
Clyde011| | 2024-4-15 08:08 | 只看该作者

主从定时器门控的方式

使用特权

评论回复
8
公羊子丹| | 2024-4-15 09:01 | 只看该作者

主定时器为TIM1,通道2配置为PWM输出

使用特权

评论回复
9
万图| | 2024-4-15 10:04 | 只看该作者

中断计数的方式实现简

使用特权

评论回复
10
帛灿灿| | 2024-4-15 13:03 | 只看该作者

都可以产生指定个数的PWM脉冲

使用特权

评论回复
11
Bblythe| | 2024-4-15 14:06 | 只看该作者

输出了5个频率为10KHz的PWM脉冲

使用特权

评论回复
12
周半梅| | 2024-4-15 16:02 | 只看该作者

从定时器为TIM2,从模式选择为门控模式,触发源选择ITR0,开启定时器2中断。

使用特权

评论回复
13
Pulitzer| | 2024-4-15 17:05 | 只看该作者

根据实际需求选择用哪种方式

使用特权

评论回复
14
童雨竹| | 2024-4-15 19:01 | 只看该作者

使能主从模式,触发事件选择为更新事件,不需要开启中断。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2039

主题

7368

帖子

10

粉丝