我目前正在STM32F302VB上開發,我需要執行軟件重置。在我之前的所有項目中(使用STM32F427和STM32F030C8),我總是成功使用NVIC_SystemReset()函數。但由於某種原因,它不適用於此芯片。 實施是在CMSIS core_cm4.h和如下:NVIC_SystemReset()卡在while循環(STM32F302VB)
__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 */
}
函數被調用,所有的指令被執行,但它陷在while循環,並重置從未發生過。然後我必須通過JTAG將其重置,以使其脫離該狀態。
我檢查了編程手冊,實現看起來很好(不奇怪,因爲它在F4和F0上完美工作)。
我真的不知道問題可能是什麼,有人有一個想法是怎麼回事?
編輯:該函數仍然無法正常工作,但作爲解決方法,函數卡住後,我拉下nRST引腳,然後向上。這很醜陋,但它現在起作用。我寧願用軟件來做這件事。
你是否將nRST引腳從外部拉高?這可能會阻止整個系統重置。 –
你是對的,由於路由錯誤,nRST引腳被外部拉高!我並不認爲nRST引腳是軟件復位的考慮因素,但我錯了,正如參考手冊中所述:「[Reset]源作用於NRST引腳,並且在延遲期間它始終保持低電平相」。 謝謝! – BigFatFlo