STM32 CubeMX学习:6. 按键的外部中断

STM32-按键中断 边沿检测电路判断上升沿或下降沿,如果发生上升沿或下降沿则为1。软件中断事件寄存器也可以产生软件中断事件。请求挂起寄存器可以挂起中断请求。中断屏蔽寄存器:需要开启时,才可以产生中断。NVIC中断控制器:需要开启才能产生中断。...... 阅读详情
AI摘要

本文介绍了STM32CubeMX中配置外部中断处理按键的方法,包括按键原理、软件消抖、外部中断模式,并通过实例展示了如何在中断回调函数和主循环中实现按键控制LED灯的程序流程。

STM32 CubeMX学习:6. 按键的外部中断

系列文章目录
  1. 前期的准备
  2. 点亮 LED
  3. 闪烁 LED
  4. 定时器闪烁LED
  5. PWM控制LED亮度
  6. 常见的PWM设备
  7. 按键的外部中断
  8. ADC模数转换
  9. 串口收发
  10. 串口打印遥控器数据
  11. 未完待续…


0 前言

这次的博客。我们将了解按键的硬件原理,学习如何使用STM32的外部中断功能读取按键输入,如何使用软件消抖来消除按键输入产生的电压的抖动。此外,我们还将再一次借助按键中断的例子理解通过中断实现程序前后台的思想。So,我们开始吧

1 基础知识

1.1 按键原理图

在探索者 STM32F4开发板上的按键 KEY0 连接在 PE4 上、KEY1 连接在 PE3 上、KEY2 连接在 PE2 上、KEY_UP连接在 PA0 上。如图所示:
按键外部中断硬件原理图
在这块开发板上,KEY0、KEY1 和 KEY2 是低电平有效的,而 KEY_UP 是高电平有效的,并且外部都没有上下拉电阻,所以,我们需要在 STM32F4 内部设置上下拉。

1.2 按键软件消抖

考虑到真实的情况,由于按键的机械结构具有弹性,按下时开关不会立刻接通,断开时也不会立刻断开,这就导致按键的输入信号在按下和断开时都会存在抖动,如果不先将抖动问题进行处理,则读取的按键信号可能会出现错误。

为了消除这一问题,我们可以通过软件消抖或者硬件消抖两种方式来实现,我们在这里主要采用软件滤波的实现方法。软件滤波的思想其实非常简单,大家很容易就明白了。抖动的产生在按键按下和松开的两个边沿时刻,也叫下降沿(电平从高到低)和上升沿(电平从低到高)时刻,所以我们只需要在边沿时进行延时,等到按键输入已经稳定再进行信号读取即可,是不是很简单呢?
一般采用软件消抖时,会进行20ms的延时,示波器采集按键波形如图所示。
按键消抖预览

1.3 外部中断

单片机的外部中断通常是由GPIO的电平跳变引起的中断。在STM32中,每一个GPIO都可以作为外部中断的触发源,外部中断一共有16条线,对应着GPIO的0-15引脚,每一条外部中断都可以与任意一组的对应引脚相连,但不能重复使用。

例如,外部中断Line0可以和PA0,PB0,PC0等任意一条0号引脚相连,但如果已经和PA0相连,就不能同时和PB0,PC0其他引脚相连。大家在规划中断的时候要格外小心呦。

外部中断支持GPIO的三种电平跳变的模式,如下所示:

  • 上升沿中断:当GPIO的电平从低电平跳变成高电平时,引发外部中断。
  • 下降沿中断:当GPIO的电平从高电平跳变成低电平时,引发外部中断。
  • 上升沿和下降沿中断:当GPIO的电平从低电平跳变成高电平和从高电平跳变成低电平时,都能引发外部中断。

2 程序的学习

2.1 按键的外部中断在CubeMX里的配置

STM32的GPIO提供外部中断功能,当GPIO检测到电压跳变时,就会发出中断触发信号给STM32,使程序进入外部中断服务函数。
(今天的程序,我们可以在LED灯的基础之上完成)

  1. 将PA0号引脚设置为按键的输入引脚,将其设置为外部中断模式。
    PA0

  2. 接着点开GPIO标签页,对引脚进行如下设置,将GPIO模式设置为升降沿触发的外部中断,上下拉电阻设置为下拉电阻,最后设置用户标签为WK_UP。
    WK_UP

在NVIC标签页下,可以看到外部中断已经开启。
NVIC

  1. 点击“GENERATE CODE”生成代码

2.2 HAL_GPIO_ReadPin函数介绍

HAL库提供了读取引脚上的电平的函数HAL_GPIO_ReadPin。该函数说明如下:

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

此函数的返回参数为GPIO_PinState,如果是高电平则返回GPIO_PIN_SET(对应为1),如果是低电平则返回GPIO_PIN_RESET(对应为0);
该函数的作用在于返回引脚电平;
该函数具有两个参数:
(1)GPIOx——对应GPIO总线,其中x可以是A…I。例如,PH10,则输入GPIOH
(2)GPIO_Pin——对应引脚数。可以是0-15。例如,PH10,则输入GPIO_PIN_10

2.3 中断回调函数介绍

每当产生外部中断时,程序首先会进入外部中断服务函数。在stm32f4xx_it.c中,可以找到函数EXTI0_IRQHandler,它通过调用函数HAL_GPIO_EXTI_IRQHandler对中断类型进行判断,并对涉及中断的寄存器进行处理,在处理完成后,它将调用中断回调函数HAL_GPIO_EXTI_Callback,在中断回调函数中编写在此次中断中需要执行的功能。

2.4 程序中的前后台

在本次实验中,发现主循环和中断回调函数中都有代码。这是一个非常典型的以前后台模式组织的工程。但是,什么是前后台模式呢?我们可以想象一下一个餐厅的运作模式,餐厅往往分为前台的叫餐员和后台的大厨,前台只有在来了客人,或者后台做好了一道菜时才会工作,而后厨则一直在忙着做菜,只有前台来了新的单子或者已经有菜做好了才会停下一会手中的活。

在单片机中,中断就是前台,而循环就是后台,中断只在中断源产生时才会进行相应的处理,而循环则一直保持工作,只有被中断打断时才会暂停。前后台程序的异同可以参见下表:

前台程序后台程序
运行方式中断循环
处理的任务类型突发型任务重复型任务
任务的特点任务轻,要求响应及时任务重,稳定执行

编写前后台程序时,需要注意尽量避免在前台程序中执行过长或者过于耗时的代码,让前台程序能够尽快执行完毕,以保证其能够实时响应突发的事件,比较繁杂和耗时的任务一般放在后台程序中处理。
前后台模式可以帮助我们提高单片机的时间利用率,从而组织起比较复杂的工程。

2.5 程序流程

我们今天的程序中前后台任务各自承担的任务为:

  • 前台程序——记录按键翻转的状态rising_falling_flag
  • 后台程序——执行处理工作,根据记录的翻转状态进行按键状态的判断

在主循环中,首先通过边沿检测标志 rising_falling_flag 来判断按键是处于按下还是松开的边沿,如果是下降的边沿(rising_falling_flag == GPIO_PIN_RESET)则将LED灯熄灭,如果是如果是上升的边沿(rising_falling_flag == GPIO_PIN_SET)则将LED灯点亮。为了防止误触发,通过边沿检测的判断之后,程序还会再对电平进行一次读取,确认下降沿后跟随的是低电平或者上升沿后跟随的是高电平,如果不是则不切换LED状态。

在中断回调函数中,利用HAL_GPIO_ReadPin对rising_falling_flag进行赋值,从而判断触发中断的是上升沿还是下降沿。

使用exit_flag来实现主循环和中断回调函数之间的互斥,保证中断处理函数中的功能(判断上升/下降沿)只在主循环完成判断之后进行,或者主循环的判断只在中断处理函数运行(即检测到了一次上升沿或者下降沿)之后再进行。

最终main.c文件如下所示

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

//backgroud program
//后台程序
uint8_t exit_flag = 0;
uint8_t rising_falling_flag;

/**
  * @brief          exit callback function
  * @param[in]      GPIO_Pin:gpio pin
  * @retval         none
  */
/**
  * @brief          外部中断回调
  * @param[in]      GPIO_Pin:引脚号
  * @retval         none
  */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin == WK_UP_Pin)
    {
        if(exit_flag == 0)
        {
            exit_flag = 1;
            rising_falling_flag = HAL_GPIO_ReadPin(WK_UP_GPIO_Port, WK_UP_Pin);
        }
    }
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
	
	HAL_GPIO_WritePin( LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET );
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		
		//foreground program
        //前台程序
        if(exit_flag == 1)
        {
            exit_flag = 2;
            if(rising_falling_flag == GPIO_PIN_RESET)
            {
                //debouce
                //消抖
                HAL_Delay(20);
                if(HAL_GPIO_ReadPin(WK_UP_GPIO_Port, WK_UP_Pin) == GPIO_PIN_RESET)
                {
                    HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);
                    exit_flag = 0;
                }
                else
                {
                    exit_flag = 0;
                }
            }
            else if(rising_falling_flag == GPIO_PIN_SET)
            {
                //debouce
                //消抖
                HAL_Delay(20);
                if(HAL_GPIO_ReadPin(WK_UP_GPIO_Port, WK_UP_Pin) == GPIO_PIN_SET)
                {
                    HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);
                    exit_flag = 0;
                }
                else
                {
                    exit_flag = 0;
                }
            }

        }
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage 
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 6;
  RCC_OscInitStruct.PLL.PLLN = 168;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */

  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{ 
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

3 运行效果

一开始LED0为点亮状态,当按键按下时,红灯熄灭;当按键松开时,红灯点亮

代码我已经放到了我的GitHub仓库,如有需要可以下载使用:
CubeMX学习


总结

按键也是一种人机交互的操作,同时也可以设置成STM32的输入模式,可以用于设置某项功能的开启等作用。外部中断也是STM32中重要的中断类型,常常用于传感器的数据处理,例如陀螺仪,加速度计,磁力计的数据准备中断,通知stm32已经有新的传感器数据产生。
STM32CubeMX-HAL库-UART串口接收中断回调函数代码分析 阅读详情

相关推荐

Stm32CubeMx按键控制呼吸灯

Stm32CubeMx按键控制呼吸灯知识储备外部中断定时器Stm32CubeMx配置配置按键按键基础配置配置按键为触发外部中断并设置优先级配置TIM4的PWM配置PB8引脚功能为 TIM4 的 CH3 输出通道配置TIM4 输出 PWM 信号代码部分定义变量按键外部中断回调函数使能 TIM4 输出 PWM 信号while循环代码 知识储备 在这一次例程里面,按键控制需要用到外部中断,呼吸灯需要用到定时器 外部中断 在stm32中,每一个IO口经过配置都可以触发外部中断 stm32的芯片有16条中断线可供GP

weixin_44229981的博客 7331

STM32CubeMX学习三 之外部中断

如何使用STM32CubeMX配置外部中断。同时记录一下STM32CubeMX的学习笔记,同时分享给初学的小白,希望一起进步。

weixin_42648781的博客 9632

[STM32CubeMX]学习笔记2:GPIO按键外部中断控制LED状态

使用标准库实现本次功能的源代码已上传: https://github.com/yzmj0986/STM32_Std.lib_EXTI_KEY.git MCU:STM32F103ZET6 IDE: MDK-ARM V5 +STM32CubeMX5.0.0 本次实现的功能是通过按键的外部中断,来改变对应LED的状态,需要将按键的I/O端口映射到外部中断线上。 需要初始化的按键I/...

zytjasper的博客 4875

最详细STM32,cubeMX外部中断

实验开发板:STM32F103C8T6。所需软件:keil5 , cubeMX。实验目的:外部中断的意义,cubeMX配置和实现 等。下一篇文章为大家介绍如何不使用 cubeMX ,手动写一个外部中断的程序。

wuyiyu_的博客 5980

STM32CubeMX之外部中断检测按键

中断,是指处理机处理程序运行中出现的紧急事件的整个过程。程序运行过程中,系统外部、系统内部或者现行程序本身若出现紧急事件,处理机立即中止现行程序的运行,自动转入相应的处理程序(中断服务程序),待处理完后,再返回原来的程序运行,这整个过程称为程序中断。当处理机接受中断时,只需暂停一个或几个周期而不执行处理程序的中断,称为简单中断,中断又可分为屏蔽中断和非屏蔽中断两类。异常中断向量控制器, 简称 NVIC。

weixin_44453694的博客 3590

STM32CubeMX笔记(4)--外部中断,使用按键KEY检测

外部中断,使用按键KEY检测1、STM32CubeMX引脚设置和代码生成2、编写相关中断的C文件1.相关中断函数:2.相关中断函数的编写:3.相关中断的优先级顺序:3、编译工程文件,使用ST-Link烧录,测试按键的外部中断 1、STM32CubeMX引脚设置和代码生成 1.正点原子mini开发板KEY的电路图,正点原子mimi板的电路:WK_UP–PA0 KEY_0–PC5 KEY_1–PA15。根据电路图可以知道,需要将WK_UP的输入设置为上升沿触发,将KEY_0、KEY_0设置为下降沿触发。

杰尼君的博客 5159

STM32CubeMX教程4 EXTI 按键外部中断

使用STM32CubeMX软件配置STM32F407开发板通过用户按键产生外部中断,然后在中断中翻转绿色LED灯的状态

lc_guo的博客 4670

stm32外部中断

中断 中断概念程序中断是指在计算机执行现行程序的过场中,出现某些急需处理的异常情况或特殊请求,CPU暂停中断现行程序,而专区对这些异常情况或特殊情况进行处理,在处理完毕后CPU又自动返回到现行程序的断点处,继续执行原程序。 中断源,即引起中断的事件或原因,或发出中断申请的来源。 中断向量是中断服务程序的入口地址,在计算机中中断向量的地址存放一条跳转到中断服务程序的跳转指令。 目录 中断 1.stm32中断系统 2.外部中断介绍 3.外部中断程序设计思路 1)传统STM32外部中断设计步骤:

qq_62846920的博客 5263

STM32 HAL库 CubeMX教程(四)按键外部中断

STM32 HAL库 CubeMX教程(四)外部中断实验内容NVIC(嵌套向量中断控制器)外部中断简介CubeMX配置中断回调函数编写 实验内容 利用按键控制LED的亮灭? 实现方法: 按键扫描 外部中断 第二种方法较为常用,思路:按键按下会产生一个上升沿或者下降沿的触发脉冲,利用单片机的IO口检测输入脉冲,触发外部中断,控制LED动作。 NVIC(嵌套向量中断控制器) NVIC 是嵌套...

带火星的小木条的博客 1万+

STM32CUBEMX 使用教程3 — 外部中断(EXTI)的使用

单片机的外部中断(External Interrupts, EXTI)是 MCU 中很重要的功能之一,它允许单片机对外部事件做出快速响应。

weixin_43866583的博客 1473

【STM32基础 CubeMX】外部中断

当涉及到STM32基础的外部中断时,我们进入了一个引人入胜的领域,它允许微控制器与外部世界进行互动并实时响应各种事件。外部中断是STM32系列微控制器的一个强大功能,它允许我们在特定条件下中断当前的程序执行,以执行一些特殊的任务或处理来自外部世界的事件。在这个系列的教程中,我们将深入研究STM32外部中断的基础知识和应用。我们将探讨以下关键主题:1.什么是外部中断?我们会解释外部中断的概念以及它在嵌入式系统中的作用。

m0_62599305的博客 2807

STM32CubeMX-按键外部中断点灯

STM32CubeMX笔记-按键外部中断触发点灯

嵌入式学习记录站点 4338

基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器

这篇文章详细记录外部中断方式控制LED的亮灭以及蜂鸣器的开关;本文从原理图开始到最后实现功能,内容详细。本栏目的所有都是基于STM32F407ZET6芯片,博主采用的是普中的天马F407开发板。实现功能:LED0与LED1默认点亮,蜂鸣器默认关闭。按下按键KEY0,控LED0亮灭;按下按键KEY1,控制LED1亮灭;按下按键KEY2控制蜂鸣器开关。这篇博客很久以前就开了个头一直没有完善,虽然比较简单,但对中断的整个调用过程以及STM32CubeMX+Keil的配合使用流程做了详细阐述。

Edwinwzy的博客 7102

STM32G030C8T6:使用按键控制LED亮灭(外部中断)

STM32CubeMX是一款由STMicroelectronics开发的集成开发环境(IDE)工具,用于快速配置和生成基于STM32微控制器的项目。它提供了一个直观的图形界面,使开发人员能够轻松地进行微控制器的配置和初始化设置,包括引脚映射、时钟配置、外设配置等。以下是使用STM32CubeMX的一般步骤:下载和安装STM32CubeMX:你可以从STMicroelectronics的官方网站下载适用于你的操作系统的最新版本的STM32CubeMX,并按照安装向导进行安装。

AnChenliang_1002的博客 6349

STM32H743IIT6 外部中断(EXTI)配置教程 | STM32CubeMX实战

Product resivion选择 rev.V 再在Power Parameters中power regulator voltage scale中选择power regulator voltage scale0.机械按键需硬件消抖(并联电容)或软件消抖(在回调函数中添加延时或计数器)。按下连接 PA0 的按键,观察 LED 是否翻转(或执行其他预设动作)。输入框,输入目标频率(例如 480 MHz),按回车自动生成配置。函数(或其他对应的 EXTI 中断函数)。在 IDE 中点击编译按钮,确保无错误。

weixin_53619219的博客 2402

Axure原型模板与元件库APP交互设计素材(附资料)

在Axure中,手机模型是展示APP或小程序界面效果的重要工具。通过导入手机模型元件,设计师可以更加直观地模拟真实设备的显示效果,从而更准确地评估设计的可行性和用户体验。Axure官方及第三方资源库中提供了多种品牌和型号的手机模型,如iPhone、Android等,设计师可以根据项目需求选择合适的模型进行使用。Axure作为一款强大的原型设计工具,为APP和小程序的设计与开发提供了丰富的界面组件元件库和交互设计素材。

招风的黑耳优快云 1979

STM32 CubeMx HAL库外部中断检测按键,定时器延时消抖

STM32 CubeMx HAL库外部中断检测按键,定时器延时消抖

Joseph Wen的博客 1万+

基于Multisim设计电子密码锁

一、设计任务与要求:(可软件仿真实现)1)基本要求:设计一个数字密码锁,要求只有按正确的顺序,输入正确的密码,方能输出开锁信号,实现开锁。设置三个正确的密码键和若干个伪键,任何伪键按下后,密码锁都无法打开。每次只能接受四次按键信号,而且第四个键只能是“确定”或者“重输键”,其他无效。能显示已输入键的个数2)扩展要求:第一次密码输错后,可以输入第二次,但是连续三次输错,密码将被锁,必须按复位键才能解锁。

ablinger的博客 4415

STM32CubeMX 学习(6)外部中断实验

个人学习记录

Super辉sir的博客 3126

ConvNeXt 改进 :ConvNeXt添加GnConv递归门控卷积,二次创新CNBlock结构 ,独家首发

视觉 Transformer 在多种任务中取得了显著的成功,这得益于基于点积自注意力的新空间建模机制。视觉 Transformer 中的关键因素——即输入自适应、长距离和高阶空间交互——也可以通过卷积框架高效实现。作者提出了递归门控卷积(Recursive Gated Convolution,简称 gnConv),通过门控卷积和递归设计执行高阶空间交互。该新操作具有高度的灵活性和可定制性,兼容各种卷积变体,并将自注意力中的二阶交互扩展到任意阶数,而不会引入显著的额外计算。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 234

智能车图像处理19-进阶篇11--斜入十字补线

这篇文章主要讲述智能车竞赛中如何对于斜入十字进行补线操作。

taiyuezyh的博客 7478

【STM32】【STM32CubeMX】STM32CubeMX的使用之二:外部中断

前言   今天我们来学习STM32CubeMX中外部中断的使用,实现按下KEY0 KEY1 KEY2 中断-->IO-->按键映射:   EXTI2-->PE2-->KEY2   EXTI3-->PE3-->KEY1   EXTI4-->PE4-->KEY0 IO-->LED映射:   PB5-->LED0   PE5-->LED1 1、GPIO及RCC配置 2、NVIC设置 3、其他设置 时钟设置 按键消抖: if(HAL_

永远年轻 永远热泪盈眶 3185

openclaw中文版安装教程和常用命令

OpenClaw 中文版的和,涵盖本地一键部署、Docker 隔离部署、阿里云极速部署三种方式,以及六大类高频命令,方便你快速上手和日常运维。

suny8的专栏 2994
上一篇: STM32 CubeMX学习:5. 其他PWM设备
下一篇: STM32 CubeMX学习:7. ADC模数转化
北冥航
博客等级 码龄7年 232粉丝 13原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值