You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32使用NVIC_SystemReset时能否保留部分GPIO引脚不复位?

问题解答:STM32中NVIC_SystemReset能否保留部分GPIO引脚状态

直接给结论:不行。NVIC_SystemReset触发的是STM32的系统硬复位,会复位芯片内几乎所有外设(包括GPIO)的寄存器状态,没有办法单独豁免某几个GPIO引脚。

关于NVIC_SystemReset的内部实现(KEIL环境下)

在KEIL使用的CMSIS标准库中,这个函数的核心逻辑是操作系统控制块(SCB)的AIRCR寄存器,触发系统复位流程。你可以在对应内核的头文件(比如core_cm3.h、core_cm4.h)里找到源码,简化后大致是这样:

__STATIC_INLINE void NVIC_SystemReset(void)
{
  __DSB(); // 确保所有内存操作完成
  SCB->AIRCR  = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
                           (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
                           SCB_AIRCR_SYSRESETREQ_Msk);
  __DSB();
  while(1); // 等待复位执行
}

这里的SCB_AIRCR_SYSRESETREQ位触发的是全局系统复位,覆盖范围包括所有GPIO端口的模式、电平配置寄存器,所有外设都会恢复到上电复位后的默认状态。

如果你需要保留部分引脚状态的替代方案

如果业务场景需要某些引脚保持原有状态,不能用系统复位,得换思路:

  • 仅复位指定外设:不要触发全局复位,而是针对需要重启的外设单独复位。比如GPIO外设可以通过RCC寄存器里的复位位(比如RCC->AHB1RSTR)单独复位,其他外设同理。
  • 利用备份域恢复状态:STM32的备份域(包括备份寄存器、RTC等)不受系统复位影响。你可以在复位前把GPIO的关键配置(比如电平、模式)写入备份寄存器,复位完成后在初始化代码里读取这些值,重新配置对应GPIO,快速恢复到之前的状态。
  • 硬件层面的保持:如果是引脚电平需要保持,可考虑在外部电路加锁存器,但这属于硬件设计范畴,和芯片复位无关。

内容的提问来源于stack exchange,提问作者Mehmet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:15:33