野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 829|回复: 4

第18章,中断作业问题询问

[复制链接]
发表于 2024-2-24 11:43:36 | 显示全部楼层 |阅读模式
在本章的作业中要求按键一和按键二都实现中断,但在我自己写的代码中仍然只能实现按键一

希望各位大佬可以帮我找到问题所在
主函数:

#include "stm32f10x.h"
#include "BSP_LED.h"
#include "bsp_key.h"
#include "bsp_exti.h"

int main(void)
{
       
        LED_GPIO_Confing();
        KEY_GPIO_Confing();
        EXTI_KEY_Confing();
       
        LED_R(OFF);
        LED_G(OFF);
        LED_B(OFF);
        while(1)
        {
               
        }

}






bsp_exti.h:



#ifndef __BSP_EXTI_H
#define __BSP_EXTI_H

#include "stm32f10x.h"

#define EXTI_KEY_1_Pin     GPIO_Pin_0
#define EXTI_KEY_1_Port    GPIOA
#define EXTI_KEY_1_Clk     (RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO)

#define EXTI_KEY_2_Pin     GPIO_Pin_13
#define EXTI_KEY_2_Port    GPIOC
#define EXTI_KEY_2_Clk     (RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO)

void EXTI_KEY_Confing(void);


#endif         /*__BSP_EXTI_H*/





bsp_exti.c:


#include "bsp_exti.h"

static void NVIC_KEY_1_Confing(void)
{
        NVIC_InitTypeDef NVIC_KEY_InitStruct;   //配置按键中断优先级结构体

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

        NVIC_KEY_InitStruct.NVIC_IRQChannel=EXTI0_IRQn;
        NVIC_KEY_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_KEY_InitStruct.NVIC_IRQChannelSubPriority=1;
        NVIC_KEY_InitStruct.NVIC_IRQChannelCmd=ENABLE;

        NVIC_Init(&NVIC_KEY_InitStruct);
       

       
}

static void NVIC_KEY_2_Confing(void)
{
        NVIC_InitTypeDef NVIC_KEY_InitStruct;   //配置按键中断优先级结构体

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

        NVIC_KEY_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;
        NVIC_KEY_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_KEY_InitStruct.NVIC_IRQChannelSubPriority=0;
        NVIC_KEY_InitStruct.NVIC_IRQChannelCmd=ENABLE;

        NVIC_Init(&NVIC_KEY_InitStruct);

       
       
}

void EXTI_KEY_1_Confing(void)
{
        GPIO_InitTypeDef GPIO_KEY_InitStruct;                //定义按键端口的结构体
        EXTI_InitTypeDef EXTI_KEY_InitStruct;                //定义按键中断的结构体
       
        NVIC_KEY_1_Confing();//配置中断优先级
       
        //初始化GPIO
        RCC_APB2PeriphClockCmd(EXTI_KEY_1_Clk, ENABLE);                //开启时钟

       
        GPIO_KEY_InitStruct.GPIO_Pin=EXTI_KEY_1_Pin;
        GPIO_KEY_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
//        GPIO_KEY_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;   
       
        GPIO_Init(EXTI_KEY_1_Port, &GPIO_KEY_InitStruct); //初始化设置

       
        //初始化EXTI
        //RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, ENABLE);//打开EXTI的时钟
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
       
        EXTI_KEY_InitStruct.EXTI_Line=EXTI_Line0;
        EXTI_KEY_InitStruct.EXTI_LineCmd=ENABLE;
        EXTI_KEY_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_KEY_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;
       
        EXTI_Init(&EXTI_KEY_InitStruct);
}

void EXTI_KEY_2_Confing(void)
{
        GPIO_InitTypeDef GPIO_KEY_InitStruct;                //定义按键端口的结构体
        EXTI_InitTypeDef EXTI_KEY_InitStruct;                //定义按键中断的结构体
       
        NVIC_KEY_2_Confing();//配置中断优先级
       
        //初始化GPIO
        RCC_APB2PeriphClockCmd(EXTI_KEY_2_Clk, ENABLE);                //开启时钟
       
        GPIO_KEY_InitStruct.GPIO_Pin=EXTI_KEY_2_Pin;
        GPIO_KEY_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_KEY_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;   
       
        GPIO_Init(EXTI_KEY_2_Port, &GPIO_KEY_InitStruct); //G灯设置

       
        //初始化EXTI
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, ENABLE);//打开EXTI的时钟
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13);
       
        EXTI_KEY_InitStruct.EXTI_Line=EXTI_Line13;
        EXTI_KEY_InitStruct.EXTI_LineCmd=ENABLE;
        EXTI_KEY_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_KEY_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;
       
        EXTI_Init(&EXTI_KEY_InitStruct);

}

void EXTI_KEY_Confing(void)
{
        EXTI_KEY_1_Confing();
        EXTI_KEY_2_Confing();
}


中断函数:


void EXTI0_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line0)==SET)
        {
                LED_R_TOGGLE;
        }
        EXTI_ClearITPendingBit(EXTI_Line0);

       
}


void EXTI15_10_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line13)==SET)
        {
                LED_R_TOGGLE;
        }
        EXTI_ClearITPendingBit(EXTI_Line13);

       
}







回复

使用道具 举报

发表于 2024-2-29 09:52:57 | 显示全部楼层
你的中断线你有去库里面看过是这个的嘛,有的中断线是单独的,有的是多个共用的
野火论坛202402290950574170..png
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-29 16:13:09 | 显示全部楼层
菠萝片 发表于 2024-2-29 09:52
你的中断线你有去库里面看过是这个的嘛,有的中断线是单独的,有的是多个共用的 ...

我看过了,这个线在库里面是有的
回复 支持 反对

使用道具 举报

发表于 2024-3-1 09:07:53 | 显示全部楼层
把这个注释掉看看,你有debug看看运行情况是怎么样的嘛
野火论坛202403010907242230..png
回复 支持 反对

使用道具 举报

发表于 2024-3-1 15:10:42 | 显示全部楼层
使能时钟应该使用我图上面的这种ClockCmd函数啊,为啥用下面这种外设复位的函数
野火论坛202403011508463652..png
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-1 07:22 , Processed in 0.135935 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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