2015-11-23 138 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()函数现在按预期工作!

非常感谢!