关于STM32复位的那些事

发布时间:2024-01-18  

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();//软件复位

 }


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
服务
平台入驻

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

原厂代理商合作

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

闲置物料合作

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

生态合作

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

加工与定制类服务商合作

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

线上代理合作

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

邮件营销及广告服务

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>