新手,关于中断有个地方实在看不懂,求助!

2019-10-14 22:10发布

新手,C语言没什么基础,买了原子哥的板子跟着学了几天,看到中断,卡在exti.c上了,实在无法理解,原子哥的代码如下:

exti.c:
[mw_shl_code=cpp,true]#include "exti.h"
#include "led.h"
#include "key.h"
#include "delay.h"
#include "usart.h"
#include "beep.h"

//外部中断0服务程序
void EXTIX_Init(void)
{

    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    KEY_Init();  // 按键端口初始化
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟

   //GPIOE.3   中断线以及中断初始化配置 下降沿触发 //KEY1
   GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
   EXTI_InitStructure.EXTI_Line=EXTI_Line3;
   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
   EXTI_Init(&EXTI_InitStructure);    //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
   //GPIOE.4   中断线以及中断初始化配置  下降沿触发 //KEY0
   GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
   EXTI_InitStructure.EXTI_Line=EXTI_Line4;
   EXTI_Init(&EXTI_InitStructure);    //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

   //GPIOA.0   中断线以及中断初始化配置 上升沿触发 PA0  WK_UP
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
   EXTI_InitStructure.EXTI_Line=EXTI_Line0;
   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
   EXTI_Init(&EXTI_InitStructure);  //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

   NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;   //使能按键WK_UP所在的外部中断通道
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;     //子优先级3
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //使能外部中断通道
   NVIC_Init(&NVIC_InitStructure);
   NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;   //使能按键KEY1所在的外部中断通道
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;     //子优先级1
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //使能外部中断通道
   NVIC_Init(&NVIC_InitStructure);     //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
   NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;   //使能按键KEY0所在的外部中断通道
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;     //子优先级0
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //使能外部中断通道
   NVIC_Init(&NVIC_InitStructure);     //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

}
//外部中断0服务程序
void EXTI0_IRQHandler(void)
{
delay_ms(10);//消抖
if(WK_UP==1)    //WK_UP按键
{     
  BEEP=!BEEP;
}
EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位  
}

//外部中断3服务程序
void EXTI3_IRQHandler(void)
{
delay_ms(10);//消抖
if(KEY1==0)  //按键KEY1
{     
  LED1=!LED1;
}   
EXTI_ClearITPendingBit(EXTI_Line3);  //清除LINE3上的中断标志位  
}
void EXTI4_IRQHandler(void)
{
delay_ms(10);//消抖
if(KEY0==0)  //按键KEY0
{
  LED0=!LED0;
  LED1=!LED1;
}   
EXTI_ClearITPendingBit(EXTI_Line4);  //清除LINE4上的中断标志位  
}[/mw_shl_code]


main.c:
[mw_shl_code=cpp,true]int main(void)
{  

delay_init();       //延时函数初始化   
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200);  //串口初始化为115200
LED_Init();      //初始化与LED连接的硬件接口
BEEP_Init();    //初始化蜂鸣器IO
EXTIX_Init();          //初始化外部中断输入
LED0=0;     //先点亮红灯
while(1)
{     
  printf("OK ");
  delay_ms(1000);   
}  
}[/mw_shl_code]

问题一:我看到main.c里面调用了EXTIX_Init();  这个函数,那他为什么没有调用EXTI0_IRQHandler(void),EXTI3_IRQHandler(void),EXTI4_IRQHandler(void)这三个函数?如果不调用的话,那么主函数如何进入这三个中断函数然后执行?
问题二:以“EXTI0_IRQHandler”为例,这个函数名我可以自己定义吗?
问题三:我看到开发指南里面有中断服务函数的格式如下:
void EXTI3_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line3)!=RESET)//
判断某个线上的中断是否发生
{
中断逻辑…
EXTI_ClearITPendingBit(EXTI_Line3); //清除 LINE 上的中断标志位
}
}

而原子哥代码里是这样的:void EXTI3_IRQHandler(void)
{
delay_ms(10);//消抖
if(KEY1==0)  //按键KEY1
{     
  LED1=!LED1;
}   
EXTI_ClearITPendingBit(EXTI_Line3);  //清除LINE3上的中断标志位  
}
那么请问“if(KEY1==0) ”是判断中断的语句吗?或者说判断中断是否发生不需要严格的按照开发指南的语句来?我看这个函数感觉和普通的按键函数没什么区别啊,不就是普通的逻辑判断吗?


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。