精华内容
下载资源
问答
  • (1)上升沿触发外部中断 (2)下降沿触发外部中断 (3)边沿触发外部中断 (4)上升沿触发外部事件 (5)下降沿触发外部事件 (6)边沿触发外部事件 2.CubeMX生成的代码: /** Configure pins as * EXTI */ void ...

    1.STM32CubeMX配置如下:

    在这里插入图片描述
    这里GPIO mode一共有六种分别是:在这里插入图片描述
    (1)上升沿触发外部中断
    (2)下降沿触发外部中断
    (3)边沿触发外部中断
    (4)上升沿触发外部事件
    (5)下降沿触发外部事件
    (6)边沿触发外部事件

    2.CubeMX生成的代码:

    /** Configure pins as
            * EXTI
    */
    void MX_GPIO_Init(void)
    {
    	__HAL_RCC_GPIOD_CLK_ENABLE();  //使能GPIO时钟
    	GPIO_InitTypeDef GPIO_InitStruct = {0};
    	
    	GPIO_InitStruct.Pin = DATA_433M_Pin;
    	GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;  //上升沿触发
    	GPIO_InitStruct.Pull = GPIO_PULLDOWN; //下拉
    	HAL_GPIO_Init(DATA_433M_GPIO_Port, &GPIO_InitStruct);
    	
    	HAL_NVIC_SetPriority(EXTI2_3_IRQn, 0, 0);//设置中断优先级
    	HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);//使能外部中断
    }
    
    /******************************************************************************/
    /* STM32G0xx Peripheral Interrupt Handlers                                    */
    /* Add here the Interrupt Handlers for the used peripherals.                  */
    /* For the available peripheral interrupt handler names,                      */
    /* please refer to the startup file (startup_stm32g0xx.s).                    */
    /******************************************************************************/
    
    /**
      * @brief This function handles EXTI line 2 and line 3 interrupts.
      */
    void EXTI2_3_IRQHandler(void)
    {
      /* USER CODE BEGIN EXTI2_3_IRQn 0 */
    
      /* USER CODE END EXTI2_3_IRQn 0 */
      HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);
      /* USER CODE BEGIN EXTI2_3_IRQn 1 */
    
      /* USER CODE END EXTI2_3_IRQn 1 */
    }
    

    3.分析外部中断过程

    我们可以看见这个外部中断包含了GPIO_Pin_2和GPIO_Pin_3两个外部中断源,这两个脚都可以触发这个外部中断,如果我们想区分具体是2还是3脚的时候,或者需要区分上升沿做不同事情,那么就需要自己重构回调函数来区分,然后执行不同的任务。我们发现里面只有一个函数,打开看看如下:

    /**
      * @brief  Handle EXTI interrupt request.
      * @param  GPIO_Pin Specifies the port pin connected to corresponding EXTI line.
      * @retval None
      */
    void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
    {
      /* EXTI line interrupt detected */
      if (__HAL_GPIO_EXTI_GET_RISING_IT(GPIO_Pin) != 0x00u)
      {
        __HAL_GPIO_EXTI_CLEAR_RISING_IT(GPIO_Pin);
        HAL_GPIO_EXTI_Rising_Callback(GPIO_Pin);
      }
    
      if (__HAL_GPIO_EXTI_GET_FALLING_IT(GPIO_Pin) != 0x00u)
      {
        __HAL_GPIO_EXTI_CLEAR_FALLING_IT(GPIO_Pin);
        HAL_GPIO_EXTI_Falling_Callback(GPIO_Pin);
      }
    }
    

    可以发现里面里面一共两个大的判断,一个是上升沿,一个是下降沿。然后先清楚中断标志位,然后执行一个回调函数,这个回调函数是可以自己重构的,仔细看下这个回调函数:

    /**
      * @brief  EXTI line detection callback.
      * @param  GPIO_Pin Specifies the port pin connected to corresponding EXTI line.
      * @retval None
      */
    __weak void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
    {
      /* Prevent unused argument(s) compilation warning */
      UNUSED(GPIO_Pin);
    
      /* NOTE: This function should not be modified, when the callback is needed,
               the HAL_GPIO_EXTI_Rising_Callback could be implemented in the user file
       */
    }
    

    凡是前面带__weak的我们都是可以再重构而不会报错的。

    4.重构回调函数

    //下降沿回调函数
    void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
    {
     if(GPIO_Pin == GPIO_PIN_2)
      {
        SEGGER_RTT_printf(0,"GPIO_Pin_2 Rising exti!\r\n");
      }
      else if(GPIO_Pin == GPIO_PIN_3)
        {
        SEGGER_RTT_printf(0,"GPIO_Pin_3 Rising exti!\r\n");
      }
    }
    //上升沿回调函数
    void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
    {
     if(GPIO_Pin == GPIO_PIN_2)
      {
        SEGGER_RTT_printf(0,"GPIO_Pin_2 Falling exti!\r\n");
      }
      else if(GPIO_Pin == GPIO_PIN_3)
        {
        SEGGER_RTT_printf(0,"GPIO_Pin_3 Falling exti!\r\n");
      }
    }
    

    5.调试结果

    在这里插入图片描述

    6.增加GPIO端口判断

    1)解决办法:

    进中断回调函数的时候通过if(HAL_GPIO_ReadPin(GPIOD,DATA_433M_Pin)==1)读取对应引脚电平状态来区分

    void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
    {
     if(GPIO_Pin == GPIO_PIN_2)
      {
    		if(HAL_GPIO_ReadPin(GPIOD,DATA_433M_Pin)==1) 
                SEGGER_RTT_printf(0,"GPIO_Pin_2 Rising exti!\r\n");
      }
      else if(GPIO_Pin == GPIO_PIN_3)
        {
        SEGGER_RTT_printf(0,"GPIO_Pin_3 Rising exti!\r\n");
      }
    }
    

    2)实测如下:

    在这里插入图片描述
    第一个是if(HAL_GPIO_ReadPin(GPIOD,DATA_433M_Pin) == 1)的结果,因为我们是上升沿,所以触发中断的时候肯定是个高电平,所以这个时候是可以正常打印RTT的。
    第二个是if(HAL_GPIO_ReadPin(GPIOD,DATA_433M_Pin) == 0)的结果,因为我们是上升沿,所以触发中断的时候肯定是个高电平,而我们条件是低电平才会正常打印,所以退出低功耗的时候没有看见RTT打印的log。

    展开全文
  • 使用attachInterrupt函数 函数参数 1,digitalPinToInterrupt(pin) 使用的中断,传入...CHANGE 引脚电平变化触发中断RISING 引脚电平由低到高触发中断 FALLING 引脚电平由高到低触发中断 HIGH 引脚低高平触发中断(Ard

    使用attachInterrupt函数

    函数参数

    1,digitalPinToInterrupt(pin)   使用的中断,传入引脚号

    2,ISR,中断处理函数的名称

    3,触发中断的引脚状态变化

    • LOW 引脚低电平触发中断
    • CHANGE 引脚电平变化触发中断
    • RISING 引脚电平由低到高触发中断
    • FALLING 引脚电平由高到低触发中断
    • HIGH 引脚低高平触发中断(Arduino Due 板子才有)

    各板子的外部中断引脚号

    外部中断引脚号

    板子型号int.0int.1int.2int.3int.4int.5
    Uno, Ethernet23    
    Mega25602321201918
    32u4 based (e.g Leonardo, Micro)32017 

     Arduino Due所有数字引脚,ArduinoZero所有数字引脚除了引脚4

    示例程序如下


    int pin = 13;
    volatile int state = LOW;

    void setup(){
        pinMode(pin,OUTPUT);
        attachInterrupt(digitalPinToInterrupt(pin), blink,CHANGE);
    }

    void loop(){
        digitalWrite(pin, state);
    }

    void blink(){
        state = !state;
    }



    
    
    展开全文
  • 用C编程,设置两个外部中断(INT0和INT1)按键,优先级IP=0x04,即把外部中断1设置为高级优先级,外部中断0为低级优先级,使外部中断1嵌套在外部中断0中。 要求:中断触发方式为下降沿触发,按键有消抖功能 仿真 ...

    问题

    用C编程,设置两个外部中断(INT0和INT1)按键,优先级IP=0x04,即把外部中断1设置为高级优先级,外部中断0为低级优先级,使外部中断1嵌套在外部中断0中。
    要求:中断触发方式为下降沿触发,按键有消抖功能

    仿真

    在这里插入图片描述

    代码

    #include <reg51.h>
    #define uchar unsigned char
    
    void delay(uchar c) { //延时c毫秒
    		uchar a, b;
    		for (; c > 0; c--) 
    		for (b = 142; b > 0; b--) 
    		for (a = 2; a > 0; a--);
    }
    
    void INT_0() interrupt 0 { //外部中断0
    		EX0=0; //关闭外部中断0,防止在执行过程中再次发生中断
    		delay(20); //消除抖动
    		EX0=1; //打开外部中断0
    		while(1) { //led向下循环点亮,表示正在执行外部中断0服务程序
    				P1 = 0xfe; delay(200);
    				P1 = 0xfd; delay(200);
    				P1 = 0xfb; delay(200);
    				P1 = 0xf7; delay(200);
    				P1 = 0xef; delay(200);
    				P1 = 0xdf; delay(200);
    				P1 = 0xbf; delay(200);
    				P1 = 0x7f; delay(200);
    		}
    }
    
    void INT_1() interrupt 2 { //ÍⲿÖжÏ1
    		EX1=0;
    		delay(20);
    		EX1=1; 
    		P1 = 0x00; delay(200); //led全部点亮,闪烁3次,表示正在执行外部中1服务程序
    		P1 = 0xFF; delay(200);
    		P1 = 0x00; delay(200);
    		P1 = 0xFF; delay(200);
    		P1 = 0x00; delay(200);
    }
    
    void main() {
    		P1 = 0xFF;
    		EA = 1;  //打开总中断
    		EX0 = 1; //打开外部中断0
    		IP = 0x04; //设置外部中断1为高级优先级
    		IT0 = 1; //设置触发方式为下降沿触发
    		EX1 = 1; //打开外部中断1
    		IT1 = 1; 
    		while(1);//死循环
    }
    
    展开全文
  • 引脚P3.2/INT0外部中断 ;外部中断0程序跳转 ORG 0003H LJMP INT0_PROGRAM ;调用外部中断0的初始化程序 LCALL INT0_INITIALIZATION ;外部中断0初始化程序 INT0_INITIALIZATION: SETB EA CLR IE0 ;外部中断0请求...
    ;引脚P3.2/INT0外部中断
    
    ;外部中断0程序跳转
    ORG	0003H
    LJMP	INT0_PROGRAM
    
    ;调用外部中断0的初始化程序
    LCALL	INT0_INITIALIZATION
    
    ;外部中断0初始化程序
    INT0_INITIALIZATION:
    SETB	EA
    CLR		IE0		;外部中断0请求源标志。
    SETB	IT0		;中断触发方式为下降沿触发,CLR	IT0为低电平触发
    SETB	EX0		;外部中断0中断允许位
    RET
    
    ;外部中断0程序
    INT0_PROGRAM:
    CLR	IE0		;当下降沿触发方式时不需要软件清零,可以不需要这段
    ;以下外部中断0具体程序
    RETI
    
    
    
    
    
    展开全文
  • 8051外部中断0解析

    千次阅读 2019-07-23 10:23:44
    我们令IT0 = 1, 即选择了"边沿触发", 所以每当独立按键按下时, 中断处理函数EX_INT0()就会执行. 当进入中断处理函数执行时, 若P32引脚的电平为低电平, 则说明K3按键已按下; 若P32引脚的电平为高电平, 说明K3按键已...
  • 外部中断

    千次阅读 2020-03-01 17:28:35
    外部中断0(INT0):P3.2口的附加功能 外部中断1(INT1):P3.3口的附加功能 当引脚上出现有效的中断信号时,就有中断标志置1,向CPU申请中断。 二.外部中断相关寄存器 1.中断允许寄存器(IE) EA:CPU开启中断...
  • STM32F103和F429外部中断引脚分布.zip
  • LPC1768微处理器包括4个外部中断,分别是EINT0、EINT1、EINT2、EINT3对应的引脚分别是P2.10~P2.13,这几个引脚也可以作为通用IO口使用。名个外部中断可以设置成低电平/高电平或上升沿/下降沿有效,它们还有一个功能...
  • 外部中断0和1外部中断原理编程原理(外部中断0)代码实现 外部中断原理 外部中断0:(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置...
  • 51单片机外部中断0实例详解

    千次阅读 2020-02-14 11:47:49
    今天就以51单片机的外部中断0为例,来简单讲解一下单片机中断的用法。 1 51单片机的中断源 51单片机共有5个中断源,分别为: 外部中断0 定时器0中断 外部中断1 定时器1中断 串口中断 每一个中断都对应一个中断向量,...
  • 案例分析:中断与查询相结合的方法是把系统中多个外部中断源按它们的重要程度进行排序,把其中最高级别的中断源接到MCS-51的一个外部中断源输入端(例如接到 脚),其余的中断源用线“或”的方法连接到另一个外部中断...
  • 外部中断算是中断机制中的一种,只要中断引脚触发,便会打断当前的执行任务到外部中断函数中 如遇到有重要任务执行时不想被外部中断所打断,便需要暂时关闭外部中断 在库函数中没找到外部中断打开关闭的操作函数,在...
  • 实验11:外部中断0

    2020-03-05 21:11:06
    实验11:外部中断0 /************************************************************************************** * 外部中断0实验 * 实现现象:下载程序后按下K3按键可以对D1小灯状态取反。 注意事项...
  • 原标题:STC89C52单片机外部中断0实验/////////////////////////////////////////////////////////////////////////实现功能: 设置,然后通过点亮与P1口第一个引脚相连的D1来显示系统进入了外部中断0实验板型号:BS...
  • 定时器及外部中断

    2015-04-29 10:36:47
    1、引入两级外部中断外部中断0引脚外接键盘BUTTON1,实现对显示数快速加1,的控制,外部中断1外接键盘BUTTON2,实现对显示快速减1的控制。实验原理图如下 2、系统板上硬件连接 把“单片机系统”A2区的J61接口的P...
  • 利用外部中断来实现按键控制LED灯的亮灭。 实验工具:MDK5,STM32F103ZET6开发板 使用固件库编程 LED灯引脚PD13,按键PE0 首先了解一下32的外部中断 STM32 的每个 IO 都可以作为外部中断的中断输入口,STM32F103 的...
  • Port B口的8个引脚:PB[7:0] Port C口的8个引脚:PC[7:0] Port D口的7个引脚:PD[6:0] Port E口的8个引脚: PE[7:0] PD7时最高优先级的中断源TLI. 中断触发方式: 00:下降沿和低电平触发 01:仅上升沿触发 10:仅...
  • 利用外部中断0实现数码管按键加减

    千次阅读 2021-03-24 09:25:01
    利用外部中断0实现数码管按键加减 实现的结果: # 源程序: /*程序功能:在单片机的INT0,INT1引脚分别接两个按钮,通过按扭向单片机申请中断 中断一次实现变量加1或减1,并将结果显示在数码管*/ #include <reg51.h...
  • S32K引脚外部中断

    2020-12-23 10:35:51
    1.初始化按键为输入口,下降沿中断,默认上拉 2.中断管理中加入中断服务程序并开启中断 3.中断服务程序里面捕捉中断标志位并在处理事件中清空中断标志位。 踩坑记录: 中断中PINS_DRV_GetPinIntSel参数是PORT(A,B...
  • 单片机的外部中断(二)

    万次阅读 2018-12-01 21:58:33
    这两个引脚是功能复用引脚,既可以作为普通V0口,也可作为外部中断输入引脚。下面以部中断0来讲述。80C51单片机在每个机器周期的S5P2期间扫描外部中断输入引脚的电平状态。当外部中断设置为下降沿触发时,若处理器在...
  • STC 外部中断范例

    千次阅读 2014-02-12 21:29:01
    #include ...)这个高电平有效, //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)//外部中断0引脚是P3^2,如果你选择INT0=1;则只要电平由高变低就有效(可以外接开关加接地按开关P3^2接地,中断
  • STM32的外部中断与I/O的对应关系,一看便明了,很清晰。
  • 51单片机各个引脚功能 IO口引脚: 中断系统的主要功能:处理随机突发事件 中断系统结构: ...代码实现由外部中断控制P1口的电平高低: #include<reg52.h> #include<intrins.h> #define uint
  • 在很多单片机中,外部中断的个数都是有限的,而很多现实场景需要有多个外部中断同时进行,这时候单片机自带的外部中断端口可能就不够用了,那么,怎么解决这个问题呢,本文将会用最典型的51单片机为例,介绍两种较...
  • 外部中断EXTI

    千次阅读 2016-09-12 16:50:15
    前置技能: 按键输入-GPIO输入一,STM32中断介绍相比简单的51单片机,STM32的每个IO口都可以作为外部中断输入STM32中断控制器支持19个外部中断/事件请求: 线0-15:外部IO口输入中断 线16:连接到PVD输出 线17:连接到...
  • STC15W408AS单片机有4个外部中断,它们分别是:外部中断0(INT0)、外部中断1(INT1)、外部中断2(INT2)、外部中断3(INT3)。 外部中断0(INT0)和外部中断1(INT1)触发有两种触发方式,上升沿或下降沿均可触发方式 和仅...
  • 1、外部中断0:INT0,其对应的引脚为P3^2。 #include "reg52.h" typedef unsigned int u16; typedef unsigned char u8; sbit k3=P3^2; //定义按键K3,外部中断0触发I/O口 sbit led=P2^0; //定义P20...
  • S3C6410定时器0外部中断程序,写的不好,多多批评

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,150
精华内容 10,060
关键字:

外部中断0的引脚