stm32实现出厂设置和恢复出厂设置
所有变量保存在 ADDR_FLASH_RxCanBuff 这个 FLASH 地址上面
启动时 从 ADDR_FLASH_RxCanBuff 读取输出存到 MBuff 变量
将 各种变量指向 MBuff 的成员
判断 Initial 为 0xFF 时就初始化变量并保存
这样只需要控制 Initial 就能 实现初始化出厂配置
//掉电缓存扇区
//#define ADDR_FLASH_SECTOR_7_BANK1 ((uint32_t)0x080E0000) //扇区0起始地址, 128 Kbytes 7
#define ADDR_FLASH_RxCanBuff ADDR_FLASH_SECTOR_7_BANK1 //保存数据的起始位
//缓存长度
#define MBuffLen 1024
//缓存变量
static uint8_t MBuff[MBuffLen] = {0};
//将变量指针指向 MBuff变量的成员
static uint8_t *Initial = (uint8_t*)&MBuff[0]; // 0 出厂设置标志 0xFF就要执行初始化
static uint32_t *Filter_ID1 = (uint32_t*)&MBuff[1]; // 1-4 设置can1接收id范围 默认0xA2
static uint32_t *Filter_ID2 = (uint32_t*)&MBuff[5]; // 5-8 设置can1接收id范围 默认0xA2
static uint32_t *CanMasterId = (uint32_t*)&MBuff[9]; // 9-12 设置运动卡id 默认是 0x32
/******************
读配置到MBuff变量
当 Initial 为 0xFF 时恢复出厂配置
*/
static void RxSetUp(void){
//变量 FLASH地址 长度
memcpy(MBuff, (void *)ADDR_FLASH_RxCanBuff, MBuffLen); //从FLASH读数据到变量
if(*Initial == 0xFF){
debug("初始化出厂设置\n");
//配置出厂设置
*Initial = 1;//
*Filter_ID1 = 0xA2;
*Filter_ID2 = 0xA2;
*CanMasterId = 0x32;
Erase_X(7); //檫除扇区 第7个
//参数 变量 FLASH起始位置 长度
F_Write(MBuff, (uint32_t)ADDR_FLASH_RxCanBuff, MBuffLen); //保存数据 参数 变量 FLASH起始位置 长度
}
}
/*
任务入口
*/
static void app(void *pvParameters) {
debug("app\n");
debug("请注意 变量使用的是小端!!!\n");
RxSetUp();//读配置
BatAdd(Callio); //注册io回调
CallBatAddCan1(CallRxCan1); //注册回调
fdcan1.rx_Filter_Init(*Filter_ID1,*Filter_ID2); // 初始化FDCAN1滤波器 当前设备接收消息的id范围
fdcan1.start(); // 启动FDCAN1
fdcan1.rx_Interrupt_Init(); // 打开FDCAN1的接收中断
debug("配置****************\n");
debug("Filter_ID1: 0x%08X\n", *Filter_ID1);
debug("Filter_ID2: 0x%08X\n", *Filter_ID2);
debug("CanMasterId: 0x%08X\n", *CanMasterId);
debugH(MBuff,15);
while (1) {
vTaskDelay(5 / portTICK_PERIOD_MS); //延迟
}
}