目录

一、概述

二、主要外设介绍

2.1 AFIO复用IO口

2.2 EXTI简介

EXTI框图:

2.3 NVIC中断优先级分组

三、EXTI外部中断整体结构

四、实验程序

4.1 对射式红外传感器模块

4.2 旋转编码器模块

五、实验现象


一、概述

关于EXTI外部中断,首先,简单介绍一下要用到的外设AFIO、EXTI、NVIC等等;然后,介绍触发外部中断到CPU响应中断函数的过程;最后,就是外部中断的简单应用,包含两个实验:①对射式红外传感器计数;②旋转编码器计次。

二、主要外设介绍

2.1 AFIO复用IO口

  • 在这里AFIO主要功能就是中断引脚选择。AFIO由很多的数据选择器组成,可完成数据选择,这样就可以减少IO口。例如:STM32F103C8T6有两组GPIO,GPIOA和GPIOB,共有32个引脚,都可以触发中断,但是相同Pin脚不能同时触发中断,假如一个IO口一个中断通道,就要32个通道,太占IO资源。如图所示,从PA0、PB0中选择一位进入EXTI0通道;PA1、PB1选择一位进入EXTI1通道...所以相同Pin脚不能同时触发中断。

2.2 EXTI简介

EXTI框图:

  • EXTI(Extern Interrupt)外部中断
  • EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序
  • 支持的触发方式:上升沿/下降沿/双边沿/软件触发
  • 支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断
  • 通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒
  • 触发响应方式:中断响应/事件响应

2.3 NVIC中断优先级分组

  • NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级
  • 抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队

分组方式

抢占优先级

响应优先级

分组0

0位,取值为0

4位,取值为0~15

分组1

1位,取值为0~1

3位,取值为0~7

分组2

2位,取值为0~3

2位,取值为0~3

分组3

3位,取值为0~7

1位,取值为0~1

分组4

4位,取值为0~15

0位,取值为0

三、EXTI外部中断整体结构

  1. AFIO中断引脚选择。选择合适的中断通道,PA0、PB0就是EXTI0通道,PA1、PB2就是EXTI1通道...,为节省通道资源,EXTI5-EXTI9就合成一个通道EXTI9_5,EXTI10-EXTI15就合成一个通道EXTI15_10。
  2. EXTI边沿检测及控制。设置触发的方式:上升沿/下降沿/双边沿/软件触发;设置中断响应还是事件响应等等。
  3. NVIC优先级分组。分为高n位的抢占优先级和低4-n位的响应优先级。

四、实验程序

4.1 对射式红外传感器模块

  • 无遮挡时,D0输出低电平,有遮挡时输出高电平。

模块程序如下:

#include "stm32f10x.h"                  // Device header
uint16_t count;
/**函数名      :CountSensor_Init(void)*函数功能    :红外传感器触发外部中断初始化*输入        :无*输出        :无
*/
void CountSensor_Init(void)
{   //GPIO初始化RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOB时钟GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);//GPIOB初始化//AFIO初始化RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);//选择EXTI14线//EXIT初始化EXTI_InitTypeDef EXTI_InitStruct;EXTI_InitStruct.EXTI_Line=EXTI_Line14;EXTI_InitStruct.EXTI_LineCmd=ENABLE;EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;EXTI_Init(&EXTI_InitStruct);//EXIT初始化//NVIC初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//选择NVIC2组NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;//EXTI14线属于EXTI15_10通道NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStruct);    //NVIC初始化
}
/**函数名      :Getcount(void)*函数功能    :返回计数数据*输入        :无*输出        :count:计数数据
*/
uint16_t Getcount(void)
{return count;
}
void EXTI15_10_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line14)==SET)//判断是否EXTI14线申请的中断{EXTI_ClearITPendingBit(EXTI_Line14);//软件清零中断标志位count++;}
}

4.2 旋转编码器模块

  • 由上图可知,不旋转时,A,B初始电平都为高电平。
  • 旋转时输出信号都为方波信号。
  • 顺时针旋转时,A相超前B相90°。
  • 逆时针旋转时,B相超前A相90°。

模块程序如下:

  • 和上面差不多,多了一个GPIO口引脚触发中断
#include "stm32f10x.h"
int16_t count;
/**函数名      :Encode_Init(void)*函数功能    :旋转编码器外部中断初始化*输入        :无*输出        :无
*/void Encode_Init(void)
{//GPIO初始化RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);//AFIO初始化RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);//EXIT初始化EXTI_InitTypeDef EXTI_InitStruct;EXTI_InitStruct.EXTI_Line=EXTI_Line0|EXTI_Line1;EXTI_InitStruct.EXTI_LineCmd=ENABLE;EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;EXTI_Init(&EXTI_InitStruct);//NVIC初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel=EXTI0_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStruct);NVIC_InitStruct.NVIC_IRQChannel=EXTI1_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;NVIC_Init(&NVIC_InitStruct);
}int16_t Getencode(void)
{int16_t temp=0;temp=count;count=0;return temp;
}
void  EXTI0_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line0)==SET){EXTI_ClearITPendingBit(EXTI_Line0);if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==1){count--;}}
}
void  EXTI1_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line1)==SET){EXTI_ClearITPendingBit(EXTI_Line1);if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==1){count++;}}
}

五、实验现象

  • 用遮挡板遮挡红外传感器的凹槽,当拿开遮挡板时,计数加一。
  • 顺时针旋转旋转编码器时,计数加一;逆时针旋转时,计数减一。

STM32笔记——EXTI外部中断相关推荐

  1. STM32(五)——EXTI外部中断

    文章笔记源于--江科大自化协的视频 一. 中断系统 中断 : 在主程序运行过程中,出现特定的中断触发条件,使得CPU暂停当前正在运行的程序,而去处理中断程序,完成后,又返回原来被暂停的位置继续工作 中 ...

  2. STM32学习笔记——EXTI外部中断,光敏传感器控制LED灯

    中断系统 中断:在主程序运行过程中,当出现了特定的中断触发条件,CPU就可以暂停当前正在运行的程序去处理中断程序,并把当前程序的地址压入堆栈,中断程序处理完成后把地址弹出堆栈,回到刚刚暂停的位置继续执 ...

  3. 面向应用学习stm32(4)-EXTI外部中断

    前导:本文的目的与,意在于面向应用的学习单片机,故不会涉及太多的原理知识,例如寄存器之类的. 主要目的在于面向应用的学习单片机,学会单片机的基础用法,开发板采取野火的指南者f103. 作者大二小白,写 ...

  4. STM32学习——EXTI外部中断

    EXTI简介 EXTI可以实现对外部输入信号的上升沿检测和下降沿的检测.EXTI可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性. 可以看到EXTI一共有20条信 ...

  5. STM8L探索套件学习笔记-EXTI外部中断

    http://blog.chinaunix.net/uid-23085164-id-3534045.html

  6. STM32学习笔记(三)丨中断系统丨EXTI外部中断(对射式红外传感器计次、旋转编码器计次)

    本篇文章包含的内容 一.中断系统 1.1 中断的定义 1.2 中断优先级 1.3 中断的嵌套 1.4 STM32中的中断系统 1.4.1 STM32的中断资源 1.4.2 嵌套中断向量控制器 NVIC ...

  7. STM32中断—EXTI外部中断

    5. 中断 本文来自于<STM32--江科大>的笔记整理. 中断系统 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处 ...

  8. 02、【江科大自化协stm32F103c8t6】笔记之【入门32单片机及EXTI外部中断初始化参数配置】

    ----------接着上一篇笔记写 四.返回值函数 五.EXTI外部中断 1.配置RCC 2.配置GPIO 3.配置AFIO 4.配置EXTI 5.配置NVIC 中断函数 四.返回值函数 uint8 ...

  9. STM32入门笔记03_EXTI外部中断详解+案例:红外对射计数、旋转编码器计数

    EXTI外部中断 中断的相关概念 中断源: 可以引起中断的事件称为中断源 中断: 在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成 ...

最新文章

  1. 一套完整的3D结构光系统搭建指南!
  2. wps 模拟分析 规划求解_【网友来稿】利用Excel求解线性规划问题
  3. matlab能用矩阵操作就不要用for循环
  4. java mysql tomcat my_Java、Tomcat 及 MySQL 环境配置
  5. 关于PHP的工作流引擎
  6. HDU2090 算菜价【水题】
  7. “卖键盘的被键盘侠喷了” | 社交网络的戾气怎么这么重
  8. 《Cisco安全防火墙服务模块(FWSM)解决方案》——2.6 硬件架构
  9. 在成长中遇到的挫折事件对你的影响_孩子一遇到困难就退缩?3个方法培养孩子逆商,提升抗挫折能力...
  10. html逐字显示并停止,Pr字幕如何让他逐字出现逐字消失?
  11. [转]破解无线路由器密码
  12. linux搭建http代理服务器
  13. 鸿蒙系统吹了多少年了还没出,实话实说,在鸿蒙系统上,余承东吹了几次牛都没实现...
  14. python爬虫—爬取taptap游戏的评论信息(通过fiddler抓包)
  15. 服务器日志法网站分析的原理及优缺点
  16. 自动驾驶和辅助驾驶基础知识
  17. 云服务器优势差别?三大主流云平台对比
  18. 【学习记录】卷积神经网络常用概念
  19. 怎样才能掘金知识付费项目?
  20. Sonicwall 防火墙说明书在线观看

热门文章

  1. 流控panabit的安装及配置
  2. Win11打不开Windows安全中心
  3. win10系统获取权限代码
  4. 通过指定考试成绩,判断学生等级
  5. 基于LPWAN技术的低成本 IoT 物联网企业资产管理解决方案
  6. GRE数学入门级词汇
  7. 一款非常强大的WiFi资源管理器,可以扫描、查找无线网络并进行故障排除
  8. 这剧尺度大,小姐姐、女王、已婚男士、隐孩族、地铁狗、中年危机、职场潜规则、黑点全都有...
  9. 网站如何增加百度收录
  10. 网友亲历诈骗!安全专家详解:一个验证码如何让你倾家荡产