2015-11-23 136 views
0

我目前正在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引腳,然後向上。這很醜陋,但它現在起作用。我寧願用軟件來做這件事。

+1

你是否將nRST引腳從外部拉高?這可能會阻止整個系統重置。 –

+0

你是對的,由於路由錯誤,nRST引腳被外部拉高!我並不認爲nRST引腳是軟件復位的考慮因素,但我錯了,正如參考手冊中所述:「[Reset]源作用於NRST引腳,並且在延遲期間它始終保持低電平相」。 謝謝! – BigFatFlo

回答

1

Tony K在他的評論中是正確的,由於路由錯誤,nRST引腳確實被外部拉高。

與我的想法相反,即使在軟件復位時也要考慮nRST引腳:參考手冊中提到:「[Reset]源作用於NRST引腳,並且在延遲階段期間始終保持低電平」 ,所以我應該知道!

刪除上拉做的伎倆,NVIC_SystemReset()函數現在按預期工作!

非常感謝!