STM32学习笔记--------外部中断

发布者:WiseThinker最新更新时间:2022-07-04 来源: csdn关键字:STM32  学习笔记  外部中断 手机看文章 扫描二维码
随时随地手机看文章

外部中断

中断就是主程序在正常执行时,CPU发出一个中断请求,然后程序就会跳到中断子程序去执行,执行完后会返回主程序。


一、概述

组成结构

在这里插入图片描述

1-15中断号用于系统异常

在这里插入图片描述

16开始是外部中断

在这里插入图片描述


1、GPIO引脚0对应的是外部中断0

2、一个中断对应了9个IO口(PA0~PA9)

3、同一时刻一个中断只能对应一个IO口,不能PA0链接了外部中断0,PB0再链接外部中断0

在这里插入图片描述

二、使用步骤

1.GPIO端口设置为外部中断输入----参考stm32f10x_gpio.c

代码如下(示例):


void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)


2.把引脚与EXIT0链接----参考stm32f10x_gpio.c

代码如下(示例):


void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);


函数原型:


/**

  * @brief  Selects the GPIO pin used as EXTI Line.

  * @param  GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines.

  *   This parameter can be GPIO_PortSourceGPIOx where x can be (A..G).

  * @param  GPIO_PinSource: specifies the EXTI line to be configured.

  *   This parameter can be GPIO_PinSourcex where x can be (0..15).

  * @retval None

  */

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)

{

  uint32_t tmp = 0x00;

  /* Check the parameters */

  assert_param(IS_GPIO_EXTI_PORT_SOURCE(GPIO_PortSource));

  assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));

  

  tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03));

  AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp;

  AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)));

}


3.EXIT配置----参考stm32f10x_exti.c

代码如下(示例):


void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);

1

EXTI_InitTypeDef 初始化结构体成员:


/** 

  * @brief  EXTI Init Structure definition  

  */

typedef struct

{

  uint32_t EXTI_Line;               /*中断线标号范围  0-15*/

  EXTIMode_TypeDef EXTI_Mode;       /*中断模式/事件模式*/

  EXTITrigger_TypeDef EXTI_Trigger; /*中断触发方式     上升沿、下降沿、双边沿都触发*/

  FunctionalState EXTI_LineCmd;     /*中断线使能/不使能*/ 

}EXTI_InitTypeDef;


①中断模式 EXTIMode_TypeDef


/** 

  * @brief  EXTI mode enumeration  

  */

typedef enum

{

  EXTI_Mode_Interrupt = 0x00,//中断

  EXTI_Mode_Event = 0x04//事件

}EXTIMode_TypeDef;


②中断触发方式结构体 EXTITrigger_TypeDef


/** 

  * @brief  EXTI Trigger enumeration  

  */

typedef enum

{

  EXTI_Trigger_Rising = 0x08,//上升沿触发

  EXTI_Trigger_Falling = 0x0C,//下降沿  

  EXTI_Trigger_Rising_Falling = 0x10///*//双边沿都触发

}EXTITrigger_TypeDef;


4.NVIC中断优先级配置------参考misc.c

代码如下(示例):


void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)

1

中断优先级管理结构体 NVIC_InitTypeDef


/** 

  * @brief  NVIC Init Structure definition  

  */

typedef struct

{

  uint8_t NVIC_IRQChannel;                    /*使能按 键外部中断通道*/

  uint8_t NVIC_IRQChannelPreemptionPriority;  /*抢占优先级 2*/

  uint8_t NVIC_IRQChannelSubPriority;         /*响应优先级 2 */

  FunctionalState NVIC_IRQChannelCmd;         /*使能/不使能 */   

} NVIC_InitTypeDef;


抢占优先级

EXIT0 最高优先级


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

    函数功能:中断0优先级配置函数

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

void Nvic0_Config(void)

{

    /*中断优先级配置*/

    NVIC_InitTypeDef NVIC_InitStruct;//配置中断分组NVIC

    

    NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;

    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00;

    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00;

    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStruct);

}


EXIT3------响应优先级2


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

    函数功能:中断3优先级配置函数

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

void Nvic3_Config(void)

{

    /*中断优先级配置*/

    NVIC_InitTypeDef NVIC_InitStruct;//配置中断分组NVIC

    

    NVIC_InitStruct.NVIC_IRQChannel = EXTI3_IRQn;

    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x02;

    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x02;

    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStruct);

}


EXIT4—响应优先级1


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

    函数功能:中断4优先级配置函数

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

void Nvic4_Config(void)

{

    /*中断优先级配置*/

    NVIC_InitTypeDef NVIC_InitStruct;//配置中断分组NVIC

    

    NVIC_InitStruct.NVIC_IRQChannel = EXTI4_IRQn;

    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级

    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x01;//响应优先级

    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStruct);

}


EXIT3:绿灯 响应优先级0x01

EXIT4:红灯 0x02

外部中断0先按下,然后依次按下外部中断4,外部中断3,CPU记录下中断。

现象:

LED绿灯亮起,后LED红灯亮起。

在这里插入图片描述

5.中断服务函数(中断后你想让CPU做的事情)

在这里插入图片描述

部分代码如下(示例):


                ; External Interrupts

                DCD     WWDG_IRQHandler            ; Window Watchdog

                DCD     PVD_IRQHandler             ; PVD through EXTI Line detect

                DCD     TAMPER_IRQHandler          ; Tamper

                DCD     RTC_IRQHandler             ; RTC

                DCD     FLASH_IRQHandler           ; Flash

                DCD     RCC_IRQHandler             ; RCC

                DCD     EXTI0_IRQHandler           ; EXTI Line 0

                DCD     EXTI1_IRQHandler           ; EXTI Line 1

                DCD     EXTI2_IRQHandler           ; EXTI Line 2

                DCD     EXTI3_IRQHandler           ; EXTI Line 3

                DCD     EXTI4_IRQHandler           ; EXTI Line 4


三、应用实例

EXIT.c


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

    函数功能:中断初始化函数

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

void  EXIT_Init(void)//初始化

{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟

    KEY_Init();

    Exit9_5_Config();

    Nvic_Config();

}

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

    函数功能:EXIT中断配置函数

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

void Exit9_5_Config(void)

{

    //初始的结构体定义

    EXTI_InitTypeDef EXTI_InitStruct;//中断初始化的结构体

    //将引脚与中断链接

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);

    EXTI_InitStruct.EXTI_Line = EXTI_Line4;//外部中断4

    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式

    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;//任意电平

    EXTI_InitStruct.EXTI_LineCmd = ENABLE;//使能    

    EXTI_Init(&EXTI_InitStruct);

}


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

    函数功能:中断优先级配置函数

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

void Nvic_Config(void)

{

    /*中断优先级配置*/

    NVIC_InitTypeDef NVIC_InitStruct;//配置中断分组NVIC

    

    NVIC_InitStruct.NVIC_IRQChannel = EXTI2_IRQn;

    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x02;

    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x02;

    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStruct);

}

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

    函数功能:中断服务函数

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

void EXTI4_IRQHandler(void)

{

    //判断是否有中断请求

    delay_ms(10);//消抖

if(PEin(4)==1)

{  

PEout(5) = 0;

}

EXTI_ClearITPendingBit(EXTI_Line4); //清除LINE0上的中断标志位  

}


main.c


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

     外部中断点亮LED

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

int main(void)

{


    delay_init();//延时函数

    LED_Init();

    //KEY_Init();

    EXIT_Init();

    while(1)

    { 


    }  

}


总结

注意:


1.要开启RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟

2.将引脚链接到中断

关键字:STM32  学习笔记  外部中断 引用地址:STM32学习笔记--------外部中断

上一篇:STM32笔记——GPIO
下一篇:STM32学习笔记--------时钟体系

推荐阅读最新更新时间:2024-11-13 17:18

GP2Y10驱动含PM2.5和AQI(STM32
一、前期准备 单片机:STM32F103ZET6 开发环境:MDK5.14 库函数:标准库V3.5 GP2Y10模块:淘宝有售 二、实验效果 三、驱动原理 主要就是采集AD电压,对应转换公式做相关的转换。 需要完整工程或者有问题的请加QQ:1002521871,验证:呵呵。 四、驱动代码 gp2y10.h #ifndef __GP2Y10_H__ #define __GP2Y10_H__ #include stm32f10x.h #include gpio.h #include delay.h #include uart.h #define GP2Y10_CONTROL PAout(0) #defin
[单片机]
GP2Y10驱动含PM2.5和AQI(<font color='red'>STM32</font>)
STM32 SYSTICK
void SysTick_Config(void);//SysTick定时器配置 void Delay_Ms(u32);//定时时间配置 void void SysTickHandler(void);//中断定时时间处理函数 static vu32 TimingDelay;//中断处理函数 //SysTick设置 void SysTick_Config(void) { SysTick_CounterCmd(SysTick_Counter_Disable); SysTick_ITConfig(DISABLE); SysTick_
[单片机]
2023 STM32全国巡展,米尔限量发STM32MP135开发板优惠券
2023年9月12日至10月27日,以“STM32,不止于芯”为主题的第十六届STM32全国巡回研讨会将走进11个城市,本届研讨会为全天会议,我们将围绕STM32最新产品开展技术演讲和方案演示。 本次STM32全国研讨会,米尔电子将现场展出STM32相关的最新产品技术和应用演示,为工程师们提供共话交流共同探索开放式平台,届时,米尔电子的技术工程师将与各位嘉宾面对面深入交流。感兴趣的客户和朋友欢迎莅临参观了解! 米尔电子的明星产品将精彩亮相 米尔MYC-YF13X 核心板及开发板 基于STM32MP1系列MPU,STM32MP135高性价比入门级MPU设计平台,完整的安全生态系统让MCU开发者友好地过渡到MPU平
[单片机]
2023 <font color='red'>STM32</font>全国巡展,米尔限量发STM32MP135开发板优惠券
STM32的LCD驱动编写思路
STM32开发板有很多配套LCD例程,如下图就是开发板上最常见的一种TFTLCD屏。商家会给封装好一些LCD函数,大家能学会如何点亮一个LCD。 在主函数中加入上述代码就可以轻松实现输出字符串、画矩形块、清屏等效果。 但是这些例程代码或许有下面的问题: 分层不清晰,通俗讲就是模块化太差 接口乱,只要接口不乱,分层就会好很多了 可移植性差 通用性差 为什么这样说呢?如果你已经了解了LCD的操作,请思考如下情景: 代码空间不够,只能保留9341的驱动,其他LCD驱动全部删除。能一键(一个宏定义)删除吗?删除后要改多少地方才能编译通过? 有一个新产品,收银设备。系统有两个LCD,都是OLED,驱动IC相同,但是一个是128x64
[单片机]
<font color='red'>STM32</font>的LCD驱动编写思路
stm32指令集合不区分大小写
单片机中接收到奥串口的指令一般为字符串,如果使用strncmp比较是否为我们的指令集中的指令,则不能区分大小写,这里可以使用strcasecmp( )函数和strncasecmp( )函数,来对接收到的字符串指令进行接收比较,并且可以不区分大小写,包含头文件include“stdio.h” 下面对strcasecmp( )函数和strncasecmp( )函数的原型以及应用进行介绍: strcasecmp( )函数说明: strcasecmp()用来比较参数s1和s2字符串,比较时会自动忽略大小写的差异。 返回值 若参数s1和s2字符串相同则返回0。s1长度大于s2长度则返回大于0 的值,s1 长度若小于s2 长度则返回小
[单片机]
贸泽率先独家备货STMicroelectronics的STM32 LoRaWAN 探索板
最新半导体和电子元件的全球授权分销商贸泽电子(Mouser Electronics) 即日起率先备货STMicroelectronics (ST)的STM32 LoRaWAN™ 探索板。这款新型探索套件与可从贸泽电子订购的Arduino兼容I-NUCLEO-LRWAN1 STM32 LoRa™扩展板一起作为一个平台,用于了解和评估基于LoRa和FSK/OOK 射频 (RF) 通信的解决方案。         贸泽电子独家备货的 ST STM32 LoRaWAN探索套件基于一体化开放式 Murata Type ABZ模块,支持低功率广域网(LPWAN) 和LoRaWAN 远程无线协议。Type ABZ模块包含一个具有192 KB 闪
[单片机]
ARM学习笔记002之gcc-4.3.2编译器不支持硬件除法运算的解决方
一般如果gcc不能使用除法,make后的错误是: 每一个错误处都使用了除法。 我的makefile代码如下: CC = arm-linux-gcc LD = arm-linux-ld AR = arm-linux-ar OBJCOPY = arm-linux-objcopy OBJDUMP = arm-linux-objdump INCLUDEDIR := $(shell pwd)/include CFLAGS := -Wall -O2 CPPFLAGS := -nostdinc -I$(INCLUDEDIR) export CC LD AR OBJCOPY OBJDUMP INCLUDEDIR
[单片机]
ARM<font color='red'>学习</font><font color='red'>笔记</font>002之gcc-4.3.2编译器不支持硬件除法运算的解决方
GD32单片机和STM32单片机的区别
一、前言 什么GD32? GD32是国内开发的一款单片机,据说开发的人员是来自ST公司的,GD32也是以STM32作为模板做出来的。 所以GD32和STM32有很多地方都是一样的,不过GD32毕竟是不同的产品,不可能所有东西都沿用STM32,有些自主开发的东西还是有区别的。相同的地方我们就不说了,下面我给大家讲一下不同的地方。 二、区别 1、内核 GD32采用二代的M3内核,STM32主要采用一代M3内核,下图是ARM公司的M3内核勘误表,GD使用的内核只有752419这一个BUG。 2、主频 使用HSE(高速外部时钟):GD32的主频最大108M,STM32的主频最大72M 使用HSI(高速内部时钟):GD32的主频最大10
[单片机]
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