Arm NVIC_SystemReset()卡在while循环中(STM32F302VB)

Arm NVIC_SystemReset()卡在while循环中(STM32F302VB),arm,embedded,stm32,Arm,Embedded,Stm32,我目前正在开发STM32F302VB,需要执行软件重置。在我以前的所有项目(使用STM32F427和STM32F030C8)中,我始终成功地使用了NVIC_SystemReset()函数。但由于某种原因,它不能与这个芯片一起工作。 该实现在CMSIS core_cm4.h中,如下所示: __STATIC_INLINE void NVIC_SystemReset(void) { __DSB(); /* Ensure all outstanding memory accesses include

我目前正在开发STM32F302VB,需要执行软件重置。在我以前的所有项目(使用STM32F427和STM32F030C8)中,我始终成功地使用了NVIC_SystemReset()函数。但由于某种原因,它不能与这个芯片一起工作。 该实现在CMSIS core_cm4.h中,如下所示:

__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 */
}
\uuuu静态\uu内联无效NVIC\u系统重置(无效)
{
__DSB();/*确保在重置之前完成所有未完成的内存访问(包括缓冲写入)*/
SCB->机组=(0x5FA机组和SCB\u机组\u PRIGOUP\Msk)|
SCB_机组_SYSRESETREQ_Msk);/*保持优先级组不变*/
__DSB();/*确保完成内存访问*/
while(1);/*等待重置*/
}
函数被调用,所有指令都被执行,但它卡在while循环中,并且重置从未发生。然后我必须通过JTAG将其重置,以使其脱离该状态

我查看了编程手册,实现似乎很好(这并不奇怪,因为它在F4和F0上工作得很好)

我真的不知道问题出在哪里,有人知道发生了什么吗


编辑:该功能仍然不工作,但作为一种解决方法,在该功能卡住后,我将nRST引脚向下拉,然后向上拉。这很难看,但现在还管用。不过,我更愿意用软件来完成这一切。

托尼·K的评论是正确的,因为一个布线错误,nRST引脚确实被从外部拉高了

与我的想法相反,即使在软件重置中也会考虑nRST引脚:参考手册中说:“[重置]源作用于nRST引脚,并且在延迟阶段它总是保持低”,所以我应该知道

移除上拉按钮就成功了,NVIC_SystemReset()函数现在可以正常工作了


多谢各位

您是否将nRST销从外部拉高?这可能会阻止整个系统重置。没错,由于布线错误,nRST引脚被从外部拉高!我不认为软件重置时考虑了nRST引脚,但我错了,正如参考手册中所说:“[重置]源作用于nRST引脚,并且在延迟阶段始终保持较低”。谢谢