STM32-外部中断配置

STM32-外部中断配置


外部中断配置的整体图:

在这里插入图片描述

步骤如下:
  1. 配置RCC,把我们这里涉及到的外设的时钟都打开,不打开时钟外设是没有办法工作的。
  2. 配置GPIO,选择我们的端口为输入模式。
  3. 配置AFIO,选择我们用的这一路GPIO,连接到后面的EXIT。
  4. 配置EXTI,选择边沿触发方式,比如上升沿,下降沿或双边沿。还有选择触发响应方式,可以选择中断响应和事件响应,这里我们一般都是中断响应。
  5. 配置NVIC,给我们的中断选择一个合适的优先级。最后,通过NVIC,外部中断信号就能进入CPU了。
  6. 最后是找到相应的中断函数。
以下是每一步的具体步骤:
  1. 配置RCC
  • 配置GPIOB的时钟
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB,ENABLE);
  • 配置AFIO的时钟
RCC_APB2PeriphClockCmd (RCC_APB2Periph_AFIO,ENABLE);
  • EXTI和NVIC都不需要开启时钟,因为这两个都是内核的外设,内核的外设都是不需要开启时钟的,相当于和CPU一起都是住在“皇宫”里面的,RCC管的都是内核外的外设,因此管不着NVIC。
  1. 配置GPIO,这里和都在熟悉不过了,这里根据ST公司的手册推荐,对应EXTI配置相应的模式。

在这里插入图片描述

    GPIO_InitTypeDef GPIO_InitStructure;//将该枚举类型结构体命名为 GPIO_InitStructure
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//这里因为用到的是EXTI,根据手册推荐我们配置为上拉输入。
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
    GPIO_Init (GPIOB,&GPIO_InitStructure);
  1. 配置AFIO
    //AFIO的配置
    GPIO_EXTILineConfig (GPIO_PortSourceGPIOB,GPIO_PinSource14);

这条语句的作用相当于把GPIOB的第14个 i\o口和EXTI的第14个外部中断线路连通了。

  1. 配置EXTI
    
    EXTI_InitTypeDef  EXTI_InitStructure;
    EXTI_InitStructure.EXTI_Line = EXTI_Line14; //配置第十四个中断线
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;  //使能EXTI
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 使用中断模式
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  //下降沿触发
    EXTI_Init(&EXTI_InitStructure);
  1. 配置NVIC
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//分组方式每个芯片只能用一种,因此该刚代码只能出现一次,这里建议放在main()函数最开始。
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel =EXTI15_10_IRQn;//STM32中的EXTI10到EXTI15都是合并到了这个通道里。
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; 
    NVIC_Init(&NVIC_InitStructure);

  1. 配置相应的中断函数,要找到相应中断通道对应的中断函数,则要到STM32库函数中的启动文件里面找(startup_stm32f10x_md.s)
    void EXTI15_10_IRQHandler(void)
    {
        if(EXTI_GetITStatus(EXTI_Line14)== SET)//判断是不是14号中断口进来的中断函数。
        {
            /*
            
            这里写要中断函数要执行的程序
            
            */           
            EXTI_ClearITPendingBit(EXTI_Line14);//清除中断标志位,如果不清楚,则程序会一直卡死在中断程序里面。          
        }      
    }

最后要记得在中断程序执行完成后要清楚中断标志位。

所有程序
#include "stm32f10x.h"                  // Device header

void Countsensor_Init(void)
{  
    //GPIO的配置
    GPIO_InitTypeDef GPIO_InitStructure;//将该枚举类型结构体命名为 GPIO_InitStructure
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//这里因为用到的是EXTI,根据手册推荐我们配置为上拉输入。
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
    GPIO_Init (GPIOB,&GPIO_InitStructure);
    
    //时钟配置
    RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB,ENABLE);
    RCC_APB2PeriphClockCmd (RCC_APB2Periph_AFIO,ENABLE);    
    
    //AFIO的配置
    GPIO_EXTILineConfig (GPIO_PortSourceGPIOB,GPIO_PinSource14);
    
    //配置EXTI
    EXTI_InitTypeDef EXTI_InitStructure;
    EXTI_InitStructure.EXTI_Line = EXTI_Line14; //配置第十四个中断线
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;  //使能EXTI
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 使用中断模式
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  //下降沿触发
    EXTI_Init(&EXTI_InitStructure);
    
    //配置NVIC
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//分组方式每个芯片只能用一种,因此该刚代码只能出现一次,这里建议放在main()函数最开始。
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel =EXTI15_10_IRQn;//STM32中的EXTI10到EXTI15都是合并到了这个通道里。
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; 
    NVIC_Init(&NVIC_InitStructure);
    
} 
void EXTI15_10_IRQHandler(void)
    {
        if(EXTI_GetITStatus(EXTI_Line14)== SET)//判断是不是14号中断口进来的中断函数。
        {
            /*
            
            这里写要中断函数要执行的程序
            
            */           
            EXTI_ClearITPendingBit(EXTI_Line14);//清除中断标志位,如果不清楚,则程序会一直卡死在中断程序里面。          
        }      
    }
    
 
    
    
    

    
    


声明:本文参照b站up主江科大自化协的视频所写,即学习笔记。

  • 25
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值