NVIC_CoreReset内核复位

2023-07-20

用这个方法向复位STM32 ((void (*) (void)) 0x08000000) ();不好用!

你的目的是想进行复基银位是吗?如果是的话使用两个库函数即可:
__set_FAULTMASK(1);
NVIC_SystemReset();
我的STM32是F103系列,即CPU内核为Cortex M3,这两个函数在core_cm3.h里面都有定义,
__set_FAULTMASK(1);是关闭所有中断的意思,目的是在执行NVIC_SystemReset();复位函数过程中不被中断所打断。
两个函数执行后系统搏差宴复位重新执行代码,包括之前所配置好的外设寄存器也庆山都回到复位状态。

如果你想要保持之前配置好的寄存器不变的话,那么你再程序跳转之前要先初始化堆栈,而且你程序跳转的地址不对,应该这样:
__set_MSP(*(__IO uint32_t*) 0x08000000); 要先初始化堆栈指针
((void (*) (void)) (*(vu32 *)0x08000004) (); 这句才是程序跳转,注意了,是(*(vu32 *)0x08000004

关于STM32软件复位,搞不定,求助一下

void bsp_systemreset(void)
{
__set_primask(1); /* 禁止全局中断 */
nvic_systemreset(); /* 产生系统复位 */
}

文章推荐

相关推荐