STM32自学笔记EXTI(外部中断)寄存器

发布者:自在堂最新更新时间:2022-06-14 来源: eefocus关键字:STM32  EXTI  外部中断  寄存器 手机看文章 扫描二维码
随时随地手机看文章

外部中断通用I/O映像

在这里插入图片描述

中断处理函数分配

在这里插入图片描述

EXTI寄存器一览

以下图片全部摘自STM32中文参考手册


中断屏蔽寄存器(EXTI_IMR)

在这里插入图片描述

往对应的位写1就是开启中断,写0就是关闭中断


例如开放来自线0上的中断请求


EXTI->IMR|=1<<0;//开放来自线0上的中断请求


事件屏蔽寄存器(EXTI_EMR)

在这里插入图片描述

参考**中断屏蔽寄存器(EXTI_IMR)**的操作


上升沿触发选择寄存器(EXTI_RTSR)

在这里插入图片描述

设置对应的外部中断触发事件为上升沿

上升沿就是电平从0到1


例如允许输入线0上的上升沿触发


EXTI->RTSR|=1<<0;//允许输入线0上的上升沿触发


下降沿触发选择寄存器(EXTI_FTSR)

在这里插入图片描述

设置对应的外部中断触发事件为下降沿

下降沿就是电平从1到0


例如允许输入线0上的下降沿触发


EXTI->FTSR|=1<<0;//允许输入线0上的下降沿触发


软件中断事件寄存器(EXTI_SWIER)

在这里插入图片描述

对应位写1则触发中断


挂起寄存器(EXTI_PR)


在这里插入图片描述

这个寄存器和SR寄存器差不多,都是检查相应的中断是否发生,不同的是清除的方式


外部中断配置寄存器 1(AFIO_EXTICR1)

在这里插入图片描述

外部中断配置寄存器 2(AFIO_EXTICR2)

在这里插入图片描述

外部中断配置寄存器 3(AFIO_EXTICR3)

在这里插入图片描述

外部中断配置寄存器 4(AFIO_EXTICR4)

在这里插入图片描述

实例操作

这里我们开启外部中断线0上的PA0


步骤

1)开启PA的时钟,配置IO

RCC->APB2ENR|=1<<2;//使能PA时钟

GPIOA->CRL&=0XFFFFFFF0;//PA0配置清零

GPIOA->CRL|=0X00000008;//PA0下拉输入

GPIOA->ODR|=0<<0;//PA0下拉


2)开启复用时钟,设置 IO 口与中断线的映射关系

RCC->APB2ENR|=1<<0;//开启复用辅助时钟

AFIO->EXTICR[0]&=~(0XF<<0);//清除原来的设置

AFIO->EXTICR[0]|=0<<0;//外部中断0映射到PA0上


特别注意这里的AFIO->EXTICR寄存器的编号


3)开启外部中断线上中断,设置触发条件

EXTI->IMR|=1<<0;//开放来自线0上的中断请求

EXTI->RTSR|=1<<0;//允许输入线0上的上升沿触发


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

MY_NVIC_Init(2,3,EXTI0_IRQn,2); //抢占2,子优先级3,组2 


5)编写中断服务函数

//外部中断0服务程序

void EXTI0_IRQHandler(void)

{

delay_ms(10); //消抖

if(GPIOA->IDR&1<<0) //PA0按下

{  

LED1=!LED1;

}  

EXTI->PR=1<<0;  //清除线0上的中断标志位  


源文件

EXTI.C

#include "EXTI.h"

#include "delay.h"

#include "led.h"


void exti_init(void)

{

RCC->APB2ENR|=1<<2;//使能PA时钟

GPIOA->CRL&=0XFFFFFFF0;//PA0配置清零

GPIOA->CRL|=0X00000008;//PA0下拉输入

GPIOA->ODR|=0<<0;//PA0下拉

RCC->APB2ENR|=1<<0;//开启复用辅助时钟

AFIO->EXTICR[0]&=~(0XF<<0);//清除原来的设置

AFIO->EXTICR[0]|=0<<0;//外部中断0映射到PA0上

EXTI->IMR|=1<<0;//开放来自线0上的中断请求

EXTI->RTSR|=1<<0;//允许输入线0上的上升沿触发

MY_NVIC_Init(2,3,EXTI0_IRQn,2); //抢占2,子优先级3,组2  

}

//外部中断0服务程序

void EXTI0_IRQHandler(void)

{

delay_ms(10); //消抖

if(GPIOA->IDR&1<<0) //PA0按下

{  

LED1=!LED1;

}  

EXTI->PR=1<<0;  //清除线0上的中断标志位  


EXTI.H

#ifndef __EXTI_H

#define __EXTI_H

#include "sys.h"


void exti_init(void);


#endif


MAIN.C

#include "sys.h"

#include "usart.h"

#include "delay.h"

#include "led.h"

#include "EXTI.h"


int main(void)

{

Stm32_Clock_Init(9); //系统时钟设置

delay_init(72);   //延时初始化

uart_init(72,115200); //串口初始化为115200

led_init(); //LED初始化

exti_init(); //EXTI初始化

  while(1)

{

LED0=!LED0; //LED0用来指示程序正在运行

delay_ms(200);

}


结果

LED0(红灯)闪烁,代表程序正在运行

在这里插入图片描述

按下PA0之后,PA0电平由0变到1,LED1亮(绿灯)

在这里插入图片描述

关键字:STM32  EXTI  外部中断  寄存器 引用地址:STM32自学笔记EXTI(外部中断)寄存器

上一篇:STM32F4 GPIO(一)
下一篇:【STM32】HAL库-DAC

推荐阅读最新更新时间:2024-11-16 21:41

stm32---红外遥控
NEC协议 发送端发送1 :560us脉冲 + 1680us低电平 发送端发送0 :560us脉冲 + 560us低电平 连发码 : 9ms 低电平+2.5m 高电平+0.56ms 低电平 +97.94ms 高电平 引导码 :9ms 的低电平 + 4.5ms 的高电平 接收端接收1 :560us低电平 + 1680us高电平 接收端接收0 :560us低电平 + 560us高电平 接收端连发码 : 9ms 高电平+2.5m 低电平+0.56ms 高电平 +97.94ms 低电平 接收端引导码 :9ms 的高电平 + 4.5ms 的低电平 接收端的数据引脚接上拉电平,也可以让此脚连接的芯片引脚配置为上拉输出模拟上拉电阻的作用
[单片机]
STM32 SD卡通信整理
简介: SD卡从驱动到应用共分为4层,从下至上依次为:驱动层、物理层、文件系统层、应用层。下面一一来介绍各层的一些重要的操作。 驱动层 驱动层,对应到ST的库,就是stm32f10x_sdio.c/.h这个两文件。其实使用任何一个STM32的外设,只要用库函数都离不开这一对互相对应的.c/.h文件。对于SDIO外设来说,它就是用来操作寄存器的,由于涉及ST库函数的编写,没能力参透,在此不赘述它的实现过程。 物理层 这一层可以说是承上启下的一层,下接驱动层,用于操作寄存器,上接文件系统层,用于统一管 理文件,可谓整个SD驱动的核心代码。其实,如果对于SD的要求不高,可以直接在这一层上面进行文件操作,只是没有文件系统操作
[单片机]
STM32 RTC卡死在RTC_WaitForLastTask()解决方法
RTC在配置时间后,调用RTC_WaitForLastTask(),程序卡死。造成这种问题的原因是RTC配置完成后,系统会关闭BKP的时钟,并锁死BKP。置时钟的话,必需允许PWR和BKP时钟,并允许读取BKP。代码如下: RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitFo
[单片机]
STM32 GPIO寄存器ODR BSRR BRR
使用BRR和BSRR寄存器可以方便地快速地实现对端口某些特定位的操作,而不影响其它位的状态。 比如希望快速地对GPIOE的位7进行翻转,则可以: GPIOE- BSRR = 0x80; // 置'1' GPIOE- BRR = 0x80; // 置'0' 如果使用常规'读-改-写'的方法: GPIOE- ODR = GPIOE- ODR | 0x80; // 置'1' GPIOE- ODR = GPIOE- ODR & 0xFF7F; // 置'0' 有人问是否BSRR的高16位是多余的,请看下面这个例子: 假如你想在一个操作中对GPIOE的位
[单片机]
基于MDK的stm32实践过程中,debug的总结
做硬件仿真的时候,程序一直停在LDR R0, =SystemInit中的可能原因: 出现最多的情况就是设置的断点过多,STLINK只能设5个断点,可以把断点全部删除试试看,把断点设置在主函数。 在程序中使用了C库(printf),那么进入Option ---target 将 use microLib 勾选上。 硬件原因,主芯片,或者晶振有问题,更换一下就好了
[单片机]
STM32单片机的断言机制函数assert_param解析
我们在学STM32的时候函数assert_param出现的几率非常大,上网搜索一下,网上一般解释断言机制,做为程序开发调试阶段时使用。下面我就谈一下我对这些应用的看法,学习东西抱着知其然也要知其所以然。 4 断言机制函数assert_param 我们在分析库函数的时候,几乎每一个函数的原型有这个函数assert_param();下面以assert_param(IS_GPIO_ALL_PERIPH(GPIOx));为例说一下我的理解,函数的参数IS_GPIO_ALL_PERIPH(GPIOx),我们可以寻找到原型 #define IS_GPIO_ALL_PERIPH(PERIPH) (((*(uint32_t*)&(PERIPH
[单片机]
<font color='red'>STM32</font>单片机的断言机制函数assert_param解析
stm32定时器输出4路频率可调的原理分析
1标题说不清楚,简单点说就是一个定时器输出4路可调节频率的pwm。 2这个功能能干嘛? 一般是用于控制多个步进电机。这样做一个定时器就可以控制4个电机了。 先上代码吧 u16 capture = 0; vu16 CCR1_Val = 32768; vu16 CCR2_Val = 16384; vu16 CCR3_Val = 8192; vu16 CCR4_Val = 4096; void PWM1_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructur
[单片机]
基于STM32和CAN总线的温度监控系统
0 引言 现代工业控制领域通常要测量很多信号,并将其转化为计算机可以识别的二进制信号,并利用计算机监视和记录各种测量的信号。这个过程就要涉及到信号的采集和处理。CAN总线是一种串行多主总线,它卓越的特性、极高的可靠性和独特的设计,特别适合工业过程监控设备 的互连,因此,越来越受到工业界的重视,并已公认为最有前途的现场总线之一。本文介绍了基于STM32和CAN总线的温度监控系统的设计,通过上位机与下位机的通信,实现对温度数据的监控,并经初步实验达到了设计的要求。 1 系统总体方案概述 系统总体框图如图l所示,本系统采用主站+从站的结构,CAN主站主要实现温度数据的存储以及CAN总线协议和串口协议之间的桥接,CAN 从站主要实现
[单片机]
基于<font color='red'>STM32</font>和CAN总线的温度监控系统
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved