Arm NVIC_SystemReset()卡在while循环中(STM32F302VB)
我目前正在开发STM32F302VB,需要执行软件重置。在我以前的所有项目(使用STM32F427和STM32F030C8)中,我始终成功地使用了NVIC_SystemReset()函数。但由于某种原因,它不能与这个芯片一起工作。 该实现在CMSIS core_cm4.h中,如下所示: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
__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引脚,并且在延迟阶段始终保持较低”。谢谢