有两种方法,一种是调用系统复位函数,另一种是跳到程序起点。

1.调用系统复位函数法:

void SoftReset(void)

{ __set_FAULTMASK(1); // 关闭所有中端

NVIC_SystemReset(); // 复位

}

总结,这种方法有时候会不起作用。所以,还是第2重方法比较好。

2跳转法

参考:STM32之系统重启

int boot_jump(u32 Map, u32 Reset)
{                
    __set_MSP(Map);
    ((void(*)())(Reset))();
}

void soft_reset_do(void)
{
    u32 addr = 0x08000000;//APP_ADDR0;

    u32 base = addr > NVIC_VectTab_FLASH ? NVIC_VectTab_FLASH:NVIC_VectTab_RAM;
    u32 offset = addr - base;

    NVIC_SetVectorTable(base, offset);
    
    u32 map = *((u32* )addr);
    u32 reset = *((u32*)(addr + 4));
    boot_jump(map,reset);
    //————————————————
    //版权声明:本文为CSDN博主「liliye」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    //原文链接:https://blog.csdn.net/liliye/article/details/46772457
}

物联沃分享整理
物联沃-IOTWORD物联网 » STM32软件复位方法详解

发表回复