初级会员 
  
	- 积分
 - 87
 
        - 金钱
 - 87 
 
       - 注册时间
 - 2022-1-6
 
      - 在线时间
 - 27 小时
 
 
 
 | 
 
2金钱 
f4进入中断后,不能返回,程序如下: 
********************************************************************************fire.h**************************************************************************************************#ifndef _FIRE_H 
#define _FIRE_H 
#include "sys.h" 
#include "delay.h" 
#include "oled.h" 
#include "led.h"  
// E2 E3 E4 E5 E6 
 
#define fire1 PEin(10) 
#define fire2 PEin(11) 
#define fire3 PEin(12) 
#define fire4 PEin(13) 
#define fire5 PEin(14) 
 
void Fire_init(void);  //火焰传感器初始化 
void EXTI15_10_Init(void); //中断向量初始化 
 
#endif 
********************************************************************************fire.c************************************************************************************************** 
 
 
 
#include "fire.h" 
 
void Fire_init(void) 
{ 
    GPIO_InitTypeDef GPIO_InitStructure; 
 
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); //使能GPIOE时钟 
 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14; // fire12345对应引脚 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;                                                       //普通输入模式 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;                                                 // 100M 
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;                                                     //下拉 
    GPIO_Init(GPIOE, &GPIO_InitStructure);                                                             //初始化GPIOE2,3,4 
} 
 
void EXTI15_10_Init(void) 
{ 
    NVIC_InitTypeDef NVIC_InitStructure; 
    EXTI_InitTypeDef EXTI_InitStructure; 
 
    Fire_init(); //按键对应的IO口初始化 
 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //使能SYSCFG时钟 
 
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource10); // PE10 连接到中断线10 
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource11); // PE11 连接到中断线11 
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource12); // PE12 连接到中断线12 
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource13); // PE13 连接到中断线13 
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource14); // PE14 连接到中断线14 
 
    /* 配置EXTI_Linex */ 
    EXTI_InitStructure.EXTI_Line = EXTI_Line10 | EXTI_Line11 | 
                                   EXTI_Line12 | EXTI_Line13 | EXTI_Line14; // LINEx 
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                     //中断事件 
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;                  //上升沿触发 
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;                               //使能LINE 
    EXTI_Init(&EXTI_InitStructure);                                         //配置 
 
    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;         //外部中断 
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; //抢占优先级1 
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;        //子优先级2 
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;              //使能外部中断通道 
    NVIC_Init(&NVIC_InitStructure);                              //配置 
} 
 
void EXTI15_10_IRQHandler(void) 
{ 
 
    delay_ms(100); 
    if (fire1 == 1) 
    { 
        EXTI_ClearITPendingBit(EXTI_Line10); //清除LINE0上的中断标志位 
        OLED_Clear(); 
        OLED_ShowString(25, 20, "Find fire1", 16, 1); 
        OLED_Refresh(); 
        LED0 = 0; 
        LED1 = !LED1; 
    } 
 
    if (fire2 == 1) 
    { 
        EXTI_ClearITPendingBit(EXTI_Line11); //清除LINE0上的中断标志位 
        OLED_Clear(); 
        OLED_ShowString(25, 20, "Find fire2", 16, 1); 
        OLED_Refresh(); 
        LED0 = 1; 
        LED1 = 0; 
    } 
 
    if (fire3 == 1) 
    { 
        EXTI_ClearITPendingBit(EXTI_Line13); //清除LINE0上的中断标志位 
        OLED_Clear(); 
        OLED_ShowString(25, 20, "Find fire3", 16, 1); 
        OLED_Refresh(); 
        LED0 = 0; 
        LED1 = 0; 
    } 
 
    if (fire4 == 1) 
    { 
        EXTI_ClearITPendingBit(EXTI_Line14); //清除LINE0上的中断标志位 
        OLED_Clear(); 
        OLED_ShowString(25, 20, "Find fire4", 16, 1); 
        OLED_Refresh(); 
        LED0 = !LED0; 
        LED1 = 1; 
    } 
 
    if (fire5 == 1) 
    { 
        EXTI_ClearITPendingBit(EXTI_Line15); //清除LINE0上的中断标志位 
        OLED_Clear(); 
        OLED_ShowString(25, 20, "Find fire5", 16, 1); 
        OLED_Refresh(); 
        LED0 = 1; 
        LED1 = !LED1; 
    } 
} 
 
 
**********************************************************************************main.c******************************************************************************************** 
 
#include "sys.h" 
#include "delay.h" 
#include "usart.h" 
#include "oled.h" 
#include "bluetooth.h" 
#include "timer34.h" 
#include "fire.h" 
#include "led.h" 
 
u16 pwmval1 = 25; 
u16 pwmval2 = 25; 
u16 pwmval3 = 25; 
u16 pwmval4 = 25; 
 
int main(void) 
{ 
    int t=0; 
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置系统中断优先级分组2 
    LED_Init(); 
    uart_init(115200); 
    delay_init(168);                                //初始化延时函数 
    OLED_Init();                                    // OLED初始化 
    Usart3_init(9600); 
    EXTI15_10_Init(); 
    TIM3_Int_Init(500 - 1, 84 - 1); //定时器时钟84M,分频系数84,所以84M/84=1Mhz的计数频率,频率为10khz 
    TIM4_Int_Init(500 - 1, 84 - 1); //定时器时钟84M,分频系数84,所以84M/84=1Mhz的计数频率,频率为10khz 
    while (1) 
    { 
        OLED_Clear(); 
        OLED_ShowString(25, 20, "work", 16, 1); 
        OLED_Refresh(); 
        LED2=!LED2; 
        printf("t:%d\r\n",t); 
        t++; 
        delay_ms(500); 
    } 
} 
 
 
 
 
 
 
 |   
 
 
 
 
 
 |