stm32之外部中断

  外部中断/事件控制器包含多达 19 个用于产生事件/中断请求的边沿检测器。 每根输入线都可单独进行配置, 以选择类型( 中断或事件) 和相应的触发事件( 上升沿触发、 下降沿触
发或边沿触发) 。 每根输入线还可单独屏蔽。 挂起寄存器用于保持中断请求的状态线。其中有16条是对应于GPIO的 
  内核中会有一个NVIC( 嵌套向量中断控制器) 来管理所有的中断, 并对中断进行分组和优先级的分配。 
  Cortex-M3内核总共可以分0...7总共八组, 而STM32单片机只使用其中5组 
  一。外部中断的配置使用

  如果是事件触发中断,需要进行外部事件是什么,如按键触发中断,则按键的引脚是IO几,通过观察状态线对应的GPIO进行选择IO口映射到的外部中断线

  

 

  (一).外部中断初始化

  1.打开AFI0和IO端口时钟

  2.IO口初始化--按键是输入模式:如果按键函数单独配置了,这里可以省略IO口配置。

  3.IO口映射到外部中断线上GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);或是AFIO->EXTICR[0] &=~ (0xf<<0);

  4.选择中断源,开放中断请求,设置优先级,设置优先级分组NVIC_SetPriorityGrouping(5);//占先:2位  次级:2位,中断管理使能---------------寄存器配置

  44。配置外部中断 EXTI_InitTypeDef EXTI_InitStruct;,,设置优先级NVIC_InitTypeDef NVIC_InitStruct;,设置优先级分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);-----------库函数配置

  

void Exti0_Init(void)
{
#if  reg_progream
    //使能AFIO时钟   PA端口时钟
    RCC->APB2ENR |= (1<<0)|(1<<2);
//    //PA0浮空输入
//    GPIOA->CRL &=~(0xf<<0);
//    GPIOA->CRL |= (0x4<<0);
    //IO口映射到外部中断线EXTI0     PA0  -- EXI0   
    AFIO->EXTICR[0] &=~ (0xf<<0);
    //选择中断源
    EXTI->FTSR |= (1<<0);
    //开放中断请求
    EXTI->IMR |= (1<<0);
//    //设置优先级分组
//    NVIC_SetPriorityGrouping(5);//占先:2位  次级:2位
    //设置优先级    01  01
    NVIC_SetPriority(EXTI0_IRQn,5);
    //中断管理使能
    NVIC_EnableIRQ(EXTI0_IRQn);
#else
    EXTI_InitTypeDef EXTI_InitStruct;
    NVIC_InitTypeDef NVIC_InitStruct;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    //IO口映射到外部中断线EXTI0
    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);
//    //设置优先级分组  :占先:2位  次级:2位
//    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    //设置优先级
    NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn; //中断向量表中的位置
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x01;//占先优先级 01
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x01; //次级优先级 01
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //使能
    NVIC_Init(&NVIC_InitStruct);
    
#endif
    
}
外部中断0初始化

 

 (二)中断服务函数

  1、 进入中断服务函数要先清除中断标志位
  2、 中断服务函数无参数、 无返回值
  3、 快进快出( 中断服务函数最好不要加延时)
  4、 中断服务函数不声明不调用

  配置过程:

        1.先判断中断是否产生

        2.产生的话清中断标志位

void EXTI0_IRQHandler(void)
{
#if  reg_progream
    if(EXTI->PR &(1<<0))//判断中断是否产生
    {
        EXTI->PR |= (1<<0);//清中断
        printf("中断产生
");
    }
#else
    if(EXTI_GetITStatus(EXTI_Line0)==SET)
    {
        EXTI_ClearITPendingBit(EXTI_Line0);//清中断
        printf("中断产生
");
    }
#endif
}
中断服务函数

 




  

原文地址:https://www.cnblogs.com/juan-4-14/p/12701639.html