【STM32教程】第四章 STM32的外部中断EXTI

这篇具有很好参考价值的文章主要介绍了【STM32教程】第四章 STM32的外部中断EXTI。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

案例代码及相关资料下载链接:

链接:https://pan.baidu.com/s/1hsIibEmsB91xFclJd-YTYA?pwd=jauj 

提取码:jauj  

1 中断系统

1.1  中断的概念

中断系统的定义:中断是指在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。

通俗来讲中断就是主程序在正常运行时,出现了中断触发条件,而中断触发的条件有很多:对于外部中断来讲可能是引脚的电平发生变化;对于定时器来讲可能是定时的时间到了;对于串口通信来讲可能是接收到了数据,当以上事件发生时,程序的执行就会从主程序中跳到中断程序中来执行中断程序,直到中断程序执行完成之后才会重新执行主程序。而使用中断系统最大的作用就是能够极大的提升程序的运行效率。

中断优先级:中断优先级建立在有多个中断源的时候,当有多个中断源出现时,CPU就要考虑率先执行哪个中断,中断就像做一件事的轻重比例,当有很多事情堆到眼前时候,通常先做情况最紧急的,再做稍次一点的,这样就会给中断确立执行的先后顺序,而多个中断的执行顺序的先后就被叫做中断优先级。

中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回,而中断嵌套的执行通常是由中断优先级来确定的。中断嵌套可以理解将一堆要做的事慢慢一个一个抛给你,而你要根据每个事情的紧急程度来决定在已经有的事情里先做哪一个。

中断执行的流程如下图所示:

【STM32教程】第四章 STM32的外部中断EXTI,STM32F103开发,stm32,嵌入式硬件,单片机

在我们学习的STM32 中有68个可屏蔽中断通道(中断源),包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设(68个中断源是F1系列中最多的,而对于某个具体型号可能并没有这么多,所以中断源的数量以单片机的数据手册为准),这些中断源都使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级。(具体中断源如下表所示灰色部分为内核中断,不是灰色部分的为STM32的外设中断,具体图标手册中有)

【STM32教程】第四章 STM32的外部中断EXTI,STM32F103开发,stm32,嵌入式硬件,单片机

NVIC结构:

基本结构图如下图所示:

【STM32教程】第四章 STM32的外部中断EXTI,STM32F103开发,stm32,嵌入式硬件,单片机

NVIC的全称是Nested vectoredinterrupt controller,即嵌套向量中断控制器,在STM32中NVIC用来统一分配中断优先级和管理中断的,他是单片机内核外设,是用来帮助CPU处理中断分配和配置中断优先级的地方(为了让CPU高速运行),因为NVIC有多个输入口,所以能将单片机的外设中断都来接到NVIC上,而NVIC只有一个输出口这样就能通过对中断优先级的设置,来输出中断优先级高的,然后交给CPU让CPU优先执行中断优先级高的程序,这就是NVIC的基本作用。

NVIC优先级分组:

为了处理不同形式的优先级,NVIC会有优先级进行分组,而NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级,其属性编号越小,表明它的优先级别越高。抢占优先级,是指打断其他中断的属性,即因为具有这个属性会出现嵌套中断(在执行中断服务函数A 的过程中被中断B 打断,执行完中断服务函数B 再继续执行中断服务函数A),抢占属性由NVIC 的参数配置。而响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达, 则先处理响应优先级高的中断,抢占优先级和响应优先级均相同的按中断号排队,数字小的先响应。(中断号是指上图中优先级的序号)

【STM32教程】第四章 STM32的外部中断EXTI,STM32F103开发,stm32,嵌入式硬件,单片机

优先级的分组方式如下图所示:

【STM32教程】第四章 STM32的外部中断EXTI,STM32F103开发,stm32,嵌入式硬件,单片机

注意在配置好NVIC的分组方式之后,配置优先级时,取值不能超过对应NVIC分组的取值范围。

1.2  外部中断的简介与配置

外部中断简介:

EXTI(Extern Interrupt)外部中断,EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序。

其触发方式有上升沿,下降沿,双边沿,软件触发四种。EXTI支持所有的GPIO口都可以触发中断,但是相同的Pin_不可以同时触发中断,例如PA1与PB1不能同时触发中断。EXTI有20个通道数,说明EXTI可以有20个中断源,其中包括16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤

醒;而EXTI响应方式有中断响应(申请中断让CPU执行中断函数),事件响应(中断响应时,外部中断信号不会传向CPU而是给到单片机外设,让单片机外设响应一个事件)。

外部中断的基本结构:

结构图如下图所示:

【STM32教程】第四章 STM32的外部中断EXTI,STM32F103开发,stm32,嵌入式硬件,单片机

最左边是GPIO口的外设,由于每个GPIO都有16个通道当每个GPIO的引脚都占用一个那么EXTI的通道就会不够用,为了让相同的Pin_不同时触发中断,所以就有AFIO用来进行中断引脚的选择,相当于一个数据选择器,他可以从前面N个GPIO的16个引脚中选择其中一个接到后面的EXTI通道里面,所以就会有上面说的相同的Pin_不可以同时触发中断,因为对于相同的Pin_在经过AFIO之后只会有一个Pin_接到后面的EXTI通道上,例如:PA0,PB0,PC0,PD0,只有一个Pin_0可以接到EXTI的通道0上。而以上GPIO引脚通过EXTI上之后,就会分为两种输出,一种接到NVIC上,一种接到单片机外设上(也是对应的事件响应),这里EXTI的输出本来为20个但是由于ST公司想要节省引脚口,所以EXTI4之后的中断被五个为一组分在同一个通道里,所以EXTI5~9会触发同一个中断函数,EXTI10~15触发同一个中断函数,但是基于Hal库开发的STM32将这些中断函数写在了一起,所以所有中断通道都可以写在同一个中断函数里面,但是标准库必须根据不同的中断通道来判断到底能不能写在一起。

AFIO口的结构图如下:

【STM32教程】第四章 STM32的外部中断EXTI,STM32F103开发,stm32,嵌入式硬件,单片机

此图原理就是将输入的不同GPIO相同的Pin_通过数据选择器来进行选择,最后只选择一个Pin_来接到EXTI通道上,具体如何选择就是通过配置AFIO_EXTRCRX寄存器的EXTIx位来进行选择,每个位代表不同的GPIO,这样就能以确定的位来确定是哪个GPIO的引脚会接到EXTIX的通道上面。

AFIO主要用于引脚复用功能的选择和重定义(数据选择器),在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择。

 EXTI结构图

【STM32教程】第四章 STM32的外部中断EXTI,STM32F103开发,stm32,嵌入式硬件,单片机

电平经过AFIO之后进入EXTI,首先要对该中断源的触发方式进行选择(上升沿触发/下降沿触发/双边沿触发)进入或门的输入,这里用或门进行输入的原因是因为触发方式也可以选择是软件触发,然后就会分成两路,接到NVIC中断控制器的是触发中断的,而接到脉冲发生器的是用来触发事件的。

先看触发中断这一路的,这里接的请求挂起寄存器相当于中断标志位,通过读取这个寄存器判断是哪个通道发出中断请求,如果给请求挂起寄存器置1,那么就会和中断屏蔽寄存器进入一个与门,然后进入NVIC中断控制器,这里与门和这个中断屏蔽寄存器相当于一个开关的作用,因为与门是如果输入有一个为0,那么输出一定为0,所以会通过控制中断屏蔽寄存器来控制是否响应中断。

事件触发这一路与中断触发大同小异,这里事件屏蔽寄存器和与门也充当开关的作用,通过与门之后接一个脉冲发生器,这个脉冲发生器的作用就是给一个电平脉冲是用来触发其他外设的。

上图中画斜杠写20的表示这里可以接20根线,连接20个通道,而APB总线和外设接口,单片机对于寄存器的访问就是借助APB总线来进行。

2实验演示

2.1  旋转编码器的简介

旋转编码器:用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向,通常有以下几种类型:机械触点式/霍尔传感器式/光栅式。

实物图如下:

【STM32教程】第四章 STM32的外部中断EXTI,STM32F103开发,stm32,嵌入式硬件,单片机

左边第一个不能判断不能判断旋转方向,只能测位置和速度所以不经常使用,而剩下的就是我们本开发板自带的旋转编码器,由第三个拆解图可得他内部是通过金属触点来进行通断的,所以为机械式编码器,有左右两部分开关触点,其中左右两部分内侧较细的触点是连接在引脚B上,而剩下外侧的触点分别连在引脚A和C上,而中间的圆点为一个普通的按键,然后来看这个编码盘也是一系列像光栅一样的东西,但也是金属触点,在旋转时依次接通和断开两边的触点,而金属盘的位置也是经过设计可以让两侧触点的通断有九十度的相位差,

具体输出波形如下方两图所示(上图为正转时,下图为反转时)以下这样的正交波形就可以用来区别方向。

【STM32教程】第四章 STM32的外部中断EXTI,STM32F103开发,stm32,嵌入式硬件,单片机

【STM32教程】第四章 STM32的外部中断EXTI,STM32F103开发,stm32,嵌入式硬件,单片机

 硬件电路图如下

【STM32教程】第四章 STM32的外部中断EXTI,STM32F103开发,stm32,嵌入式硬件,单片机

2.2  对射式红外传感器计次

 接线图如下:

【STM32教程】第四章 STM32的外部中断EXTI,STM32F103开发,stm32,嵌入式硬件,单片机

实物图如下:

【STM32教程】第四章 STM32的外部中断EXTI,STM32F103开发,stm32,嵌入式硬件,单片机

实验内容

本实验是对对射式红外传感的传感次数进行计次,通过用遮光片遮挡来对红外传感器传输进行计次,然后通过OLED屏幕来显示传感次数。并且对于中断触发方式的不同,计次方式也不同。

首先,配置STMCube MX

将GPIO口用来实现外部中断的配置为中断模式即PB14,由于OLED也要继续使用所以对OLED的引脚继续配置为输出模式即可:

【STM32教程】第四章 STM32的外部中断EXTI,STM32F103开发,stm32,嵌入式硬件,单片机

在NVIC中勾选EXTI line[15:10] interrupts

【STM32教程】第四章 STM32的外部中断EXTI,STM32F103开发,stm32,嵌入式硬件,单片机

对NVIC的中断分组方式选择方式2(哪一个随自己选择)

【STM32教程】第四章 STM32的外部中断EXTI,STM32F103开发,stm32,嵌入式硬件,单片机

在GPIO这里对中断触发方式进行选择:

【STM32教程】第四章 STM32的外部中断EXTI,STM32F103开发,stm32,嵌入式硬件,单片机

其他配置不变,生成工程即可。

代码部分:

HAL库关于外部中断的函数只有一个:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

具体模板用法如下:

HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) 
{

   if(GPIO_Pin==GPIO_PIN_1)//判断是哪个中断源

   {

   //执行中断函数

   __HAL_GPIO_EXTI_CLEAR_IT ( GPIO_Pin);

//中断结束标志必须有不然会卡在中断中不能进入主程序

   }

//Hal库中所有的中断函数都在这一个函数中进行

   if(GPIO_Pin==GPIO_PIN_3)

   {

   }
}

CountSensor部分代码

#include "main.h"
#include "gpio.h"

uint16_t Consensor_count;

uint16_t  CountSensor_Get(void)
{
   return Consensor_count;
}

/**
  * 函数功能: 外部中断回调函数
  * 输入参数: GPIO_Pin:中断引脚
  * 返 回 值: 无
  * 说    明: 无
  */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if(GPIO_Pin==CountSensor_Pin)
  {
    if(HAL_GPIO_ReadPin(CountSensor_GPIO_Port,CountSensor_Pin)== 1  )//下降沿有效计次即可
    {
      Consensor_count++;
    }
    __HAL_GPIO_EXTI_CLEAR_IT ( CountSensor_Pin);
  }
}

主函数部分代码

OLED_Init ();
OLED_ShowString (1,1,"Count:");
while (1)
{
  OLED_ShowNum (1,7,CountSensor_Get (),5);//如果有新的下降沿出现直接覆盖上一次的数字
}

2.3  旋转编码计次

接线图如下图所示:

【STM32教程】第四章 STM32的外部中断EXTI,STM32F103开发,stm32,嵌入式硬件,单片机

【STM32教程】第四章 STM32的外部中断EXTI,STM32F103开发,stm32,嵌入式硬件,单片机

实验内容:

对旋转编码器旋转进行计次,正转加加爱,反转减减,计得次数通过OLED来不断刷新。

STM32CubeMX配置:

对旋转编码器连接的引脚PB0与PB1配置为外部中断模式,给OLED连接的引脚PB8与PB9配置为输出模式,在NVIC选择分组方式,然后在下面勾选

EXTI line0 interrupt   EXTI line1 interrupt 。

【STM32教程】第四章 STM32的外部中断EXTI,STM32F103开发,stm32,嵌入式硬件,单片机

然后在GPIO里配置IO口的触发中断方式与输出模式,根据自身习惯来对IO口进行宏定义。

【STM32教程】第四章 STM32的外部中断EXTI,STM32F103开发,stm32,嵌入式硬件,单片机

配置完成后,生成工程。

代码部分:

Encoder部分代码:

#include "main.h"
#include "gpio.h"

uint16_t Encoder_Count;

uint16_t  Encoder_Get(void)
{
   uint16_t Temp;
   Temp = Encoder_Count ;
   Encoder_Count = 0;
   return Temp ;
}

/**
  * 函数功能: 外部中断回调函数
  * 输入参数: GPIO_Pin:中断引脚
  * 返 回 值: 无
  * 说    明: 无
  */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if(GPIO_Pin==Count_Increase_Pin)//读取中断源
  {
   if(HAL_GPIO_ReadPin(Count_Increase_GPIO_Port  , Count_Increase_Pin)==0 )
   {
   if(HAL_GPIO_ReadPin(Count_Decrease_GPIO_Port  , Count_Decrease_Pin)== 0 )//旋转编码器向左转时
      Encoder_Count--;
    }
    __HAL_GPIO_EXTI_CLEAR_IT ( Count_Increase_Pin);//消除中断标志,由中断进入主函数
  }
  else if(GPIO_Pin==Count_Decrease_Pin)
  {
     if(HAL_GPIO_ReadPin(Count_Decrease_GPIO_Port  , Count_Decrease_Pin)== 0)
    {
     if(HAL_GPIO_ReadPin(Count_Increase_GPIO_Port  , Count_Increase_Pin)== 0 )//旋转编码器向右转时
     Encoder_Count++;
    }
    __HAL_GPIO_EXTI_CLEAR_IT ( Count_Decrease_Pin);//消除中断标志,由中断进入主函数
}
 

主函数部分代码:文章来源地址https://www.toymoban.com/news/detail-703861.html

in16_t Num;
OLED_Init();
OLED_ShowString (1,1,"Count:");

while (1)
{
   /* USER CODE END WHILE */
   /* USER CODE BEGIN 3 */
   Num+=Encoder_Get();//时刻刷新计次
   OLED_ShowSignedNum(1,7,Num,5);
 }
}

到了这里,关于【STM32教程】第四章 STM32的外部中断EXTI的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式-stm32-江科大-EXTI外部中断

    1.1 STM32 中断系统 中断 是指在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续执行, 当中断发生时是由硬件自动调用中断函数执行的,期间编译器会保护现场最后还原现场

    2024年01月25日
    浏览(24)
  • STM32的HAL库开发系列 - GPIO中断/外部中断EXTI

    STM32的HAL库开发系列 - GPIO中断/外部中断EXTI 中断它可以在GPIO口的电平发生变化时产生中断,从而使得STM32微控制器能够及时响应外部设备的变化。 STM32的GPIO中断/外部中断EXTI可以配置为上升沿中断、下降沿中断和双边沿中断三种类型,分别在GPIO口电平从低电平变为高电平、从

    2024年02月12日
    浏览(18)
  • STM32单片机(五)第二节:EXTI外部中断练习2(旋转编码器计次)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月11日
    浏览(23)
  • 明解STM32—GPIO应用设计篇之IO外部中断EXTI原理及使用方法

    ​ 一、前言         在之前针对STM32的GPIO相关API函数及配置使用进行了详细的介绍,GPIO作为输入引脚时,调用相关读信号引脚函数接口就可以在程序的循环中,轮询的对输入信号进行读取检测操作,除了轮询的方式访问输入引脚,还可以通过另外一种叫做外部中断的方式

    2024年02月08日
    浏览(20)
  • STM32学习笔记(三)丨中断系统丨EXTI外部中断(对射式红外传感器计次、旋转编码器计次)

    ​  本次课程采用单片机型号为STM32F103C8T6。 ​  课程链接:江科大自化协 STM32入门教程   往期笔记链接:   STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出   STM32学习笔记(二)丨STM32程序调试丨OLED的使用   本篇文章的内容我愿称之为 史诗级副本 (感觉

    2024年02月16日
    浏览(21)
  • STM32G4 Simulink FOC开发实战--第四章:ST MCSDK快速启动电机

    HALL有感启动电机基于STMCSDK: https://www.bilibili.com/video/BV1W14y1k7Ct/?spm_id_from=333.999.0.0vd_source=eb375996b1aae493d63fe367f98b306c 无感启动电机基于STMCSDK: https://www.bilibili.com/video/BV1QG41197AH/?spm_id_from=333.999.0.0vd_source=eb375996b1aae493d63fe367f98b306c 电位器控制电机转速基于STMCSDK: https://www.bilibili

    2024年02月22日
    浏览(13)
  • STM32单片机(五)第二节:EXTI外部中断练习(对射式红外传感器计次和旋转编码器计次)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月09日
    浏览(25)
  • 【正点原子STM32连载】第四章 APM32初体验 摘自【正点原子】APM32E103最小系统板使用指南

    1)实验平台:正点原子APM32E103最小系统板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban 本章并不涉及程序代码的编写,而是介绍如何编译工程、烧录程序以及进行程序的调试仿真,让读者

    2024年02月21日
    浏览(24)
  • 夜深人静学32系列10——GPIO中断/NVIC/EXTI/SYSCFG详解,外部中断控制LED

    上期我们学习了GPIO驱动数码管/蜂鸣器/LED和按键等外设,本期我们一起来学习STM32中断的相关内容 当CPU正在处理某个事件的时候,外界发生了紧急事件请求,CPU需要暂停当前的工作,转而去处理这个紧急事件,处理完之后,再次回到之前被中断的地方,继续执行原来的工作,

    2024年01月16日
    浏览(20)
  • STM32-EXTI中断

    EXTI简介 EXTI(Extern Interrupt)外部中断 EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序 支持的触发方式:上升沿/下降沿/双边沿/软件触发(程序执行代码指令)

    2024年02月20日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包