图1.0

图1.1

中断控制器支持23条中断线,其中16条是IO管脚中断线,分别是EXTI0~EXTI15:

 图 1.2

另外七根中断线如下图:

中断线和管脚的对应关系:EXTI0~EXTI15 和GPIOx0~15一一对应,x:A~G。

每条中断线控制着7个管脚的中断跳变沿的输入,通过寄存器SYSCFG_EXTICRx(x:1~4)来进行多选1。

  举例:中断线0,即EXTI0控制着7个管脚的中断源输入,分别是PA0,PB0,PC0,PD0,PE0,PF0,PG0。

外部中断寄存器配置SYSCFG共有四个寄存器,他们的作用是类似的,管理着某中断下某引脚的选择,下列只介绍第一个寄存器,其他类似:

EXTI0[:] 用于选择中断线0的中断源管脚
: PA0 引脚
: PB0 引脚
: PC0 引脚
: PD0 引脚
: PE0 引脚
: PF0 引脚
: PG0 引脚
: PH0 引脚
: PI0 引脚
举例:中断线0的中断源管脚选择为PA0管脚,对应的代码如下:
SYSCRF->EXTICR1 &=~(0xF<<);
EXTI1[:] 用于选择中断线1的中断源管脚
: PA1 引脚
: PB1 引脚
: PC1 引脚
: PD1 引脚
: PE1 引脚
: PF1 引脚
: PG1 引脚
: PH1 引脚
: PI1 引脚
举例:中断线1的中断源管脚选择为PF1管脚,对应的代码如下:
SYSCRF->EXTICR1 |=(<<);
EXTI2[:] 用于选择中断线2的中断源管脚
: PA2 引脚
: PB2 引脚
: PC2 引脚
: PD2 引脚
: PE2 引脚
: PF2 引脚
: PG2 引脚
: PH2 引脚
: PI2 引脚
CR1
EXTI3[:] 用于选择中断线3的中断源管脚
: PA3 引脚
: PB3 引脚
: PC3 引脚
: PD3 引脚
: PE3 引脚
: PF3 引脚
: PG3 引脚
: PH3 引脚
: PI3 引脚
CR1

四位为一小组,四位控制一条中断线,用于选择中断线的中断源管脚。中断线0~中断线15 分别于EXTI0[3:0]~EXTI15[3:0]一一对应。

  编程时,SYSCFG_EXTICR对应SYSCFG->EXTICR[0]

  SYSCFG_EXTICR对应SYSCFG->EXTICR[]

  SYSCFG_EXTICR对应SYSCFG->EXTICR[]

  SYSCFG_EXTICR对应SYSCFG->EXTICR[3]

下面工程文件是用外部中断检测四个按键:

#include "stm32f4xx.h"
#include "delay.h"
void Key_Init(void)
{
RCC->AHB1ENR |= <<;//使能GPIOA的时钟
GPIOA->MODER &=~(<<);//PA0配置为输入模式
GPIOA->PUPDR &=~(<<);//PA0配置为浮空模式
//GPIOA->PUPDR |=2<<0;//下拉 也可以配置 RCC->AHB1ENR |= <<;//使能GPIOE时钟
GPIOE->MODER &=~(<<);//PE2配置为输入模式
GPIOE->PUPDR &=~(<<);//PE2配置为浮空模式
//GPIOA->PUPDR |=1<<4;//初始为上拉 GPIOE->MODER &=~(<<);//PE3配置为输入模式
GPIOE->PUPDR &=~(<<);//PE3配置为浮空模式
//GPIOA->PUPDR |=1<<6; GPIOE->MODER &=~(<<);//PE4配置为输入模式
GPIOE->PUPDR &=~(<<);//PE4配置为浮空模式
//GPIOA->PUPDR |=1<<8;
} void EXIT_Init(void)
{
RCC->APB2ENR |= <<;//使能系统配置控制器时钟 /*******初始化KEY1<-->PA0的中断线0**********/
SYSCFG->EXTICR[] &=~(0XF<<);//配置SYSCFG 外部中断配置寄存器,选择中断源管脚
EXTI->RTSR |= <<;//选择中断线0触发边沿为上升沿
EXTI->IMR |= <<;//开放中断线0的中断请求
NVIC_EnableIRQ(EXTI0_IRQn);//使能中断通道,NVIC_EnableIRQ(IRQn) /*******初始化KEY2<-->PE2的中断线2**********/
SYSCFG->EXTICR[] |= (<<);//配置SYSCFG 外部中断配置寄存器,选择中断源管脚
//中断线2,一条中断线位为4,第二位就是8了 EXTI->FTSR |= <<;//选择中断2触发边沿为下降沿
EXTI->IMR |= <<;//开放中断线2的中断请求
NVIC_EnableIRQ(EXTI2_IRQn);//使能中断通道,NVIC_EnableIRQ(IRQn) /*******初始化KEY3<-->PE3的中断线3**********/
SYSCFG->EXTICR[] |= (<<);//配置SYSCFG 外部中断配置寄存器,选择中断源管脚
EXTI->FTSR |= <<;//选择中断线3触发边沿为下降沿
EXTI->IMR |= <<;//开放中断线3的中断请求
NVIC_EnableIRQ(EXTI3_IRQn);//使能中断通道,NVIC_EnableIRQ(IRQn) /*******初始化KEY4<-->PE4的中断线4**********/
SYSCFG->EXTICR[] |= (<<);//配置SYSCFG 外部中断配置寄存器,选择中断源管脚
EXTI->FTSR |= <<;//选择中断线0触发边沿为下降沿
EXTI->IMR |= <<;//开放中断线4的中断请求
NVIC_EnableIRQ(EXTI4_IRQn);//使能中断通道,NVIC_EnableIRQ(IRQn)
} void EXTI0_IRQHandler(void)
{
//k1 PA0 led1 pf6
if(EXTI->PR &(<<)) //判断中断线0是否触发了中断
{
EXTI->PR |= <<;//置一清零
Delay_ms();//延时10ms消抖
if(GPIOA->IDR &(<<))//判断KEY1是不稳定的按下了
{
GPIOF->ODR ^= <<;//取反LED1灯的状态
}
}
} void EXTI2_IRQHandler(void)
{
//k2 PE2 led3 pf9
if(EXTI->PR &(<<)) //判断中断线2是否触发了中断
{
EXTI->PR |= <<;//置一清零
Delay_ms();//延时10ms消抖
if(!(GPIOE->IDR &(<<)))//判断KEY2是不稳定的按下了
{
GPIOF->ODR ^= <<;//取反LED2灯的状态;
}
}
} void EXTI3_IRQHandler(void)
{
//k3 PE3 led3 pf10
if(EXTI->PR &(<<)) //判断中断线3是否触发了中断
{
EXTI->PR |= <<;//置一清零
Delay_ms();//延时10ms消抖
if(!(GPIOE->IDR &(<<)))//判断KEY3是不稳定的按下了
{
GPIOF->ODR ^= <<;//取反LED3灯的状态
}
}
} void EXTI4_IRQHandler(void)
{
//k4 PE4 led4 pc0
if(EXTI->PR &(<<)) //判断中断线4是否触发了中断
{
EXTI->PR |= <<;//置一清零
Delay_ms();//延时10ms消抖
if(!(GPIOE->IDR &(<<)))//判断KEY4是不稳定的按下了
{
GPIOC->ODR ^= <<;//取反LED4灯的状态
}
}
}

STM32之外部中断的更多相关文章

  1. STM32的外部中断配置及使用

    STM32的外部中断配置及使用 配置1:GPIO: 配置外部中断为输入模式: 配置2:EXTI: 配置外部中断线和触发模式: 配置3:NVIC: 配置外部中断源和中断优先级: 需要注意的是:RCC_A ...

  2. STM32 GPIO外部中断总结

    一.STM32中断分组: STM32 的每一个GPIO都能配置成一个外部中断触发源,这点也是 STM32 的强大之处.STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB ...

  3. STM32之外部中断控制

    一.STM32外部中断 1.STM32外部中断结构图 如上图所示:主要包括四个环节,GPIO.AFIO.EXTI.NVIC.以STM32F103VE(100脚)为例说明硬件模块的数量: GPIO:   ...

  4. 浅谈stm32的外部中断

    简述 本文简单介绍stm32外部中断的一般操作步骤,后续会补充外部中断的相关内容 stm32的中断控制器支持19个外部中断/事件请求: line0~line15:这16条line分别对应不同GPIO口 ...

  5. STM32之EXTI——外部中断

    互联网的广大网友,大家早上中午晚上好.EXTI...故名思义..EX表外,出..I表示Intrrupt..所以合起来就是外部中断...说到这..我觉得我最近的六级水平(背单词)又进了一步,稍微自夸了下 ...

  6. 转别人的 STM32外部中断使用注意事项

    前言:这些问题都是我之前在工作中遇到的,后来觉得需要总结,自己记忆不好,所以在这个给自己打个mark. 一:触发方式 STM32 的外部中断是通过边沿来触发的,不支持电平触发: 二:外部中断分组 ST ...

  7. stm32寄存器版学习笔记03 外部中断

    stm32的每个I/O口都可以作为中断输入,要把I/O口设置为外部中断输入,必须将I/O口设置为上拉/下拉输入 或 浮空输入(但浮空的时候外部一定要带上拉或下拉电阻,否则可能导致 中断不停的触发),干 ...

  8. stm32 外部中断学习

    今天我们看看STM32的外部中断实验. STM32 供 IO 口使用的中断线只有 16 个,但是 STM32 的 IO 口却远远不止 16 个,那么 STM32 是怎么把 16 个中断线和 IO 口一 ...

  9. STM32 外部中断详解(原理+配置代码)

    本文介绍了STM32基于标准外设库的外部中断配置,以及基于参考手册如何更加寄存器配置外部中断 文章目录 1 前言 2 STM32的外部中断 3 中断服务函数的映射关系 4 外部中断的配置 5 寄存器的 ...

随机推荐

  1. 【CSP模拟赛】奇怪的队列(树状数组 &二分&贪心)

    题目描述 nodgd的粉丝太多了,每天都会有很多人排队要签名.  今天有n个人排队,每个人的身高都是一个整数,且互不相同.很不巧,nodgd今天去忙别的事情去了,就只好让这些粉丝们明天再来.同时nod ...

  2. Java学习个人备忘录之入门基础

    临时配置环境方式:查看path下的环境变量 set path修改path下的环境变量 set path=haha删除path下的环境变量 set path=查看当前java的版本 javac -ver ...

  3. useReducer代替Redux小案例-1(七)

    使用useContext和useReducer是可以实现类似Redux的效果,并且一些简单的个人项目,完全可以用下面的方案代替Redux,这种做法要比Redux简单一些.因为useContext和us ...

  4. SC3聚类 | 拉普拉斯矩阵 | Laplacian matrix | 图论 | R代码

    Laplacian和PCA貌似是同一种性质的方法,坐标系变换.只是拉普拉斯属于图论的范畴,术语更加专业了. 要看就把一篇文章看完整,再看其中有什么值得借鉴的,总结归纳理解后的东西才是属于你的. 问题: ...

  5. go之web框架 iris

    前言 最近开始学习GO的WEB框架,IRIS号称是Go最快的后端Web框架,目前发展最快的Go Web框架.提供完整的MVC功能并且面向未来. 所以先从它开始. github地址 https://gi ...

  6. phpstorm 使用xdebug断点

    1.下载对应版本 xdebug 下载地址:https://download.csdn.net/download/q2104574/11185239 比如你用的php7.0.12以上的版本,xdebug ...

  7. FFmpeg编译:mac下编译iOS平台的FFmpeg库(支持armv7, arm64, i386, x86_64)

    环境:FFmpeg 3.4.6Xcode 10.3macOS 10.14.6iOS SDK 12.4 一.准备工作 1. 下载FFmpeg我这里使用的是3.4.6版本的FFmpeg,可以从FFmpeg ...

  8. SpringMVC:HandlerInterceptor log 日志

    springMVC:HandlerInterceptor拦截器添加系统日志(权限校验)代码收藏 - LinkcOne - CSDN博客https://blog.csdn.net/qq_22815337 ...

  9. Angular中使用ECharts图表

    1.安装: npm install echarts --save 2.在 TypeScript 文件中导入echarts import * as echarts from 'echarts'; 3.根 ...

  10. Java 并发基础常见面试题总结

    1. 什么是线程和进程? 1.1. 何为进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的.系统运行一个程序即是一个进程从创建,运行到消亡的过程. 在 Java 中,当我们启 ...