我们在嵌入式项目里面其实很少应用到复位,也只有在系统出现异常的情况下,我们才迫不得已使用复位,比如看门狗复位。其实,还有一种情况,我们需要手动复位一下系统——那就是我们的在线固件升级程序的触发。在这种情况下,我们就要用到了软件复位的操作。在Cortex-M3和Cortex-M4内核下的各系列MCU都是使用应用中断和复位控制寄存器(AIRCR)实现的。复位只与寄存器中的第2位,16~31位有关。下图是寄存器位的详细描述。
这里需要注意的是:
- 高16位是允许操作的key,读出时为0xFA05。在写入的时候必须为0x05FA,这样其余的位操作才会生效。
- bit1置位,系统复位生效。回读此位是零
写了这么多的原理性的东西,在我们项目应用的时候也没有啥用。其实,ARM的头文件里面已经为我们编写好了调用的API函数NVIC_SystemReset(),其在Core_cm3.h与Core_cm4.h文件中。
/**
\brief System Reset
\details Initiates a system reset request to reset the MCU.
*/
__NO_RETURN __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();
}
}
系统的软件复位就是调用一下这个小小的函数,复位之后,系统就干净了,也可以进入我们的固件更新程序了。