STM32自学笔记(三)外部中断_pmj110119的博客-程序员宝宝

技术标签: stm32  stm32自学笔记  单片机  

stm32每个IO口都可以作为外部中断输入口。F103支持共19个外部中断/事件请求。每个中断设有状态位,有独立的触发和屏蔽装置。STM32F103的19个外部中断为:

线0~15:对应IO口的输入中断

线16:连接到PVD输出

线17:连接到RTC时钟事件

线18:连接到USB唤醒事件

中断线与GPIO的映射

GPIO 的管脚 GPIOx.0~GPIOx.15(x=A,B,C,D,EF,G)分别对应中断线 0~15。这样每个中断线对应了最多 7 个 IO 口,以线 0 为例:它对应了 GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、 GPIOE.0、GPIOF.0、GPIOG.0。而中断线每次只能连接到一个IO口上,需要配置决定具体映射到哪个IO口。

通过函数 GPIO_EXTILineConfig() 配置GPIO与中断线的映射关系:

 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2); 

这句代码将 中断线2 与 GPIOE 映射起来,显然就是GPIOE.2EXTI2中断线连接了.

外部中断的初始化

外部中断的初始化是通过函数 EXTI_Init() 实现的。配置过程与GPIO配置类似。以下是使用范例

  EXTI_InitTypeDef  EXTI_InitStructure;                   //实例化对象
  EXTI_InitStructure.EXTI_Line=EXTI_Line4;                //指定中断线4
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;     //中断
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发 
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;               //使能
  EXTI_Init(&EXTI_InitStructure);   //根据 EXTI_InitStruct 中指定的参数初始化外设EXTI寄存器上

既然是外部中断,涉及到中断就要设置NVIC中断优先级,这个不赘述了直接贴范例

  NVIC_InitTypeDef NVIC_InitStructure; 
  NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;             //使能按键外部中断通道 
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 2 
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;        //响应优先级 2 
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;              //使能外部中断通道 
  NVIC_Init(&NVIC_InitStructure);                              //中断优先级分组初始化 

当然不能忘了在main()中进行中断总的分组

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置 NVIC 中断分组 2:2

中断服务函数

中断服务函数的名字是事先定义好的,共有6个,分别为:

  EXPORT  EXTI0_IRQHandler           
  EXPORT  EXTI1_IRQHandler        
  EXPORT  EXTI2_IRQHandler          
  EXPORT  EXTI3_IRQHandler         
  EXPORT  EXTI4_IRQHandler           
  EXPORT  EXTI9_5_IRQHandler         
  EXPORT  EXTI15_10_IRQHandler     
 

中断线0~4每条线对应一个中断函数

中断线5~9共用中断函数 EXTI9_5_IRQHandler

中断线10~15共用中断函数 EXTI15_10_IRQHandler

编写中断服务函数时常用到下面两个函数

  1. 判断某个中断线上的中断是否发生

      ITStatus EXTI_GetITStatus(uint32_t EXTI_Line)

     

  2. 清除某个中断线上的中断标志位

      void EXTI_ClearITPendingBit(uint32_t EXTI_Line); 

    这个函数一般用在中断服务函数结束之前,清除中断的标志位

常用的中断服务函数格式为:

  void EXTI3_IRQHandler(void) 
  { 
      if(EXTI_GetITStatus(EXTI_Line3)!=RESET)//判断某个线上的中断是否发生     
      {   
          中断逻辑…   
          EXTI_ClearITPendingBit(EXTI_Line3);  //清除 LINE 上的中断标志位    
      }    
  } 

外部中断使用总结

使用IO口外部中断的一般步骤:(1~5步可以写在同一个函数中直接初始化好)

  1. 初始化IO口作为输入

    ......(将要用到的GPIO进行相应的初始化,这里不赘述了)

  2. 开启AFIO时钟

      RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);     //开启AFIO时钟

     

  3. 设置IO口与中断线的映射关系

      GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);  //将GPIOE.2作为外部中断

     

  4. 初始化线上中断,设置触发条件等

      EXTI_InitTypeDef  EXTI_InitStructure;                   //实例化对象
      EXTI_InitStructure.EXTI_Line=EXTI_Line4;                //指定中断线4
      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;     //中断
      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发 
      EXTI_InitStructure.EXTI_LineCmd = ENABLE;               //使能
      EXTI_Init(&EXTI_InitStructure);             //根据指定的参数初始化外设EXTI寄存器

     

  5. 配置中断分组(NVIC),并使能中断

      NVIC_InitTypeDef NVIC_InitStructure; 
      NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;        //使能按键外部中断通道    
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 2,     
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;   //子优先级 2    
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //使能外部中断通道 

     

  6. 编写中断服务函数

void EXTI3_IRQHandler(void) 
{ 
    if(EXTI_GetITStatus(EXTI_Line3)!=RESET)//判断某个线上的中断是否发生     
    {   
        中断逻辑…   
        EXTI_ClearITPendingBit(EXTI_Line3);  //清除 LINE 上的中断标志位    
    }    
}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/pmj110119/article/details/86764384

智能推荐

Q3c「最大可以支持多大容量的硬盘?」AirDisk_AirDisk的博客-程序员宝宝

Q3C内置硬盘接口为SATA3.0;最大可支持3.5寸6TB机械硬盘(超过6TB硬盘需要选配12V 5A电源适配器)Q3C结构专为3.5寸机械硬盘而设计;用户如使用2.5寸机械硬盘或固态硬盘,Q3C可能无法有效固定,建议选用AirDisk T2型号网络硬盘盒,专为2.5寸硬盘设计,简约小巧,功能同样强大。...

Git push-Permission denied,TortoiseGit可正常同步,Git Bash失败_xmmemory的博客-程序员宝宝

背景:公司内部服务器个人仓库,可通过Samba访问。问题现象:由于之前一直在window下用小乌龟界面操作,最近开始逐渐尝试在Ubuntu上开发,所以开始试着使用git bash来维护代码,简单的git status,git diff,git add以及git commit操作一切正常,但是在git pull以及git push时遇到了问题;提示信息为:Permission denied(p...

2020cvpr目标检测测试_AI视觉网奇的博客-程序员宝宝

https://github.com/wuyuebupt/doubleheadsrcnnBackbone AP AP_0.5 AP_0.7 AP_s AP_m AP_l Link ResNet-50-FPN 40.3 60.3 44.2 22.4 43.3 54.3 model ResNet-101-FPN 41.9 62.4 45.9 23.9 45.2 55.8 ...

Unity优化杂谈2(MONO内存)_Strung的博客-程序员宝宝

Mono内存是Unity中不会释放的内存,他的容量一旦被撑大,项目所占的内存就会跟着增大,不能手动释放。是一个比较危险的地方,wetest给出的标准是峰值不要超过50M,wetest里面会有最大的top50的占用信息,里面有一些重复,但是也可以根据这个确定需要优化的内容,并且从中找到关联的一些问题。根据我这里面显示mono里面主要为:(具体项目具体分析)1.    protobuf所存

vue part3.4 小案例 消息订阅pubsub与ajax_weixin_33935777的博客-程序员宝宝

pubsub消息订阅组件,便于兄弟组件间调用npm install --save pubsub-jsapp.vue<template> <div class="container"> <Search></Search> <users-main></users-main...

随便推点

Gradle 安装和配置教程_卜大爷的博客-程序员宝宝_gradle安装教程

Gradle 安装和配置教程本文介绍 Gradle 安装和配置过程。查看 Android Studio 是否存在如果按照了 Android Studio,那么 Gradle 的安装包应该已经下载下来了,我们可以通过以下方式找到。在“应用程序”选择“Android Studio”图标,右键,选择“显示报内容:通常这里会有一个 gradle 文件夹(下图中好像没有,别着急~):示例中并没有这个文件夹,怎么办呢?答案是手动创建一个 gradle 目录,并下载 Gradle 安装包。下载、安装

odoo 11 statusbar不好用,workflow只显示一个_superzz0377的博客-程序员宝宝_odoo11 workflow

今天在给产品加workflow时出现一个神奇的错误,statusbar只显示一个状态。如图:这个鬼样子再三检查是不是哪儿写错了,比对了半天,还是没有发现错误。最后才发现之前使用statusbar的字段没有删除,删除之后就好了。...

【认证须知】什么是HCIE?为什么要考?怎么考?_微思xmws的博客-程序员宝宝_hcie

每当小编在朋友圈发一些关于HCIE的话题时,总有小伙伴跑过来问我“啥是HCIE啊?”今天就跟小编一起来了解一下,到底什么是HCIE?为什么这么多人都要考HCIE?什么是HCIE?HCIE:全称Huawei Certified ICT(information and communications technology信息通信技术) Expert 即华为认证ICT(信息通信技术)专家。华为是全球领先的信息与通信技术(ICT)解决方案供应商,专注于ICT领域,坚持稳健经营...

android 9 第三方桌面,华为手机更换第三方桌面_尸姐的博客-程序员宝宝

起因,我是从一加5过来的,从那时起我一直用Nova Launcher这款第三方启动器,十分好用,久而久之就习惯了。然而换到了华为Mate20 Pro后,就无法使用第三方启动器弄得自己挺捉急的。拿到Mate20 Pro也有2个多月的时间了,网上虽然有不少教程,我还是给刚换华为手机的玩家提供一下使用adb命令的方法禁用默认桌面:华为桌面,使用第三方Nova Launcher的教程。无需ROOT。缺点:...

Linux gdb调试命令(如何打印完整字符串)_so~what的博客-程序员宝宝_gdb打印全部字符串

<gdb常用调试命令>gdb调试1、 gdb test2、(gdb)b xxx.cpp:1061 //打断点 b + 偏移量 b + 函数名 info b //查看断点3、(gdb) run --gtest_filter=*.xxxx verbose //执行用例run (r)执行源代码中一行的命令next(简称n)//执行时如果遇到函数调用,可能想执行到函数内部,这时用step(简称p)continue(c) // c

python中hashlib模块_alwaysPractice的博客-程序员宝宝_python hashlib安装

hashlib用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法import hashlib# ######## md5 ########hash = hashlib.md5()# help(hash.update)hash.update(bytes('admin', encod...

推荐文章

热门文章

相关标签