User Tools

Site Tools


Sidebar

Go Back

Refresh

You are not allowed to add pages

Direct Link

library:nodic:softwarereset

Table of Contents

System Reset

Headline

/** \brief System Reset
 
The function 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 = ((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 */
}

这里主要说下DSB(), DSB(Data Synchronization Barrier.)这里插入DSB的指令函数是为了确保内存操作访问的完成。

Headline

另一种方案是自己按照数据手册对寄存器的描述实现复位功能的函数。如果是自己写函数实现,建议也插入DSB指令函数确保内存访问安全。

#define SCB_AIRCR_VECTKEY_SHIFT 16
 
#define SCB_AIRCR_PRIGROUP_MASK 0x700u
 
#define SCB_AIRCR_SYSRESETREQ_MASK 0x4u
 
void System_vReset(void)
{
 
    __DSB();/* Ensure all outstanding memory accesses included
 
    buffered write are completed before reset */
 
    SCB_AIRCR = ( (0x5FA << SCB_AIRCR_VECTKEY_SHIFT) |
 
    SCB_AIRCR_PRIGROUP_MASK |
 
    SCB_AIRCR_SYSRESETREQ_MASK);
 
    __DSB(); /* Ensure completion of memory access */
 
    while(1); /* wait until reset */
 
}
library/nodic/softwarereset.txt · Last modified: 2022/05/02 00:32 (external edit)