精华内容
下载资源
问答
  • 外部中断函数中,记住清除标志位

    千次阅读 2012-07-20 10:39:23
    P1IFG。。。。。。

    P1IFG。。。。。。

    展开全文
  • stm32hal库之外部中断巨坑,如果使用按键外部中断会导致频繁触发中断,从而不能退出中断,导致卡死 void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) { /* EXTI line interrupt detected */ if(__HAL_GPIO_EXTI_...

    stm32hal库之外部中断巨坑,如果使用按键外部中断会导致频繁触发中断,从而不能退出中断,导致卡死

    void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
    {
      /* EXTI line interrupt detected */
      if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
      {
       __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
        HAL_GPIO_EXTI_Callback(GPIO_Pin);
    	
      }
    }
    

    把上面的改为

    void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
    {
      /* EXTI line interrupt detected */
      if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
      {
       // __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
        HAL_GPIO_EXTI_Callback(GPIO_Pin);
    		__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
      }
    }
    

    原因是在回调函数没有执行完毕就去执行清除外部中断标志位对的话,如果按键还在按下,有可能导致不停触发中断,也就是不断嵌套中断,导致不能退出,卡死在中断里面,因为按键触发外部中断起码有几百ms,这期间大家想想可以触发多少次中断了

    展开全文
  • void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//回调函数 { if(GPIO_Pin==KEY1_GPIO_PIN) { HAL_Delay(20);// 延时一小段时间,消除抖动 if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_...
    **
    
    针对HAL库的中断操作,使用按键实例进行说下,以供参考
    ---------------------------
    
    **
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//回调函数
    {
      if(GPIO_Pin==KEY1_GPIO_PIN)
      {
        HAL_Delay(20);// 延时一小段时间,消除抖动 
        if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL)//按键1判断
        {
          BEEP_TOGGLE;
          LED1_ON;
          LED2_ON;
          LED3_ON;
        }
        __HAL_GPIO_EXTI_CLEAR_IT(KEY1_GPIO_PIN);
      }
      else if(GPIO_Pin==KEY2_GPIO_PIN)
      {
        HAL_Delay(20);// 延时一小段时间,消除抖动 
        if(HAL_GPIO_ReadPin(KEY2_GPIO,KEY2_GPIO_PIN)==KEY2_DOWN_LEVEL)//按键2判断
        {
          BEEP_TOGGLE;
          LED1_OFF;
          LED2_OFF;
          LED3_OFF;
        }
        __HAL_GPIO_EXTI_CLEAR_IT(KEY2_GPIO_PIN);
      }
    }
    

    中断时间配置

    1.开启中断,配置中断 HAL_TIM_Base_Start_IT( &htim6);//开启基本定时器中断模式计数
    2.回调处理(中断处理)
    在这里插入图片描述

    在it.c中的中断函数基本不处理内容,回调函数的中断配置
    void TIM2_IRQHandler(void)
    {
      /* USER CODE BEGIN TIM2_IRQn 0 */
    
      /* USER CODE END TIM2_IRQn 0 */
      HAL_TIM_IRQHandler(&htim2);
      /* USER CODE BEGIN TIM2_IRQn 1 */
    
      /* USER CODE END TIM2_IRQn 1 */
    }
    
    真正的处理在
    main.c中的
            void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
            {
                    //if(htim == (&htim1))
                    if(TIM1 == htim->Instance)
                    {
    
    
                     }
    
                         if (htim->Instance == htim3.Instance)
                    {
                    }
    
            }
    

    计数模式:
    定时器有如下三种计数模式
    递增计数模式:计数器从 0 计数到自动重载值,然后重新从 0 开始计数并生成计数器上溢事件。
    递减计数模式:计数器从自动重载值开始递减到 0,然后重新从自动重载值开始计数并生成计数器下溢事件。
    中心对齐模式:计数器从 0 开始计数到自动重载值 – 1 ,生成计数器上溢事件;然后从自动重载值开始向下计数到 1 并生成计数器下溢事件。之后从0 开始重新计数。

    ETR外部脉冲计数器, 标准库获取计数器值用TIM_GetCounter函数,HAL函数中,直接调用值即可配置
    在这里插入图片描述

    /* USER CODE BEGIN 2 */
        HAL_TIM_Base_Start(&htim1);
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
      /* USER CODE END WHILE */
    
      /* USER CODE BEGIN 3 */
     HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,(GPIO_PinState)!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0));
     HAL_Delay(500);
     HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,(GPIO_PinState)!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0));
            
     printf("num=%d\r\n",htim1.Instance->CNT);
      }
      /* USER CODE END 3 */
    

    定时功能:

    int main(void)
    { 
      HAL_Init();
      SystemClock_Config();
      LED_GPIO_Init();
      BASIC_TIMx_Init();
      HAL_TIM_Base_Start_IT(&htimx);
      /* 无限循环 */
      while (1)
      {
        if(timer_count==1000)
        {
          timer_count=0;
          LED1_TOGGLE;
          LED2_TOGGLE;
          LED3_TOGGLE;
        }
      }
    }
    
    /**
      * 函数功能: 非阻塞模式下定时器的回调函数
      * 输入参数: htim:定时器句柄
      * 返 回 值: 无
      * 说    明: 无
      */
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
      timer_count++;
    }
    

    微信搜索“Allen5G” 或者扫描下面二维码、关注,获取更多干货!
    在这里插入图片描述

    展开全文
  • STM32 FreeRTOS 外部中断服务函数注意事项 移植正点原子的FreeRTOS操作系统到我们自己的工程,发现的一个注意事项; 看下面代码,带FreeRTOS的外部中断服务函数,实现按键消抖,不能用delay_ms()或者和vTaskDelay...

    STM32 FreeRTOS 外部中断服务函数注意事项
    移植正点原子的FreeRTOS操作系统到我们自己的工程,发现的一个注意事项;
    看下面代码,带FreeRTOS的外部中断服务函数,实现按键消抖,不能用delay_ms()或者和vTaskDelay(),会导致系统奔溃;
    原因是delay_ms()其实就是对 FreeRTOS 中的延时函数 vTaskDelay()的简单封装,所以在使用 delay_ms()的时候就会导致任务切换,即不会导致这个外部中断延时阻塞,而切换到其他任务,导致外部中断出错;
    这里我们可以使用delay_xms(),其不会引起任务调度,是真的延时;(仅针对外部中断函数,因为我发现在按键扫描函数里面,可以使用delay_ms();)

    //提供框架---对应PA0---》PG0
    void EXTI0_IRQHandler(void)
    {
    //  delay_ms(10);//消抖
        delay_xms(10);   //消抖            
        if(KEY9==0)      
        {
            SEGGER_RTT_printf(0,"按键IN9输入 \n");
        }
        EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位  
    }

    号外:
    (1)delay_ms()和vTaskDelay()一样使用,delay_ms()其实就是对 FreeRTOS 中的延时函数 vTaskDelay()的简单封装
    但vTaskDelay()程序更简洁,ms级延时更精准;
    为了编程方便,delay_ms()一般使用在外设模块初始化时候的ms级延时,例如RS485、LCD、以太网模块等,实测没有问题;
    (2)注意NVIC_IRQChannelPreemptionPriority优先级配置,正点原子例程的优先级0~4不会被FreeRTOS禁止,一般用于定时器;优先级5~15受FreeRTOS控制,一般用于外部中断、USART等;
    (3)注意区分中断优先级和任务优先级,任务优先级数字越低表示任务的优先级越低, 0 的优先级最低, configMAX_PRIORITIES-1 的优先级最高。空闲任务的优先级最低,为 0。
    (4)任务函数一般不允许跳出循环,如果一定要跳出循环的话在跳出循环以后一定要调用函数 vTaskDelete(NULL)删除此任务!

    展开全文
  • 一、配置外部中断 1.配置引脚: 1.选择外部中断 2.选择触发条件 3.选择上下拉 2.使能中断 1勾选中断,使能中断 3.生成代码中,在main.c中添加中断回调函数 void HAL_GPIO_EXTI_Callback(uint16_t ...
  • 代码: ULONG vector; KIRQL irql;...功能:将外部中断IRQ10与中断函数OnInterrupt挂钩,中断10触发时进入OnInterrupt函数进行端口的处理操作。 问题:IoConnectInterrupt函数执行不成功,返回错误。
  • 说在前面:记得前几天了一个用按键来控制灯的函数,但是无论怎样都无法实现函数的重复使用,一开始以为是没有设置好循环,但是,因为没有实现外部中断才做不了循环操作2.外部中断1.作为STM32而言,每一个IO口都...
  • 外部中断

    千次阅读 2020-03-01 17:28:35
    外部中断输入引脚二.外部中断相关寄存器**1.中断允许寄存器(IE)**2.中断标志寄存器(TCON)三.外部中断配置与程序举例 一.外部中断输入引脚 外部中断0(INT0):P3.2口的附加功能 外部中断1(INT1):P3.3口的...
  • STM32 关于外部中断线、中断源和中断服务函数的问题 中断线问题: 上图可以看出,PA0、PB0...PG0共用的EXTI0中断线,PA1、PB1...PG1共用的EXTI1中断线,也就是 编程里面的(如下图库文件),对应16个中断线,...
  • 外部中断0 外部0中断触发:(P3.2口触发;P3.2触发;P3.2触发) 若IT0=0,则为低电平触发 若IT0=1,则为下降沿触发 外部中断0初始化: 初始化方法一: void Init_INT0() { IT0=1;//设置外部中断0;下降沿触发 EX0=...
  • 闲来无事,今天一遍这个来介绍说明一下外部中断INT0、INT1。其他的小编以后再整理给大家。 先上一个实例: 题目: 实例仿真图: 程序 #include <reg52.h> #include <intrins.h> #define uint ...
  • 中断函数和中断处理函数

    万次阅读 2014-10-22 13:52:37
    (1)当你在做一个计算机(嵌入式)...外设(定时器)会向你CPU核心发送外部中断请求,如果此时没有对它进行任何屏蔽的话,并且也没有比它优先级更高的中断事件处于未决状态的话, 那么此时该事件的中断发生。  为了
  • Arduino常用函数总汇——中断函数

    千次阅读 2018-11-06 22:33:07
    3、attachInterrupt(interruptnum,function,mode):用于设置外部中断函数  interruptnum:中断源(0或1)  function:中断处理函数的名字  mode:中断触发模式(LOW:低电平触发;CHANGE:...
  • **STM32外部中断查询: 15-10线的外部中断共用一个中断函数,怎么在该函数里查询是哪个中断线产生了中断呢**? 使用 EXTI_GetITStatus()来查询哪根线产生了中断。比如EXTI_GetITStatus(EXTI_Line13)就是查询13线是否...
  • Arduino 定时器中断 外部中断

    万次阅读 2019-04-09 17:29:31
    但如果此时发生了某一件事件B请求CPU迅速去处理(中断发生),CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务),待CPU将事件B处理完毕后,再回到原来被中断的地方继续执行程序(中断返回),这一过程成...
  • stm32在中断函数里执行初始化函数

    千次阅读 2018-06-12 15:37:05
    最近用了stm32f030c8t6,要求做低功耗:1、关闭外设时钟并把管脚都配置成模拟输入...找了好久才想起来,我的唤醒初始化函数是在外部中断函数中执行的,初始化函数中用了延时函数,延时需要执行systick中断函数,中断...
  • 学单片机的,相信对中断的概念都已经了如指掌了,中断具体是什么我在这里也就不再详细说明,不懂的上网找找也一大堆。那么在介绍实验之前我先跟大家简单讲讲STM32当中的NVIC(嵌套向量中断控制器) NVIC NVIC(嵌套...
  • 初学Arduino——中断函数attachInterrupt

    万次阅读 2019-01-14 21:25:20
    比较上次的判断语句,这次我们使用中断函数(attachInterrupt),使代码更简洁易懂。 中断函数(attachInterrupt):attachInterrupt(interrupt,function,mode) interrupt:中断源(在Arduino中,中断源可选...
  • DSP28335外部中断配置过程

    千次阅读 2019-04-15 21:59:24
    28335外部中断基本特点 7个可屏蔽中断源和1个不可屏蔽外部中断源 ...**外部中断外设和其他外设不一样,在中断函数中只用清除PIE中断即可不用清除外设中断**。 外部中断配置过程 其实28335的外部中断配...
  • 外部中断EXTI

    千次阅读 2016-09-12 16:50:15
    前置技能: 按键输入-GPIO输入一,STM32中断介绍相比简单的51单片机,STM32的每个IO口都可以作为外部中断输入STM32中断控制器支持19个外部中断/事件请求: 线0-15:外部IO口输入中断 线16:连接到PVD输出 线17:连接到...
  • STM32共用中断和共用中断函数的判断

    千次阅读 2016-12-09 21:21:35
    STM32外部中断查询: 15-10线的外部中断共用一个中断函数,怎么在该函数里查询是哪个中断线产生了中断呢?使用 EXTI_GetITStatus()来查询哪根线产生了中断。 比如EXTI_GetITStatus(EXTI_Line13)就是查询13线是否...
  • stm32外部中断的基本步骤

    千次阅读 2017-03-13 07:50:14
    外部中断的基本步骤: 1.打开外部中断时钟AFIO 2.中断线配置(GPIO_EXTILineConfig()) 3.EXTI中断初始化配置(EXTI_InitTypeDef) ...6.外部中断函数内,中断完成后要清除中断的线路挂起位EXTI_ClearITPen
  • 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。 中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题。 (1)...
  • ESP8266--外部中断

    千次阅读 2018-10-07 12:50:26
    外部中断只针对于输入设备,当设备输入时的IO口电平发送变化时,调用相对应的IO的外部中断函数或者寄存器就会进入到IO口的外部中断控制。 当配置完成时,加入需要对外部IO口变化之后进行操作时,通常的单片机需要...
  • 外部中断 STM32F4的每个IO都可以作为外部中断的中断输入口,这点也是STM32F4的强大之处。STM32F407的中断控制器支持22个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。 STM32F...
  • 2,ISR,中断处理函数的名称 3,触发中断的引脚状态变化 LOW 引脚低电平触发中断 CHANGE 引脚电平变化触发中断RISING 引脚电平由低到高触发中断 FALLING 引脚电平由高到低触发中断 HIGH 引脚低高平触发中断(Ard

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 96,497
精华内容 38,598
关键字:

外部中断函数怎么写