FLASH的一些小问题

最近我发现很多平台上关于flash方面的作法是要求使用者必须先擦除再写,并且最低擦除数是256,也就是一页,看起来可能没什么,但涉及到多种数据写在一个页上并且你只想修改其中的一个或个别数据时,就会发现有点怪怪的,解决的话也好解决,先存入缓冲区修改后在存就可以,下面是我写的代码接口,可以适用于大部分平台使用。

#define FLASH_PAGE_SIZE 256

/*************************
*函数:Flash_UpdateBytes();
*说明:更新Flash中的特定字节
*参数:address 要更新的起始地址
*参数:data 新的数据
*参数:size 要更新的字节数
*返回值:0:成功 其他:失败
*/
void Flash_UpdateBytes(long address, char* data, long size)
{
	long current_addr = address;
	long bytes_remaining = size;
	char* current_data = data;

	while (bytes_remaining > 0) {
		long page_start_addr = current_addr & ~(FLASH_PAGE_SIZE - 1);
		uint32_t offset_in_page = current_addr - page_start_addr;
		uint8_t page_buffer[FLASH_PAGE_SIZE];

		// 计算本次需要写入的字节数
		long bytes_to_write = FLASH_PAGE_SIZE - offset_in_page;
		if (bytes_to_write > bytes_remaining) {
			bytes_to_write = bytes_remaining;
		}

		printf("正在处理页地址: %lx, 页内偏移: %lx, 写入字节数: %ld\n",
			   page_start_addr, offset_in_page, bytes_to_write);

		// 1. 读取整个页的数据到缓冲区
		for (int i = 0; i < FLASH_PAGE_SIZE; i++) {
			page_buffer[i] = read_flash_arguments(page_start_addr + i);
		}

		// 2. 在缓冲区中更新需要修改的字节
		for (int i = 0; i < bytes_to_write; i++) {
			page_buffer[offset_in_page + i] = current_data[i];
		}

		// 3. 擦除页
		flash_clear_page(page_start_addr);

		// 4. 写回整个页的数据
		for (int i = 0; i < FLASH_PAGE_SIZE; i++) {
			write_flash_arguments(page_start_addr + i, page_buffer[i]);
		}

		// 更新循环变量
		current_addr += bytes_to_write;
		current_data += bytes_to_write;
		bytes_remaining -= bytes_to_write;
	}
}

上面代码中一些函数是flash的底层接口,不同平台对着接口改就行,有些会担心这样写对芯片的损耗,损耗是会存在的,但实际过程中一般来讲不用太担心,正常芯片使用寿命和读写次数是完全够开发使用的。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐