当前位置: 首页 > article >正文

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);  //延迟
	}
}




http://www.kler.cn/a/448307.html

相关文章:

  • Spring Boot 多数据源解决方案:dynamic-datasource-spring-boot-starter 的奥秘
  • 反序列化为啥可以利用加号绕过php正则匹配
  • 了解RPC
  • Docker_常用命令详解
  • go mod tidy 命令
  • C++ OpenGL学习笔记(2、绘制橙色三角形绘制、绿色随时间变化的三角形绘制)
  • python --机器学习(KNN相关)
  • 算法之物品移动
  • 鸿蒙元服务从0到上架【第二篇】
  • HarmonyOS NEXT 技术实践-实现音乐服务卡片
  • 简单介绍一下缓慢渐变维
  • java篇-maven配置阿里云仓库(图文详解)
  • sass、scss、less、的区别
  • 文献阅读+ARIMA模型学习
  • Fluss 写入数据湖实战
  • 在 docker 内运行命令的一个大坑
  • Centos7 系统初始化
  • MySQL LIST Partitioning 问题求解/吐槽
  • 解锁大数据治理的“密码”与应用奥秘
  • ApacheStruts2 目录遍历与文件上传漏洞复现(CVE-2024-53677,S2-067)(附脚本)
  • 《测试开发方法论》-追踪溯源
  • 【钉钉群聊机器人定时发送消息功能实现】
  • C++ 哈希表封装unordered_map 和 unordered_set
  • 浅谈ORACLE中间件SOA BPM,IDM,OID,UCM,WebcenterPortal服务器如何做迁移切换
  • FLV视频封装格式详解
  • SSM 驱动的 JAVA 网络直播带货查询系统设计及 JSP 成功实现解析