zoukankan      html  css  js  c++  java
  • STM32 外部中断详解(原理+配置代码)

    本文介绍了STM32基于标准外设库的外部中断配置,以及基于参考手册如何更加寄存器配置外部中断

    1 前言

    打算写一下中断,又忍不住想说一下中断的概念,去书上翻一翻,或者自己在搜索引擎上搜一下,都可以找到一大堆,包括本文写的这个外部中断也不例外。如果要写光是中断就可以单独写一篇了,所以本文直入主题,对于STM32的外部中断进行详细的剖析。

    2 STM32的外部中断

    下图来自《STM32参考手册》,从整个架构图可以知道,外部中断的功能可以配置六个寄存器;

    • 中断屏蔽寄存器(EXTI_IMR)
    • 事件屏蔽寄存器(EXTI_EMR)
    • 上升沿触发选择寄存器(EXTI_RTSR)
    • 下降沿触发选择寄存器(EXTI_FTSR)
    • 软件中断事件寄存器(EXTI_SWIER)
    • 挂起寄存器(EXTI_PR)
      在这里插入图片描述
      EXTI支持配置20个中断和事件屏蔽位;
    • GPIO端口以下图的方式连接到16个外部中断/事件线上;EXTI_Line0EXTI_Line15
    • EXTI_Line16 连接到PVD输出 ;
    • EXTI_Line17连接到RTC闹钟事件;
    • EXTI_Line18连接到USB唤醒事件;
    • EXTI_Line19连接到以太网唤醒事件(只适用于互联型产品);

    GPIO的映射关系图如下所示;
    在这里插入图片描述

    3 中断服务函数的映射关系

    GPIO IRQn IRQHandler
    GPIO_Pin0 EXTI0_IRQn EXTI0_IRQHandler
    GPIO_Pin1 EXTI1_IRQn EXTI1_IRQHandler
    GPIO_Pin2 EXTI2_IRQn EXTI2_IRQHandler
    GPIO_Pin3 EXTI3_IRQn EXTI3_IRQHandler
    GPIO_Pin4 EXTI4_IRQn EXTI4_IRQHandler
    GPIO_Pin5 — GPIO_Pin9 EXTI9_5_IRQn EXTI9_5_IRQHandler
    GPIO_Pin10 — GPIO_Pin15 EXTI15_10_IRQn EXTI15_10_IRQHandler

    4 外部中断的配置

    宏定义,抽象一下接口,方便后面修改;

    #define Z_GPIO_PIN    GPIO_Pin_5
    #define Z_GPIO_PORT   GPIOE
    #define Z_PortSource  GPIO_PortSourceGPIOE
    #define Z_PinSource   GPIO_PinSource5
    #define Z_Line        EXTI_Line5
    #define Z_IRQ         EXTI9_5_IRQn
    

    GPIO的配置;这里GPIO的输入模式可以配置为浮空输入(GPIO_Mode_IN_FLOATING),上拉输入(GPIO_Mode_IPU)或者下拉输入(GPIO_Mode_IPD),具体如下图所示;
    在这里插入图片描述GPIO的配置代码如下;

    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_StructInit(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = Z_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(Z_GPIO_PORT, &GPIO_InitStructure);
    

    不要忘记外设总线时钟的配置;

     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |
     		RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF |
        	RCC_APB2Periph_GPIOG, ENABLE);
    

    EXTI的配置,EXTI_Trigger这里支持三种模式;

    • EXTI_Trigger_Rising 上升沿触发;
    • EXTI_Trigger_Falling 下降沿触发;
    • EXTI_Trigger_Rising_Falling 上升沿和下降沿都可以触发;
    GPIO_EXTILineConfig(Z_PortSource, Z_PinSource);
    
    EXTI_InitStructure.EXTI_Line = Z_Line; 
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; 	//下降沿
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
    

    NVIC的配置

     NVIC_InitStructure.NVIC_IRQChannel = Z_IRQ;
     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
     NVIC_Init(&NVIC_InitStructure);
    

    中断服务函数

    void EXTI9_5_IRQHandler(void)
    {
         //中断服务函数
    }
    

    以上就完成了检测下降沿信号的GPIOE5的外部中断;
    也参考官方DEMO
    STM32F10x_StdPeriph_Lib_V3.5.0ProjectSTM32F10x_StdPeriph_ExamplesEXTIEXTI_Config

    5 寄存器的操作

    以下摘自**《STM32参考手册》**
    产生产生中断的步骤,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在**中断屏蔽寄存器(EXTI_IMR)的相应位写1允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置1。在挂起寄存器(EXTI_PR)的对应位写1,将清除该中断请求。
    产生事件的步骤:必须先配置好并使能事件线。根据需要的边沿检测通过设置2个触发寄存器,同时在
    中断屏蔽寄存器(EXTI_IMR)**的相应位写1允许事件请求。当事件线上发生了需要的边沿时,将产生一个事件请求脉冲,对应的挂起位不被置1。通过在软件中断/事件寄存器写1,也可以通过软件产生中断/事件请求。

    • 中断屏蔽寄存器(EXTI_IMR)
    • 事件屏蔽寄存器(EXTI_EMR)
    • 上升沿触发选择寄存器(EXTI_RTSR)
    • 下降沿触发选择寄存器(EXTI_FTSR)
    • 软件中断事件寄存器(EXTI_SWIER)
    • 挂起寄存器(EXTI_PR)

    IMR如下图所示,其他几个类似;
    在这里插入图片描述

    5.1 硬件中断选择

    通过下面的过程来配置20个线路做为中断源:

    • 配置20个中断线的屏蔽位(EXTI_IMR)
    • 配置所选中断线的触发选择位(EXTI_RTSR和EXTI_FTSR);
    • 配置对应到外部中断控制器(EXTI)的NVIC中断通道的使能和屏蔽位,使得20个中断线中的请求可以被正确地响应。

    5.2 硬件事件选择

    通过下面的过程,可以配置20个线路为事件源

    • 配置20个事件线的屏蔽位(EXTI_EMR)
    • 配置事件线的触发选择位(EXTI_RTSR和EXTI_FTSR)

    5.3 软件中断/事件的选择

    20个线路可以被配置成软件中断/事件线。下面是产生软件中断的过程:

    • 配置20个中断/事件线屏蔽位(EXTI_IMR, EXTI_EMR)
    • 设置软件中断寄存器的请求位(EXTI_SWIER)

    6 总结

    本文参考stm32手册对于外部中断的概念以及配置进行了介绍,本人能力有限,难免存在错误和纰漏,请大佬不吝赐教。

  • 相关阅读:
    Unix配置定时执行任务
    在Mac上使用Make编译时出现clang: error: unsupported option '-fopenmp'的解决办法
    git的一些操作
    Github误上传多余的文件夹后解决办法
    Ubuntu18.04安装使用YOLOv3
    本地IDEA中使用Spark直连集群上的Hive
    如何利用dokcer提交我的比赛代码
    Activiti7之整合spring和spring boot
    Activiti7之网关
    Activiti7之组任务
  • 原文地址:https://www.cnblogs.com/unclemac/p/12783343.html
Copyright © 2011-2022 走看看