STM32笔记——软件复位相关知识小记

1. 硬件复位

硬件复位如下图,直接将RESET引脚拉低即可,如下:
在这里插入图片描述

2. 软件复位

软件复位库函数:NVIC_SystemReset();

STM32F1XX系列中,复位函数在core_cm3.h文件中:

/**
 * @brief  Initiate a system reset request.
 *
 * Initiate a system reset request to reset the MCU
 */
static __INLINE void NVIC_SystemReset(void)
{
  SCB->AIRCR  = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      | 
                 (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | 
                 SCB_AIRCR_SYSRESETREQ_Msk);                   /* Keep priority group unchanged */
  __DSB();                                                     /* Ensure completion of memory access */              
  while(1);                                                    /* wait until reset */
}

STM32F4XX系列中,复位函数在core_cm4.h文件中:

/**
  \brief   System Reset
  \details Initiates a system reset request to reset the MCU.
 */
__STATIC_INLINE void NVIC_SystemReset(void)
{
  __DSB();                                                          /* Ensure all outstanding memory accesses included
                                                                       buffered write are completed before reset */
  SCB->AIRCR  = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos)    |
                           (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
                            SCB_AIRCR_SYSRESETREQ_Msk    );         /* Keep priority group unchanged */
  __DSB();                                                          /* Ensure completion of memory access */

  for(;;)                                                           /* wait until reset */
  {
    __NOP();
  }
}

在HAL库中又进行了封装,在stm32f4xx_hal_cortex.c中,调用上面和下面两个函数效果是一样的。

/**
  * @brief  Initiates a system reset request to reset the MCU.
  * @retval None
  */
void HAL_NVIC_SystemReset(void)
{
  /* System Reset */
  NVIC_SystemReset();
}

禁止可屏蔽中断库函数:__set_FAULTMASK(1);

参考网上一些博主说的,在调用复位函数和真正复位之间还有一段延迟,在这段时间单片机还是可以正常处理中断等程序的,为了避免这种情况,应该把相应的中断都屏蔽掉,这里会用到下面这个中断屏蔽相关的函数;
可以注意到这些函数名在M3和M4中都是一样的,M3中函数的定义在core_cm3.h中,如下:

/**
 * @brief  Set the Fault Mask value
 *
 * @param  faultMask  faultMask value
 *
 * Set the fault mask register
 */
static __INLINE void __set_FAULTMASK(uint32_t faultMask)
{
  register uint32_t __regFaultMask       __ASM("faultmask");
  __regFaultMask = (faultMask & 1);
}

在M3的权威指南中可以看到这个寄存器的功能就是禁止所有的可屏蔽中断,如下:
在这里插入图片描述

总结

所在一般如果需要软复位只要调用上面两个库函数即可:

/*
 *函数功能:STM32软复位函数
 */
 void Stm32_SoftReset(void)
 {
   __set_FAULTMASK(1);//禁止所有的可屏蔽中断
   NVIC_SystemReset();//软件复位
 }
STM32HAL软件复位函数是指在STM32单片机中使用HAL提供的函数进行软件复位操作。在STM32中,可以使用以下函数进行软复位操作: ```c void HAL_NVIC_SystemReset(void); ``` 该函数用于执行软件复位操作,它会将除了复位标志和备份区域寄存器以外的所有寄存器复位为它们的默认值。在调用该函数之前,可以使用`__set_FAULTMASK()`函数将所有可屏蔽中断屏蔽掉,以避免在复位过程中出现中断处理的问题。\[1\]\[2\] 需要注意的是,软件复位函数的执行过程中,单片机仍然可以正常处理中断等程序,为了避免这种情况,可以在调用复位函数之前将相应的中断屏蔽掉。\[2\] 总结来说,STM32HAL软件复位函数是用于执行软件复位操作的函数,可以将除了复位标志和备份区域寄存器以外的所有寄存器复位为它们的默认值。在调用复位函数之前,可以将相应的中断屏蔽掉以避免中断处理的问题。 #### 引用[.reference_title] - *1* *2* [STM32笔记——软件复位相关知识小记](https://blog.csdn.net/xiaopikadi/article/details/105469572)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [12.小白初学日记 STM32F429 HAL 复位和时钟控制](https://blog.csdn.net/whx_whx123/article/details/114686395)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值