のんの 2019-04-24 09:43 采纳率: 0%
浏览 374

我在程序里添加了四个中断函数,为什么火焰报警器和定时器的中断就能触发,按键的中断就触发不了

#include "Exti.h"
#include "./led/bsp_led.h"
static void NVIC_Configuaration2(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
//中断分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//主优先级
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
//子优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
//使能中断
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
//中断源火焰传感器
NVIC_InitStructure.NVIC_IRQChannel=FIRE_INT_EXTI_IRQ ;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI_Fire_Config(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
Fire_GPIO_Config();
NVIC_Configuaration2();
//火焰传感器的EXTI配置
//选择EXTI的信号源为火焰传感器
GPIO_EXTILineConfig(FIRE_INT_EXTI_PORTSOURCE,FIRE_INT_EXTI_PINSOURCE);
EXTI_InitStructure.EXTI_Line=FIRE_INT_EXTI_LINE ;
//EXTI模式为中断
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
//上升沿触发
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
//使能EXTI
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}

void Fire_GPIO_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
这是火焰传感器的中断配置
void FIRE_IRQHandler (void)
{
if(EXTI_GetITStatus(FIRE_INT_EXTI_LINE)!=RESET)
{
Fire_Flag=1;
EXTI_ClearITPendingBit(FIRE_INT_EXTI_LINE);
}
这是火焰传感器的中断函数
void FireAlarm(void)
{
if(Fire_Flag==1)
{
Fire_Flag=0;
OLED_Init();
OLED_ShowStr(0,10,(unsigned char*)"Fire Warning",2);
while(1)
{
GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);
Delay_ms(200);
GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);
Delay_ms(200);
GPIO_ResetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);
Delay_ms(200);
GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);
}
}
}
这是触发火焰传感器中断后要执行的函数
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* 配置NVIC为优先级组1 /
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/
配置中断源:按键1 /
NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;
/
配置抢占优先级 /
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
/
配置子优先级 /
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
/
使能中断通道 /
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/
配置中断源:按键2,其他使用上面相关配置 */

NVIC_InitStructure.NVIC_IRQChannel = KEY2_INT_EXTI_IRQ;
NVIC_Init(&NVIC_InitStructure);
}
这是按键的NVIC配置
void EXTI_Key_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;

/*开启按键GPIO口的时钟*/
RCC_APB2PeriphClockCmd(KEY1_INT_GPIO_CLK|KEY2_INT_GPIO_CLK,ENABLE);

/* 配置 NVIC 中断*/
NVIC_Configuration();

/*--------------------------KEY1配置-----------------------------*/
/* 选择按键用到的GPIO /
GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;
/
配置为浮空输入 */

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStructure);

/* 选择EXTI的信号源 */

GPIO_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE, KEY1_INT_EXTI_PINSOURCE);
EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;

/* EXTI为中断模式 */

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
/* 上升沿中断 /
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
/
使能中断 /

EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
按键1的EXTI配置
void KEY1_IRQHandler(void)
{
if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE)!=RESET)
{
RESET_Flag=1;
EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);
}
}
按键1的中断配置
void RESETs(void)
{
if(RESET_Flag==1)
{
RESET_Flag=0;
/
关闭所有led灯 */
GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);

    /* 关闭所有led灯   */
    GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);     

/* 关闭所有led灯   */
    GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);
}

}
这是进入按键1中断之后再应该执行的函数

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 Stata 面板数据模型选择
    • ¥20 idea运行测试代码报错问题
    • ¥15 网络监控:网络故障告警通知
    • ¥15 django项目运行报编码错误
    • ¥15 请问这个是什么意思?
    • ¥15 STM32驱动继电器
    • ¥15 Windows server update services
    • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
    • ¥15 模糊pid与pid仿真结果几乎一样
    • ¥15 java的GUI的运用