小学生
最后登录1970-1-1
在线时间 小时
注册时间2025-1-4
|
本帖最后由 Rddavid 于 2025-1-5 11:07 编辑
大家好,我最近调试指南者 EXTI外部中断,发现一些问题,请各位大神赐教,谢谢!
问题描述:
1)烧录程序后,绿色LED常亮;按下按键1(PA0),可以控制亮灭;
2)按下按键2(PC13),发现不能控制对应的LED;
3)同时还发现一个问题:只要按了按键2,就会连按键1的控制也变异常。
顺便提一下,烧录官方的固件库代码,两个按键都无法控制。
我的代码如下:
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*/
|
|