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
相关产品推荐
相关产品推荐

