You are not allowed to add pages
Direct Link
Direct Link
/** \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的指令函数是为了确保内存操作访问的完成。
另一种方案是自己按照数据手册对寄存器的描述实现复位功能的函数。如果是自己写函数实现,建议也插入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 */ }