野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 110|回复: 1

指南者 第18章 EXTI外部中断,第二个按键检测异常

[复制链接]
发表于 6 天前 | 显示全部楼层 |阅读模式
本帖最后由 Rddavid 于 2025-1-5 11:07 编辑

大家好,我最近调试指南者 EXTI外部中断,发现一些问题,请各位大神赐教,谢谢!

问题描述:
1)烧录程序后,绿色LED常亮;按下按键1(PA0),可以控制亮灭;
2)按下按键2(PC13),发现不能控制对应的LED;
3)同时还发现一个问题:只要按了按键2,就会连按键1的控制也变异常。
顺便提一下,烧录官方的固件库代码,两个按键都无法控制。
图像_2025-01-05_110411545.png
我的代码如下:
main.c

#include "stm32f10x.h"   
#include "bsp_led.h"
#include "bsp_exti.h"
void Delay(uint32_t count)
{
        for(;count!=0;count--);
}

int main(void)
{
        LED_GPIO_Config();
        EXTI_KEY_Config();
        
        LED_G(ON);
        LED_B(OFF);
        LED_R(OFF);

        while(1)
        {               
        }        
}


stm32f10x_it.c

void EXTI0_IRQHandler(void)
{
  if (EXTI_GetITStatus(EXTI_Line0)!= 0)
        {
                LED_G_TOGGLE;
          EXTI_ClearITPendingBit(EXTI_Line0);               
        }
}

void EXTI13_IRQHandler(void)
{
  if (EXTI_GetITStatus(EXTI_Line13)!= 0)
        {
                LED_B_TOGGLE;
          EXTI_ClearITPendingBit(EXTI_Line13);               
        }
}


bsp_exti.c

#include "bsp_exti.h"

static void EXTI_NVIC_Config(void)  //static 限定此函数只能被bsp_exti.c这个文件里面的函数调用
{
        NVIC_InitTypeDef NVIC_InitStruct;
        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        
        NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;        
        
        NVIC_Init(&NVIC_InitStruct);        
        
        //配置中断源:按键2,其他使用上面相关配置
        NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;        
        NVIC_Init(&NVIC_InitStruct);
}

void EXTI_KEY_Config(void)
{
        GPIO_InitTypeDef  GPIO_InitStruct;
        EXTI_InitTypeDef  EXTI_InitStruct;
        
        //配置中断优先级
        EXTI_NVIC_Config();
        
/*--------------------------KEY1配置-----------------------------*/
        
        //初始化GPIO        
        RCC_APB2PeriphClockCmd(KEY1_INT_GPIO_CLK, ENABLE);        
        GPIO_InitStruct.GPIO_Pin = KEY1_INT_GPIO_PIN;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        
        GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStruct);        
        
        //初始化EXTI
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);        //开时钟
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
        //配置结构体成员
        EXTI_InitStruct.EXTI_Line = EXTI_Line0;
        EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
        EXTI_InitStruct.EXTI_LineCmd = ENABLE; // 打开响应中断
        
        EXTI_Init(&EXTI_InitStruct); //把这些结构体成员写到相应的寄存器里面,&取地址符号
        
/*--------------------------KEY2配置-----------------------------*/
        //初始化GPIO        
        RCC_APB2PeriphClockCmd(KEY2_INT_GPIO_CLK, ENABLE);        
        GPIO_InitStruct.GPIO_Pin = KEY2_INT_GPIO_PIN;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        
        GPIO_Init(KEY2_INT_GPIO_PORT, &GPIO_InitStruct);        
        
        //初始化EXTI
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);        //开时钟
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);
        //配置结构体成员
        EXTI_InitStruct.EXTI_Line = EXTI_Line13;
        EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
        EXTI_InitStruct.EXTI_LineCmd = ENABLE; // 打开响应中断
        
        EXTI_Init(&EXTI_InitStruct); //把这些结构体成员写到相应的寄存器里面,&取地址符号

}


bsp_exti.h

#ifndef __BSP_EXTI_H
#define __BSP_EXTI_H

#include "stm32f10x.h"

#define KEY1_INT_GPIO_PIN     GPIO_Pin_0
#define KEY1_INT_GPIO_PORT    GPIOA
#define KEY1_INT_GPIO_CLK     RCC_APB2Periph_GPIOA

#define KEY2_INT_GPIO_PIN     GPIO_Pin_13
#define KEY2_INT_GPIO_PORT    GPIOC
#define KEY2_INT_GPIO_CLK     RCC_APB2Periph_GPIOC

void EXTI_NVIC_Config(void);
void EXTI_KEY_Config(void);

#endif  /*__BSP_EXTI_H*/


bsp_led.c

// bsp:board support package 板级支持包

#include "bsp_led.h"

void LED_GPIO_Config(void)
{
  GPIO_InitTypeDef  GPIO_InitStruct;
        //配置绿色LED控制IO PB0
        RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE);
        
        GPIO_InitStruct.GPIO_Pin = LED_G_GPIO_PIN;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        
        GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct);        
        
        //配置蓝色LED控制IO PB1
        GPIO_InitStruct.GPIO_Pin = LED_B_GPIO_PIN;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        
        GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct);        
        
        //配置红色LED控制IO PB5
        GPIO_InitStruct.GPIO_Pin = LED_R_GPIO_PIN;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        
        GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct);        
        
}


bsp_led.h

#ifndef __BSP_LED_H
#define __BSP_LED_H

#include   "stm32f10x.h"

#define LED_G_GPIO_PIN     GPIO_Pin_0
#define LED_G_GPIO_PORT    GPIOB
#define LED_G_GPIO_CLK     RCC_APB2Periph_GPIOB

#define LED_B_GPIO_PIN     GPIO_Pin_1
#define LED_R_GPIO_PIN     GPIO_Pin_5

#define ON    1
#define OFF   0

// \C语言的续行符号,后面不能有任何东西,空格都不能有,只能回车

#define LED_G(a) if(a) \
                          GPIO_ResetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN); \
                 else GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);
#define LED_B(a) if(a) \
                          GPIO_ResetBits(LED_G_GPIO_PORT, LED_B_GPIO_PIN); \
                 else GPIO_SetBits(LED_G_GPIO_PORT, LED_B_GPIO_PIN);
#define LED_R(a) if(a) \
                          GPIO_ResetBits(LED_G_GPIO_PORT, LED_R_GPIO_PIN); \
                 else GPIO_SetBits(LED_G_GPIO_PORT, LED_R_GPIO_PIN);

// ^ 异或,C语言的一个二进制运算符
// 与1异或改变,与0异或不变

#define LED_G_TOGGLE    {LED_G_GPIO_PORT->ODR^= LED_G_GPIO_PIN;}
#define LED_B_TOGGLE    {LED_G_GPIO_PORT->ODR^= LED_B_GPIO_PIN;}
#define LED_R_TOGGLE    {LED_G_GPIO_PORT->ODR^= LED_R_GPIO_PIN;}

void LED_GPIO_Config(void);

#endif   /*__BSP_LED_H*/

野火论坛202501051053487719..png
图像_2025-01-05_110252440.png
图像_2025-01-05_110432748.png
图像_2025-01-05_110454941.png

18-EXTI-外部中断.rar

4.39 MB, 下载次数: 5

回复

使用道具 举报

 楼主| 发表于 3 天前 | 显示全部楼层
还没解决,有高手愿意指导一下吗?感谢!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 06:39 , Processed in 0.129951 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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