我目前正在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