#include "dev_backup.h" #include "stm32f10x.h" #include "board.h" // 备份结构体,一共32个字节 typedef struct{ uint32_t state;// 程序状态 uint32_t tick;// 运行时间 uint32_t reboot_type;// 复位类型 uint32_t reboot_curr;// 最后一次复位标志 void (*wdog_refresh)(void);// 刷新看门口 uint32_t reboot_times;// 软件重启次数 uint32_t boot_magic_number;// app校验boot是否为指定版本 }back_def; #define g_back ((back_def *)0x20000000) // 重启到app void bk_reboot_app(void) { g_back->reboot_type=REBOOT_APP_TO_APP; NVIC_SystemReset(); } // 重启到boot void bk_reboot_boot(void) { g_back->reboot_type=REBOOT_BOOT_TO_BOOT; NVIC_SystemReset(); } // 重启并升级 void bk_reboot_updata(void) { g_back->reboot_type=REBOOT_APP_TO_BOOT; NVIC_SystemReset(); } // 重启并引导到app void bk_reboot_guide(void) { g_back->reboot_type=REBOOT_BOOT_TO_APP; NVIC_SystemReset(); } // 断言失败重启 void bk_reboot_param_err(void) { g_back->reboot_type=REBOOT_PARAM_ERR; NVIC_SystemReset(); } // 硬件错误重启 void bk_reboot_hard_err(void) { g_back->reboot_type=REBOOT_HARD_ERR; NVIC_SystemReset(); } // 获取重启类型 uint32_t bk_get_boottype(void) { return g_back->reboot_type; } static int bk_soft_reboot(void); void bk_init(void) { g_back->reboot_curr=g_back->reboot_type; g_back->reboot_type=REBOOT_INIT; g_back->wdog_refresh=0; g_back->boot_magic_number=BOOT_MAGIC_NUM; // 每软件重启一次就增加计数 if(bk_soft_reboot()) { g_back->reboot_times++; }else{ g_back->reboot_times=0; } } typedef struct{ uint32_t type; const char *str; }reboot_type_str; static const reboot_type_str g_reboot_str[]={ {REBOOT_APP_TO_APP,"app restart",}, {REBOOT_APP_TO_BOOT,"app reboot to boot",}, {REBOOT_BOOT_TO_APP,"boot guide to app",}, {REBOOT_BOOT_TO_BOOT,"boot restart",}, {REBOOT_PARAM_ERR,"param err then reboot",}, {REBOOT_HARD_ERR,"hard err then reboot",}, {REBOOT_INIT,"watch dog died then reboot",}, }; // 获取最后一次复位原因 const char *bk_get_currtype(void) { uint32_t type=g_back->reboot_curr; for(int i=0;ireboot_curr; for(int i=0;ireboot_times; } void bk_set_wdog_fun(void (*fun)(void)) { g_back->wdog_refresh=fun; } void *bk_wdog_fun(void) { return g_back->wdog_refresh; } // 校验魔数,不对返回1 int bk_check_magic_num(void) { if(g_back->boot_magic_number!=BOOT_MAGIC_NUM){ return 1; } return 0; }