zoukankan      html  css  js  c++  java
  • 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
    }
    中断服务函数

     




      

  • 相关阅读:
    需要
    js学习
    vc 异常堆栈记录,这样不怕突然异常了
    1
    [Java] 动态代理 02 --生成代理主题角色
    [Java] 静态代理
    [Java] 反射机制 02
    [Java] 反射机制 01
    [Java] 正则表达式 02 EmailSpider 抓邮件, CodeCounter 统计程序有效代码行数
    [Java] 正则表达式 01 (基本都概览)
  • 原文地址:https://www.cnblogs.com/juan-4-14/p/12701639.html
Copyright © 2011-2022 走看看