STM32学习—外部中断EXTI

发布者:Quail最新更新时间:2022-02-10 来源: eefocus关键字:STM32  外部中断  EXTI 手机看文章 扫描二维码
随时随地手机看文章

外部中断配置步骤

要使用外部中断我们就需要先配置它,通常都需经过这几步:

(EXTI相关库函数在stm32f10x_exti.c和stm32f10x_exti.h文件中)

(1)使能IO口时钟,配置IO口模式为输入


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


 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); void

 GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);

 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);


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

(4)初始化EXTI,选择触发方式


void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct); 

typedef struct {   

uint32_t EXTI_Line;               //中断/事件线  

  EXTIMode_TypeDef EXTI_Mode;       //EXTI模式   

  EXTITrigger_TypeDef EXTI_Trigger;//EXTI触发方式   

     FunctionalState EXTI_LineCmd;     //中断线使能或失能 

    }EXTI_InitTypeDef;


(5)编写EXTI中断服务函数(可以在启动文件里查询)


EXTI0_IRQHandler                                                          

EXTI1_IRQHandler                                                           

EXTI2_IRQHandler                                                          

EXTI3_IRQHandler                                                         

EXTI4_IRQHandler 

EXTI9_5_IRQHandler 

EXTI15_10_IRQHandler

4.编写外部中断控制程序

要实现外部中断方式控制LED,程序框架如下:

(1)初始化对应端口的EXTI

(2)编写EXTI中断函数

(3)编写主函数


exti.c

#include "exti.h"

#include "led.h"

#include "SysTick.h"

#include "key.h"


/*******************************************************************************

* 函数名       : My_EXTI_Init

* 函数功能    : 外部中断初始化¯

* 输入         : 无

* 输出         : 无

*******************************************************************************/

void My_EXTI_Init(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

EXTI_InitTypeDef  EXTI_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启外部中断对应的时钟

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);//选择GPIO管脚用作外部中断线路

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3);//选择GPIO管脚用作外部中断线路

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4);//选择GPIO管脚用作外部中断线路

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);//选择GPIO管脚用作外部中断线路

//EXTI0 NVIC 配置

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//EXTI0配置

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级

NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

//EXTI2 NVIC 配置

NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;//EXTI2配置

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级

NVIC_InitStructure.NVIC_IRQChannelSubPriority =2; //子优先级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

//EXTI3 NVIC 配置

NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;//EXTI2配置

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级

NVIC_InitStructure.NVIC_IRQChannelSubPriority =1; //子优先级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

//EXTI4 NVIC 配置

NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;//EXTI2配置

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级

NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子优先级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

EXTI_InitStructure.EXTI_Line=EXTI_Line0;

EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;

EXTI_InitStructure.EXTI_LineCmd=ENABLE;

EXTI_Init(&EXTI_InitStructure);

EXTI_InitStructure.EXTI_Line=EXTI_Line2|EXTI_Line3|EXTI_Line4; 

EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd=ENABLE;

EXTI_Init(&EXTI_InitStructure);

}


/*******************************************************************************

* 函数名       : EXTI0_IRQHandler

* 函数功能    : 外部中断0函数

* 输入         : 无

* 输出         : 无

*******************************************************************************/

void EXTI0_IRQHandler(void)

{

if(EXTI_GetITStatus(EXTI_Line0)==1)

{

delay_ms(10);

if(K_UP==1)

{

led2=0;

}

}

EXTI_ClearITPendingBit(EXTI_Line0);

}


/*******************************************************************************

* 函数名       : EXTI3_IRQHandler

* 函数功能    : 外部中断3函数

* 输入         : 无

* 输出         : 无

*******************************************************************************/

void EXTI3_IRQHandler(void)

{

if(EXTI_GetITStatus(EXTI_Line3)==1)

{

delay_ms(10);

if(K_DOWN==0)

{

led2=1;

}

}

EXTI_ClearITPendingBit(EXTI_Line3);

}


/*******************************************************************************

* 函数名       : EXTI2_IRQHandler

* 函数功能    : 外部中断2函数

* 输入         : 无

* 输出         : 无

*******************************************************************************/

void EXTI2_IRQHandler(void)

{

if(EXTI_GetITStatus(EXTI_Line2)==1)

{

delay_ms(10);

if(K_LEFT==0)

{

led3=1;

}

}

EXTI_ClearITPendingBit(EXTI_Line2);

}


/*******************************************************************************

* 函数名       : EXTI4_IRQHandler

* 函数功能    : 外部中断4函数

* 输入         : 无

* 输出         : 无

*******************************************************************************/

void EXTI4_IRQHandler(void)

{

if(EXTI_GetITStatus(EXTI_Line4)==1)

{

delay_ms(10);

if(K_RIGHT==0)

{

led3=0;

}

}

EXTI_ClearITPendingBit(EXTI_Line4);

}

关键字:STM32  外部中断  EXTI 引用地址:STM32学习—外部中断EXTI

上一篇:共用中断和共用中断函数的判断
下一篇:STM32—— DMA介绍

推荐阅读最新更新时间:2024-11-12 21:31

STM32基于固件库学习笔记(10)窗口看门狗
窗口看门狗 (WWDG) 小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。 中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。 大容量产品是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103xx微控制器。 互联型产品是指STM32F105xx和STM32F107xx微控制器。 WWDG 简介 窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数
[单片机]
STM32学习笔记之十六——题外话,自己做块工程板
一、我的学习计划将STM32单片机的硬件设计工作: 第一步 用STM32F103CBT6的48脚芯片,为光电平台的简单控制为目标,实现基本外围硬件、PWM、串口、I/O。将SPI、I2C留插针。 第二步 为集成传感器应用为目标,在第一步硬件基础上制作功能性的套版,两板连接实现AD、SPI、I2C、RTC等等功能。 二、硬件规划 选用STM32F103CBT6,面积7 7mm,128K flash,16K RAM,4个16bit PWM,12个12bit PWM或CAP,2个SPI,2个I2C,3个串口,1个CAN,1个USB,),12ADC。 管脚分配目标1如图,之后的功能包括:4个AD,3个串口(1个与I2C复用),1个S
[单片机]
STM32 GPIO口的使用
实验平台清单如下: 开发板: 战舰 STM32ZET6 V3.4 核心芯片: STM32F103RCT6 开发环境: MDK-ARM Version:5.10 PC操作系统: Windows 7 旗舰版 仿真器: ST-Link 打开MDK开发平台,在菜单栏中单击“Project - New μVision Project”创建一个新的工程。然后在弹出的“Select Device for Target 1”对话框中选择合适的芯片。由于我采用的是STM32F103ZET6,所以选择ST – STM32F103ZE。 选择好芯片之后,会弹出一个消息框,“Copy STM32 Startup
[单片机]
基于STM32的物联网环境监测系统
本应用笔记以STM32单片机作为控制和数据处理的单元,使用AHT10、BH1750和BMP280传感器去监测周围的环境参数,在LCD屏完成传感器数据和相关信息的显示。 同时,采用了无线模组与单片机之间进行数据交互。当无线通讯模组成功连接网络,并接入机智云物联网云平台时,用户可以通过登录物联网云平台后台查看传感器上报的数据和进行远程控制。 01 总体方案设计 本环境监测系统设计选取了控制和数据处理能力强的ST32单片机作为核心部件。使用温湿度传感器对周围环境中的温度与湿度监测,选取高精度的光强度传感器完成对周围环境的光照强度的测量,对于气压数据的测量,将选取高精度的气压传感器完成工作。 该系统使用液晶显示屏幕完成对
[单片机]
基于<font color='red'>STM32</font>的物联网环境监测系统
STM32如何实现W25X16的汉字字库存储
系统中使用过多的汉字会出现芯片容量不够用的问题,可将数据存储在外部FLASH中,在需要使用时进行调用即可。本文是通过STM32串口1实现对W25X16的汉字字库存储。软件层面,配置串口1和SPI1即可,程序初始化后,在对W25X16进行写之前,必须先擦除,可以一个字节、一页、一扇区、一块以及整片擦除。写字库前,我们用整片擦除方式,如下: 整个程序中,关键在于串口接收中断函数的编写,如下: u32 WriteAddress=0; void USART1_IRQHandler(void) { u8 Res; if(USART_GeTITStatus(USART1,USART_IT_RXNE)!=RESET) { USART_Cle
[单片机]
<font color='red'>STM32</font>如何实现W25X16的汉字字库存储
STM32在线升级IAP-Hex文件和Bin文件的区别
1 - HEX文件是包括地址信息的,而BIN文件格式只包括了数据本身 在烧写或下载HEX文件的时候,一般都不需要用户指定地址,因为HEX文件内部的信息已经包括了地址。而烧写BIN文件的时候,用户是一定需要指定地址信息的。 2- BIN文件格式 对二进制文件而言,其实没有”格式”。文件只是包括了纯粹的二进制数据。
[单片机]
STM32单片机的调试方式 STM32单片机的启动流程详解
STM32单片机是意法半导体推出的一款基于ARM Cortex-M内核的32位微控制器,广泛应用于汽车电子、工业控制、消费电子等领域。 STM32单片机的调试方式: 1.使用JTAG调试器:JTAG调试器是一种常用的调试工具,可以用于单步执行、断点调试等操作。在STM32单片机中,可以使用ST-Link、STMicroelectronics IDE等工具进行JTAG调试。 2.使用串口调试器:串口调试器可以通过串口与单片机进行通信,实现单步执行、断点调试等功能。在STM32单片机中,可以使用ST-Link、STMicroelectronics IDE等工具进行串口调试。 3.使用仿真器:STM32单片机可以使用仿真器进行开发和
[单片机]
使用MCU GD32替代STM32的体会
GD32作为国产MCU里的佼佼者,产品线也比较丰富,是替代STM32的一个很好的选择。前段时间有个项目用到GD32的单片机,今天来说说使用的一些体会。 1.硬件我用的单片机型号为GD32F405RGT6,对应STM32F405RGT6。首先,硬件上基本兼容,有一点不同的是GD32的31和47脚为NC,STM32的为VCAP。STM32这两个引脚需要分别连接一个电容到GND,而GD32则不需要。当然,有这两个电容也无所谓,所以,硬件上GD32可以直接替换STM32。 仿真器可以使用Jlink,也可以使用STLink,但是下载程序时会弹框提示,非ST芯片。 2.软件软件上,前期
[单片机]
使用MCU GD32替代<font color='red'>STM32</font>的体会
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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