Files
checker_slave/source/dev/dev_backup.c
ranchuan ddeec88a89 使用make -f Makeboot 来使用gcc编译
添加 DMod_FireBusReadDatasV2_RC 函数
2023-11-01 18:10:35 +08:00

160 lines
2.8 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;i<LENGTH(g_reboot_str);i++)
{
if(type==g_reboot_str[i].type)
return g_reboot_str[i].str;
}
return "poweron then started";
}
// 非上电启动返回1
static int bk_soft_reboot(void)
{
uint32_t type=g_back->reboot_curr;
for(int i=0;i<LENGTH(g_reboot_str);i++)
{
if(type==g_reboot_str[i].type)
return 1;
}
return 0;
}
// 重启次数
uint32_t bk_reboot_times(void)
{
return g_back->reboot_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;
}