ESP32 读写内部flash参数存储

前言:关于参数存储,是一个程序必要的功能,而esp32其实是只带NVS库的,少量的变量数据其实还是比较方便的,如果我们的参数很多,还有一些字符串,那NVS库显然不太能满足我们了。那么我们就需要自己去读写flash,设计自己的参数表。

esp32 分区表:(需要了解详细可以查阅相关内容)

esp32的flash一般而言我们不能直接去操作地址,首先需要我们定义或修改分区表。

进入menuconfig,选择自定义的表。 

这个文件可以从D:\ESP32\esp-idf-v3.3\components\partition_table目录中拷贝一个到自己的工程下。名字改成partitions.csv,当然你可以自己取。

修改分区表:添加用户保存的区域,大小只能是8K的倍数,因为flash每页是8K,其它值会出错。

 

基本流程

接下来就是代码部分,整体也比较简单,主要分如下几个步骤:

1-寻找分区表

2-读flash

3-写flash

4-擦除flash

基本上也是正常的flash读写过程。只是esp32多了一个分区表的概念。

设计自定义参数表 (这里可以看看我以前的文章)

union para_tab
{
	struct nv_tab
	{	
		unsigned char init_flag;   	//是否初始化		
		unsigned char data_1;
		unsigned char data_2;
		unsigned char data_3;
		
	}nv_tab;

	//保存所有数据的数组
	unsigned char flash_buf[sizeof(struct nv_tab)];  //自适应大小
};
extern union para_tab Pra;

 实现读写函数:

#define PARA_FLASH_NAME "user_save"
static const char *TAG = "user_flash";
static esp_partition_t *partition;



union para_tab Pra={0};

void init_mflash()
{

	//寻找分区表
	partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, PARA_FLASH_NAME);
	assert(partition != NULL);
}

//在指定地址写入数组
void FLASH_WriteByte()
{	
	  
		uint8_t err=0;
		
		//擦除flash
		err=esp_partition_erase_range(partition, 0, partition->size);
		if(err!=0)
		{
			ESP_LOGI(TAG, "user flash erase error %d",err);
		}
		//写入flash
		err = esp_partition_write(partition, 0,Pra.flash_buf,sizeof(Pra.flash_buf));
		if(err!=0)
		{
			ESP_LOGI(TAG, "user flash write error %d",err);
		}

}

//在指定地址读出数组
void FLASH_ReadByte()
{
	
	uint8_t  err =0;
	//读取flash
	err=esp_partition_read(partition, 0, Pra.flash_buf , sizeof(Pra.flash_buf));

	if(err!=0)
	{
		ESP_LOGI(TAG, "user flash read erro %d",err);
	 	return ;
	}

   
}

如何使用:具体测试代码就不多讲了。

    init_mflash();

	// Pra.nv_tab.init_flag =1;
	// Pra.nv_tab.data_1 =2;
	// Pra.nv_tab.data_2 =3;
	// Pra.nv_tab.data_3 =4;
	// FLASH_WriteByte();

	FLASH_ReadByte();

	ESP_LOGI("flash log","flash %d %d %d 
    %d\r\n",Pra.nv_tab.init_flag,Pra.nv_tab.data_1,Pra.nv_tab.data_2,Pra.nv_tab.data_3);

总结:整体上使用起来会比ESP32内置的NVS方便不少,使用起来也非常的简单。

  • 11
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
### 回答1: ESP32 FLASH读写是通过SPI接口进行的,可以使用ESP-IDF提供的SPI Master驱动程序来实现。在使用SPI Master驱动程序之前,需要先初始化SPI总线和SPI设备。然后,可以使用spi_device_transmit函数来发送和接收数据。在写入FLASH时,需要先擦除FLASH扇区,然后再写入数据。在读取FLASH时,可以直接从FLASH中读取数据。 ### 回答2: ESP32是一款强大的开发板,内置了丰富的存储空间,其中包括了FLASH存储器。FLASH存储器可以用来读取和写入数据。 在ESP32上进行FLASH读写操作需要使用ESP-IDF框架提供的API函数。主要的函数有`spi_flash_read`和`spi_flash_write`。 `spi_flash_read`函数用于从FLASH存储器中读取数据。它需要指定要读取的地址和数据缓冲区的大小。可以通过指定偏移量和大小来实现读取某个特定范围内的数据。 `spi_flash_write`函数用于向FLASH存储器中写入数据。它需要指定要写入的地址和数据缓冲区的大小。需要注意的是,写入操作会擦除目标地址上的数据,因此确保在执行写入操作之前备份数据是非常重要的。 读取和写入的地址是以字节为单位的。在使用这些函数之前,需要对SPI Flash进行初始化,这可以通过在代码中调用`esp_flash_init`函数来实现。 除了读取和写入数据之外,还可以使用`spi_flash_erase_sector`函数来擦除一个扇区的数据。它需要指定要擦除的扇区的地址。需要注意的是,扇区的大小通常为4KB。 总结起来,ESP32FLASH存储器可以通过`spi_flash_read`和`spi_flash_write`函数进行读写操作,还可以使用`spi_flash_erase_sector`函数进行扇区擦除操作。在使用这些函数之前需要对SPI Flash进行初始化。通过这些API函数,我们可以方便地在ESP32上进行FLASH读写操作。 ### 回答3: ESP32是一款集成式的芯片,它具备了内置的Flash存储器,用于存储程序和数据。Flash存储器被分为多个扇区,每个扇区都有自己的地址范围和大小。ESP32支持从Flash读取数据以及将数据写入Flash的功能。 要从Flash中读取数据,我们通常需要先确定要读取的数据存储在哪个扇区中。然后,我们使用ESP32Flash读取命令,通过指定数据在该扇区中的偏移地址来读取数据。读取的数据可以存储在缓冲区中,用于后续的处理。 而要将数据写入Flash,则首先需要选择一个空闲的扇区来存储数据。然后,将要写入的数据存储在一个缓冲区中。最后,我们使用ESP32Flash编程命令,将缓冲区中的数据写入到选定的扇区中。 需要注意的是,写入Flash时会覆盖原有的数据。因此,在执行写入操作之前,我们应该先备份任何我们希望保留的数据。 除了基本的读写操作,ESP32还提供了其他一些功能,例如擦除整个Flash存储器或者擦除特定扇区。这些功能可以在需要时使用。 总之,ESP32Flash读写功能为我们提供了一种方便的方式来访问和存储数据。通过合理地利用这些功能,我们可以在ESP32上开发出各种应用,从简单的数据存储到复杂的程序存储
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值