STM32 低功耗模式详解

目录

一、什么是低功耗

二、低功耗的核心思想

三、STM32的3种低功耗模式

1、睡眠模式 (Sleep Mode)

2、停止模式 (Stop Mode)

3、 待机模式 (Standby Mode)

四、相关电源管理寄存器

1、PWR_CR (Power Control Register, 电源控制寄存器)

2、PWR_CSR (Power Control/Status Register, 电源控制/状态寄存器)

五、其他降低功耗

1. 降低系统时钟频率

代码示例

2. 关闭未用的外设时钟

代码示例

六、FreeRTOS低功耗Tickless模式

1、FreeRTOS低功耗Tickless模式简介

2、工作原理

3、FreeRTOS 低功耗 Tickless 模式相关配置项

小结


一、什么是低功耗

低功耗指的是在系统设计中通过硬件和软件优化,使设备在执行任务时尽量减少能量消耗。特别是在嵌入式系统、物联网设备和电池供电的设备中,低功耗设计至关重要,因为它可以延长设备的工作时间,减少频繁充电或更换电池的需求。

二、低功耗的核心思想

1、减少不必要的资源消耗:尽量关闭不必要的模块或外设,减少芯片功耗。

2、降低工作频率和电压:通过降低系统的工作频率和电压来减少功耗。

3、进入低功耗模式:大多数微控制器(如STM32)有多种低功耗模式,可以根据需求选择不同的低功耗模式。

三、STM32的3种低功耗模式

STM32的这三种低功耗模式主要针对不同的功耗和性能需求,逐级降低功耗:

1、睡眠模式 (Sleep Mode)

特点:内核(CPU)停止运行,但系统时钟 (Systick) 和一些外设(如NVIC)仍然可以工作。这种模式非常适合短时间的休眠。

功耗优势:因为外设仍在运行,所以可以保持较快的响应时间,但功耗相对较高。

应用场景:适用于短暂的休眠,比如等待外设数据,或在周期性任务之间短暂进入低功耗状态。

进入方式:设置 __WFI(Wait For Interrupt,指令让 CPU 暂停执行,直到有中断发生,适合在等待特定中断事件时使用。它能在没有中断时节省功耗,并在中断发生时自动唤醒 CPU)或 __WFE(Wait For Event,指令让 CPU 暂停执行,直到有“事件”或中断发生,可以等待外设、系统事件或中断。在没有中断的情况下,也可以通过事件(比如唤醒事件)使 CPU 唤醒。)指令进入睡眠模式。

唤醒方式:任何中断都可以唤醒 CPU 并恢复正常工作。

// 使能睡眠模式
HAL_SuspendTick();  // 暂停Systick中断(可选)
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
// 唤醒后
HAL_ResumeTick();   // 恢复Systick中断

2、停止模式 (Stop Mode)

特点:系统时钟停止,1.8V内核电源继续工作,PLL(锁相环,关闭后,系统失去倍频效果)、HIS(高速内部振荡器,内部时钟源,不再为CPU和外设提供高速时钟)和HSE RC(高速外部振荡器,用于系统时钟的基准源,失去高精度的时钟源)振荡器关闭,寄存器和SRAM数据保留。只有低速时钟 (LSI或LSE) 可以工作,允许使用低功耗的外部中断来唤醒。

功耗优势:停止模式大大降低了功耗,因为大部分时钟已经关闭,但数据仍然保留,适合较长时间的低功耗状态。

应用场景:适合在处理任务后进入低功耗状态,等待外部事件或定时器唤醒。典型应用包括长时间采集数据的传感器设备。

进入方式:调用 HAL_PWR_EnterSTOPMode,停止模式下,主调节器仍然供电,内存保持数据。

唤醒方式:通过外部中断(如 RTC、GPIO 中断)唤醒。

注:为了进入停止模式,所有的外部中断的请求位(挂起寄存器(EXTI_PR))和RTC的闹钟标志都必须被清除,否则停止模式的进入流程将会被跳过,程序继续运行。

// 进入停止模式
HAL_SuspendTick();  // 暂停Systick中断(可选)
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
// 唤醒后,重新配置系统时钟
SystemClock_Config();  // 根据具体项目需要配置系统时钟
HAL_ResumeTick();   // 恢复Systick中断

3、 待机模式 (Standby Mode)

特点:内核电源关闭,所有寄存器和SRAM内容丢失,仅保留备份寄存器和待机电路供电。种模式能够实现最低功耗,适用于极限低功耗场景。

功耗优势:待机模式实现了最低功耗,但所有数据(除备份寄存器)都会丢失,重新唤醒后需要重新初始化。

应用场景:适合在设备长时间不使用时进入待机,比如按键唤醒的电池供电设备,或极低频次使用的物联网传感器节点。

进入方式:调用 HAL_PWR_EnterSTANDBYMode,进入待机模式,关闭所有电源,仅保留RTC或待机引脚。

唤醒方式:通过唤醒引脚(如 WKUP)、RTC 警报或重启(上电复位或IWDG复位等)。

注:待机模式下,所有I/O引脚处于高阻态,除了复位引脚、被使能的唤醒引脚等

待机模式下,不能下载程序,必须退出待机模式才能下载

// 清除唤醒标志,确保顺利进入待机模式
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
// 进入待机模式
HAL_PWR_EnterSTANDBYMode();
// 唤醒后将从复位开始

这三种模式适用于不同的应用场景,具体选择取决于功耗、响应时间以及数据保留需求。

根据最低电源消耗,最快启动时间和可用的唤醒源等条件,选择一种最佳的低功耗模式

四、相关电源管理寄存器

PWR_CRPWR_CSR 是 STM32 中的两个电源管理寄存器,用于配置和监视低功耗状态。

1、PWR_CR (Power Control Register, 电源控制寄存器)

作用:用于配置 STM32 的低功耗模式。设置PDDS位进入深度睡眠时进入待机模式。设置CWUF位,清除之前的WUF唤醒位。

LPDS (Low-Power Deep Sleep):在深度睡眠模式下启用低功耗调节器,减少功耗。

PDDS (Power Down Deep Sleep):当设置为 1 时,进入待机模式 (Standby Mode);否则进入停止模式 (Stop Mode)。

CWUF (Clear Wakeup Flag):写 1 来清除唤醒标志 (WUF),用于防止错误唤醒。

CSBF (Clear Standby Flag):写 1 来清除待机标志 (SBF)。

VOS (Voltage Scaling):控制电压缩放,可以通过降低工作电压进一步节省功耗。

通过设置 PWR_CR 中的这些位,用户可以控制进入哪种低功耗模式(如停止模式、待机模式),同时调节系统的电压和深度睡眠状态。

2、PWR_CSR (Power Control/Status Register, 电源控制/状态寄存器)

作用:用于监测电源状态和低功耗唤醒标志。 设置EWUP,使能WKUP引脚用于待机模式唤醒。WUF唤醒标志,用来判断是否发生唤醒事件。

WUF (Wakeup Flag):当有唤醒事件发生时,该位被置 1,用于指示是否有唤醒源。

SBF (Standby Flag):当进入待机模式时,该位被置 1,表示系统已经进入过待机状态。

EWUP (Enable Wakeup Pin):使能唤醒引脚,允许从待机模式中通过外部引脚唤醒。

PWR_CSR 用于监控进入低功耗模式后的状态和唤醒标志,通过读取 WUFSBF 标志,用户可以判断系统是否因为某个事件唤醒,或是否处于待机状态。

五、其他降低功耗

在 STM32 中降低运行模式下的功耗,主要通过降低系统时钟频率和关闭未使用的外设时钟来实现。这种方式适用于系统运行中不能进入低功耗模式的情况,例如执行任务时,希望减少功耗而又保持一定的功能性。

1. 降低系统时钟频率

通过降低系统的主频,系统的功耗会大幅降低。STM32 的系统时钟可以通过修改配置来降低频率,如降低 AHB 总线和 APB 总线的时钟频率。

代码示例

以下代码降低系统时钟频率到指定值,可以在初始化时或在运行时动态调整:

void SystemClock_Config_LowPower(void) {
    RCC_ClkInitTypeDef clkInitStruct = {0};
    RCC_OscInitTypeDef oscInitStruct = {0};

    // 配置振荡器设置
    oscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
    oscInitStruct.HSIState = RCC_HSI_ON;
    oscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
    oscInitStruct.PLL.PLLState = RCC_PLL_ON;
    oscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
    oscInitStruct.PLL.PLLM = 16;
    oscInitStruct.PLL.PLLN = 100;  // 调整这个值来改变频率
    oscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
    oscInitStruct.PLL.PLLQ = 4;
    HAL_RCC_OscConfig(&oscInitStruct);

    // 配置系统时钟分频器
    clkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK |
                              RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
    clkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    clkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV2; // 降低 AHB 时钟
    clkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;  // 降低 APB1 时钟
    clkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;  // 降低 APB2 时钟
    HAL_RCC_ClockConfig(&clkInitStruct, FLASH_LATENCY_3);
}

在需要更低功耗的状态下,可以使用更低的分频值。在恢复正常工作时,可以重新设置更高的频率。

2. 关闭未用的外设时钟

STM32 的外设是通过 AHBAPB 总线时钟驱动的,未使用的外设时钟可以禁用,以进一步节省功耗。我们可以通过重置 RCC 寄存器的相关位来实现禁用未用外设。

代码示例

以下示例展示了如何禁用某些未使用的外设时钟,以减少功耗:

void DisableUnusedPeripheralClocks(void) {
    // 禁用 APB1 外设时钟
    __HAL_RCC_UART4_CLK_DISABLE();
    __HAL_RCC_UART5_CLK_DISABLE();
    __HAL_RCC_I2C3_CLK_DISABLE();
    __HAL_RCC_CAN1_CLK_DISABLE();
    __HAL_RCC_PWR_CLK_DISABLE();

    // 禁用 APB2 外设时钟
    __HAL_RCC_SPI1_CLK_DISABLE();
    __HAL_RCC_SDIO_CLK_DISABLE();
    __HAL_RCC_ADC1_CLK_DISABLE();

    // 禁用 AHB 外设时钟
    __HAL_RCC_DMA1_CLK_DISABLE();
    __HAL_RCC_DMA2_CLK_DISABLE();
    __HAL_RCC_CRC_CLK_DISABLE();
}

此函数可以在初始化时调用,关闭系统中不使用的外设。需要时也可以通过重新使能的方式开启外设时钟。例如,在 SPI 需要使用时可以调用 __HAL_RCC_SPI1_CLK_ENABLE() 恢复其时钟。

六、FreeRTOS低功耗Tickless模式

FreeRTOS的Tickless模式是一种减少系统功耗的机制。通常,FreeRTOS会以固定时间间隔(“Tick”)触发时钟中断,用于任务调度和系统计时。但这种频繁的中断在低功耗需求场景下会导致系统资源的浪费。Tickless模式通过在空闲时段停用Tick中断,大幅降低功耗,是常用的低功耗设计。Tickless低功耗模式的本质是通过调用指令 WFI 实现睡眠模式。

1、FreeRTOS低功耗Tickless模式简介

任务运行时间统计实验中,可以看出,在整个系统的运行过程中,其实大部分时间是在执行空闲任务(系统中的所有其它任务都阻塞或被挂起时才运行的)。

Tickless模式的核心思想是,当系统进入空闲状态并不需要频繁调度时,停止或减少时钟中断,使系统进入更深的低功耗模式。系统会根据需要再次唤醒,然后恢复时钟计数,这样可以避免因频繁的时钟中断唤醒而浪费功耗。

判断执行在vTaskStartScheduler()函数中,具体如下:

/* 此条件编译检查应使用不等于0的判断,而不是等于1。
 * 这样可以确保当用户定义的低功耗模式实现需要 configUSE_TICKLESS_IDLE 
 * 设置为除1以外的值时,依然能够调用 portSUPPRESS_TICKS_AND_SLEEP()。
 */
#if ( configUSE_TICKLESS_IDLE != 0 )
    {
        TickType_t xExpectedIdleTime;

        /* 不希望在空闲任务的每次循环中暂停并恢复调度器。
         * 因此,首先在调度器未暂停的情况下对预计空闲时间进行初步测试。
         * 此处的结果不一定有效,仅为初步估计。
         */
        xExpectedIdleTime = prvGetExpectedIdleTime();  // 获取下一个任务解锁的时间,即进入低功耗模式的预计空闲时间

        /* 如果预计空闲时间大于等于设定的最小空闲时间,则进入低功耗模式 */
        if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP )
        {
            vTaskSuspendAll();  // 暂停调度器,防止在配置低功耗模式时发生任务切换
            {
                /* 现在调度器已暂停,可以重新获取准确的预计空闲时间 */
                configASSERT( xNextTaskUnblockTime >= xTickCount );  // 断言确保下一任务的解锁时间不早于当前Tick计数
                xExpectedIdleTime = prvGetExpectedIdleTime();  // 重新获取准确的预计空闲时间

                /* 定义以下宏以在应用程序不需要调用 portSUPPRESS_TICKS_AND_SLEEP()
                 * 时将 xExpectedIdleTime 设为0。
                 */
                configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( xExpectedIdleTime );  // 用户自定义处理:可以在此进一步优化低功耗逻辑

                /* 如果 xExpectedIdleTime 仍大于等于设定值,则进入低功耗模式 */
                if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP )
                {
                    traceLOW_POWER_IDLE_BEGIN();  // 跟踪低功耗状态开始,供调试或分析用
                    portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime );  // 进入低功耗模式,抑制Tick中断
                    traceLOW_POWER_IDLE_END();  // 跟踪低功耗状态结束
                }
                else
                {
                    mtCOVERAGE_TEST_MARKER();  // 覆盖率测试标记,供测试覆盖率分析工具使用
                }
            }
            ( void ) xTaskResumeAll();  // 恢复任务调度器
        }
        else
        {
            mtCOVERAGE_TEST_MARKER();  // 覆盖率测试标记,供测试覆盖率分析工具使用
        }
    }
#endif /* configUSE_TICKLESS_IDLE */
2、工作原理
  1. 判断空闲时间:当系统发现没有就绪任务,并进入空闲任务(Idle Task)时,FreeRTOS会评估空闲时间的长短。
  2. 关闭时钟中断:如果空闲时间足够长,则禁用Tick中断,让系统进入深度低功耗状态。
  3. 恢复运行状态:当预定的唤醒时间或某个事件发生时(如外部中断、定时器溢出等),系统唤醒并重新使能Tick中断。
  4. 调整Tick计数:系统恢复时,通过记录的休眠时间来调整Tick计数器,以保证时间精度。

Tickless模式常用于电池供电的物联网设备和嵌入式系统中,以延长电池寿命和降低系统功耗。

3、FreeRTOS 低功耗 Tickless 模式相关配置项

FreeRTOS 提供了一些配置项,用于设置和控制Tickless模式。这些配置项需要FreeRTOSConfig.h 中进行设置。

  1. configUSE_TICKLESS_IDLE:启用Tickless模式的总开关设置

    #define configUSE_TICKLESS_IDLE 1
    
  2. configEXPECTED_IDLE_TIME_BEFORE_SLEEP:配置空闲时间的最小长度,只有超过此时长系统才会进入Tickless模式。这可以避免过于频繁地进入和退出低功耗模式

    xExpectedIdleTime = prvGetExpectedIdleTime();
    
  3. configPRE_SLEEP_PROCESSING:进入Tickless模式前的处理回调函数。可以在这个宏中定义进入低功耗模式前的操作(如关闭外设、降低电压等)

    #define configPRE_SLEEP_PROCESSING( xModifiableIdleTime ) myPreSleepFunction( xModifiableIdleTime )
    
  4. configPOST_SLEEP_PROCESSING:从低功耗模式中唤醒后的处理回调函数。用于恢复低功耗模式前关闭的外设、恢复系统时钟等。

    #define configPOST_SLEEP_PROCESSING( xExpectedIdleTime ) myPostSleepFunction( xExpectedIdleTime )
    
  5. configTICK_RATE_HZ:设定Tick的频率(即每秒的中断次数),对于低功耗应用,Tickless模式会减少系统实际的Tick中断频率,以降低功耗

    #define configTICK_RATE_HZ 1000
    

    小结

FreeRTOS的Tickless模式通过减少系统Tick中断的频率,在空闲时段进入低功耗模式,有效减少系统整体功耗。通过合理配置 configUSE_TICKLESS_IDLEconfigEXPECTED_IDLE_TIME_BEFORE_SLEEP 以及低功耗前后的处理函数,系统可以在满足实际应用需求的同时,实现尽可能低的功耗。

 参考资料:

66,PWR-低功耗模式原理和配置讲解_哔哩哔哩_bilibili

第59讲 Tickless低功耗模式实战编程_哔哩哔哩_bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/916273.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数位DP学习

数位 DP - OI Wiki 引入 主要变量及函数 变量: L, R: 所求区间边界 limit:边界限制,主要在记忆化搜索里用 len:所求数的位数 pos:当前所求位置 lead: 前导零 DP[N][M] :第一维是当前的pos&…

WP网站如何增加文章/页面的自定义模板

通过Wordpress我们后台在发布文章或者页面的时候其实可以看到有些主题 他有选择使用的页面模板,可以自定义模板,但是有些主题却没有选择主题这个功能,那这个自定义模板的功能是如何实现的呢?以下分两种情况:Page页面和…

Python学习从0到1 day27 Python 高阶技巧 ③ 设计模式 — 单例模式

此去经年,再难同游 —— 24.11.11 一、什么是设计模式 设计模式是一种编程套路,可以极大的方便程序的开发最常见、最经典的设计模式,就是我们所学习的面向对象了。 除了面向对象外,在编程中也有很多既定的套路可以方便开发,我们称之为设计模…

DAY112代码审计PHP开发框架POP链利用Yii反序列化POP利用链

一、pop1链的跟踪 1、路由关系 2、漏洞触发口unserialize(base64_decode($data)); 2、__destruct(),魔术法方法调用close函数方法 3、未找到利用链,尝试__call魔术方法 4、逆推找call_user_func 函数 第一部分 namespace yii\db; class BatchQueryResu…

Flink新版Source接口源码解析

目录 1. 前言 2. Source解析 2.1 Source类图 2.2 接口和方法说明 2.2.1 Source,> 3. SplitEnumerator解析 3.1 SplitEnumetator类图 3.2 类和方法说明 3.2.1 SplitEnumerator 3.2.2 SimpleVersionedSerializer 4. SourceReader解析 4.1 SourceReader类图 4.2 类…

SpringBoot后端解决跨域问题

1.全局方式 新建一个conifg配置类,内容如下: Configuration public class CorsConfig implements WebMvcConfigurer {Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**")//是否发送Cookie.allowCrede…

qt QUndoCommand 与 QUndoStack详解

1、概述 QUndoCommand 和 QUndoStack 是 Qt 框架中用于实现撤销/重做(undo/redo)功能的两个核心类。QUndoCommand 是表示单个可撤销操作的基类,而 QUndoStack 则负责管理这些命令的堆栈,提供撤销和重做操作的接口。 QUndoCommand…

Struts源码阅读——三个常用的辅助类DispatchAction

Struts源码阅读——三个常用的辅助类 紧接前文,我们来阅读org.apache.struts.actions包中三个常用类的源码。 DispatchAction、LookupDispatchAction 和 MappingDispatchAction 是 Struts 1 框架中的三个常用的辅助类,用来简化 Action 类中的请求分发。…

C++中的栈(Stack)和堆(Heap)

在C中,堆(heap)和栈(stack)是两种用于存储数据的内存区域。理解它们的原理和区别,对于优化代码性能和确保代码的安全性至关重要。以下是对C中堆栈的详细解析,包括它们的分配方式、优缺点、应用场…

群控系统服务端开发模式-应用开发-前端登录接口开发

一、修改验证方法 1、修改验证器 loginRules: {username: [{required: true, trigger: blur, validator: validateUsername}],password: [{required: true, trigger: blur, validator: validatePassword}],captcha_code: [{required: true, trigger: blur, validator: validat…

游戏引擎学习第10天

视频参考:https://www.bilibili.com/video/BV1LyU3YpEam/ 介绍intel architecture reference manual 地址:https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html RDTS(读取时间戳计数器)指令是 x86/x86_64 架构中的…

MySQL查询某个数据库中特定表的空间占用大小

如果您也想要查询某个数据库中特定表的空间占用大小,包括数据和索引的大小,那么您可以使用以下SQL查询。这个查询将显示特定表在数据库中的数据大小、索引大小以及总大小。 SELECT table_name AS Table,ROUND(((data_length index_length) / 1024 / 10…

SystemVerilog学习笔记(十一):接口

在Verilog中,模块之间的通信是使用模块端口指定的。 Verilog模块连接的缺点 声明必须在多个模块中重复。存在声明不匹配的风险。设计规格的更改可能需要修改多个模块。 接口 SystemVerilog引入了 interface 结构,它封装了模块之间的通信。一个 inter…

el-input 正则表达式校验输入框不能输入汉字

<el-form :model"data1" :rules"rules" ref"ruleForm" label-width"210px" class"demo-ruleForm"><el-form-item label"锯路&#xff1a;" prop"sawKref"><el-input class"inptWid…

Pikachu[暴力破解:token防爆破]

暴力破解:token防爆破 校验方式&#xff1a; 请求中添加token防止爆破&#xff0c;登录时需携带服务器上一次加载时发送的token进行校验 解决&#xff1a; burp--intruder模块设置中使用Grep-Extract功能提取页面中的token&#xff0c;并将载荷类型更改为递归查询[Recursiv…

Springboot如何打包部署服务器

文章目的&#xff1a;java项目打包成jar包或war包&#xff0c; 放在服务器上去运行 一、编写打包配置 1. pom.xml 在项目中的pom.xml文件里面修改<build>...</build>的代码 >> 简单打包成Jar形式&#xff0c;参考示例&#xff1a; <build><fina…

flink 同步oracle11g数据表到pg库

1. 关闭防火墙和selinux systemctl stop firewalld systemctl disable firewalld systemctl status firewalldvi /etc/selinux/config 修改为disabled2.安装java8 yum list java-1.8* yum install java-1.8.0-openjdk* -yjava -version3.下载和部署postgresql 看需求安装pg库…

机器学习: LightGBM模型(优化版)——高效且强大的树形模型

LightGBM&#xff08;Light Gradient Boosting Machine&#xff09;是一种基于梯度提升决策树&#xff08;GBDT&#xff09;的框架&#xff0c;由微软提出。它具有高效的训练速度、低内存占用、支持并行和GPU加速等特点&#xff0c;非常适合大规模数据的训练任务&#xff0c;尤…

mysql中的EXISTS和NOT EXISTS使用详解

本文来编写一个实例说下mysql中的EXISTS和NOT EXISTS使用详解 文章目录 exists用法SQL中in, not in, exists, not exists的区别使用实例本文小结 exists用法 exists: 如果括号内子查询语句返回结果不为空&#xff0c;说明where条件成立&#xff0c;就会执行主SQL语句。如果括号…

idea 弹窗 delete remote branch origin/develop-deploy

想删除远程分支&#xff0c;就选delete&#xff0c;仅想删除本地分支&#xff0c;选cancel&#xff1b; 在 IntelliJ IDEA 中遇到弹窗提示删除远程分支 origin/develop-deploy&#xff0c;这通常是在 Git 操作过程中出现的情况&#xff0c;可能是在执行如 git branch -d 或其他…