stm32实现flash参数存储

此方法非常高效,使用结构体+联合体的方式实现flash的参数存储,到底有多简单高效,可以往后面看,如果觉得不高效,完全可以顺着网线来砍我。

前提条件:

1-flash的读写驱动程序,这里不做介绍

实现思路:

2-1结构体创建一个参数列表,大家知道结构体就是一个大箱子,里面放很多变量。

2-2联合体创建一个结构体和数组的组合,联合体多个变量占用同一个内存,这个特性大家有没有一语惊醒你,没有也没关系,下面直接实现代码。

#include <stdio.h>
#include "string.h"
struct NV_T
{
	char a;
	short b;
	int c;
	float d;
	
};

union NV_U
{
	struct NV_T nv_list;
	unsigned char flash_buf[12];	//保存所有数据的数组
}nv_para;



//验证NV大小是否正确
int check_nv_buf_size()
{
	if(sizeof(nv_para.flash_buf) == sizeof(nv_para.nv_list))
	{
		return 1;
	}
	printf("nv size dis %d %d\n",sizeof(nv_para.nv_list),sizeof(nv_para.flash_buf));
	return 0;
}

int main()
{

	if(check_nv_buf_size() ==1 )
	{
		printf("nv size ok\n");
	}

   
   printf("hes:%d %d\n",sizeof(nv_para.nv_list),sizeof(nv_para.flash_buf));
   
   nv_para.nv_list.a =89;
   nv_para.nv_list.d =25.456;
   
   //新建一个nv变量,模拟flash
   union NV_U nv1={0};
   
   memcpy(nv1.flash_buf,nv_para.flash_buf,sizeof(nv_para.flash_buf));
   
   printf("sn:%d %d\n",nv_para.nv_list.a,nv1.nv_list.a);
   printf("sn:%0.3f %0.3f\n",nv_para.nv_list.d,nv1.nv_list.d);
   
   return 1;
}

运行结果:可以看到nv1变量里面的参数列表的值和nv_para里面的值是一样的,我们只是拷贝了联合体的flash_buf变量,没有实际拷贝结构体的变量。

有这个结果是应为联合体的特性,struct NV_T nv_list;    unsigned char flash_buf[12];    这两个变量使用了同一个内存,不管你修改谁,他们都会同步修改,是不是很舒服。

使用这种方式以后添加参数,只需要往结构体里面加变量就ok,非常直接高效,适用于任何存储器。

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在嵌入式系统中,使用Flash存储器来存储参数是一种常见的方法。以下是一个简单的示例代码,演示如何使用Flash存储器来保参数: ```c #include "stm32f4xx_hal.h" #include "stm32f4xx_hal_flash.h" #define PARAMETER_ADDRESS 0x080E0000 // Flash地址 // 定义一个结构体来保参数 typedef struct { int param1; float param2; char param3[20]; } Parameters; // 函数原型 void saveParams(Parameters *params); int main(void) { // 创建一个参数结构体 Parameters params = { .param1 = 42, .param2 = 3.1415926, .param3 = "Hello, World!" }; // 保参数Flash saveParams(&params); // ... } void saveParams(Parameters *params) { HAL_StatusTypeDef status; // 解锁Flash status = HAL_FLASH_Unlock(); if (status != HAL_OK) { // 处理解锁失败的情况 return; } // 擦除Flash扇区 FLASH_Erase_Sector(FLASH_SECTOR_11, FLASH_VOLTAGE_RANGE_3); status = FLASH_WaitForLastOperation(HAL_MAX_DELAY); if (status != HAL_OK) { // 处理擦除失败的情况 return; } // 写入参数Flash uint32_t address = PARAMETER_ADDRESS; status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, params->param1); address += 4; status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLOAT, address, params->param2); address += 4; status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, address, (uint16_t)strlen(params->param3)); address += 2; for (int i = 0; i < strlen(params->param3); i += 2) { uint16_t data = ((uint16_t)params->param3[i]) | (((uint16_t)params->param3[i + 1]) << 8); status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, address, data); address += 2; } // 锁定Flash status = HAL_FLASH_Lock(); } ``` 在上面的代码中,我们定义了一个名为`Parameters`的结构体,用于保我们要存储参数。然后,我们在主函数中创建了一个参数结构体,并调用`saveParams()`函数将参数Flash。`saveParams()`函数首先解锁Flash,然后擦除Flash扇区。接下来,它使用`HAL_FLASH_Program()`函数将参数写入Flash。最后,它锁定Flash。 请注意,不同的Flash存储器可能具有不同的操作方式和API函数。因此,您需要根据您的具体嵌入式系统和Flash存储器来进行适当的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值