STM32軟件復(fù)位(基于庫(kù)文件V3.5)
void SoftReset(void)
{
__set_FAULTMASK(1); // 關(guān)閉所有中端
NVIC_SystemReset();// 復(fù)位
}
在官方軟件庫(kù)的 core_cm3.h 文件里 直接提供了 系統(tǒng)復(fù)位的函數(shù)
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 */
}
但是不是直接調(diào)用這個(gè)函數(shù)就OK了?
在Cortex-M3權(quán)威指南中有這么一句話
這里有一個(gè)要注意的問題:從SYSRESETREQ 被置為有效,到復(fù)位發(fā)生器執(zhí)行復(fù)位命令,
往往會(huì)有一個(gè)延時(shí)。在此延時(shí)期間,處理器仍然可以響應(yīng)中斷請(qǐng)求。但我們的本意往往是要
讓此次執(zhí)行到此為止,不要再做任何其它事情了。所以,最好在發(fā)出復(fù)位請(qǐng)求前,先把
FAULTMASK 置位。
所以最好在將FAULTMASK 置位才萬無一失。
同樣官方 core_cm3.h 文件里也直接提供了該函數(shù)
static __INLINE void __set_FAULTMASK(uint32_t faultMask)
{
register uint32_t __regFaultMask __ASM(faultmask);
__regFaultMask = (faultMask 1);
}
評(píng)論