小学生
最后登录1970-1-1
在线时间 小时
注册时间2024-2-24
|
在本章的作业中要求按键一和按键二都实现中断,但在我自己写的代码中仍然只能实现按键一
希望各位大佬可以帮我找到问题所在
主函数:
#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);
}
|
|