STM32 FLASH 循环存储

前言

flash有擦写次数限制,一般为10万次。如果单一地址高频次重复擦写,会严重影响flash的使用寿命。如果一分钟存储一次,10万次也就能够使用不到两年的时间。所以推荐使用循环存储。

使用场景:需要长时间高频次存储的重要数据,flash空间有富余,用空间来换取时间。如:比较频繁刷新又每次都要保存的数据。

优点:代码量低,程序简单,易于理解。能够高频次存取数据,断电复位不丢失,不出错。
缺点:一个扇区存储单一数据;只利于使用最后一次数据,不利用历史数据分析。

变量定义


#define FLASH_START_ADDRESS 0x0803F800
#define FLASH_END_ADDRESS 	0x0803FFFF

typedef struct
{
	uint32_t start_address;
	uint32_t end_address;
	uint32_t puiAddress;

} FLASH_Manage_TypeDef;

FLASH_Manage_TypeDef address;

uint16_t test_count = 0;

初始化函数

void flash_init_data(FLASH_Manage_TypeDef *address)
{
	address->start_address = FLASH_START_ADDRESS;
	address->end_address = FLASH_END_ADDRESS;
}

页擦除

static void sFLASH_PageErase(void)
{
	static FLASH_EraseInitTypeDef EraseInitStruct;
	uint32_t SECTORError = 0;
	/* 解锁 */
	HAL_FLASH_Unlock();

	/* 擦除 */
	EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
	EraseInitStruct.NbPages = 1;
	EraseInitStruct.PageAddress = address.start_address;
	if (HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError) != HAL_OK)
	{
		
	}
}

写函数


void flash_write_data(FLASH_Manage_TypeDef *address, uint16_t *data)
{
	address->puiAddress += 2U;
	if (address->puiAddress >= address->end_address)
	{
		/* 读出,页擦除 */
		//memcpy((uint8_t *)test_read_buf,(uint8_t *)address->start_address,address->end_address - address->start_address);
		sFLASH_PageErase();
		address->puiAddress = address->start_address;
		
	}

	HAL_FLASH_Unlock();
	HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, address->puiAddress,
	//*(test_point++));
	*data);
	HAL_FLASH_Lock();

}

读函数


void flash_read_data(FLASH_Manage_TypeDef *address, uint16_t *data)
{
	uint16_t *addr = (void*)(address->end_address-1);
	while(addr)
	{
		/* code */
		if((uint32_t)addr < (uint32_t)address->start_address)
		{
			/* 没有历史数据 */
			*data =0;
			address->puiAddress = (uint32_t)addr;
			break;
		}
		
		if ((*addr) != 0xffff)
		{
			/* 读到历史数据,记录数值和位置 */
			*data = *addr;
			address->puiAddress = (uint32_t)addr;
			break;
		}

		addr--;
	}
}

函数调用

	
	//初始化
	flash_init_data(&address);
	
	//读取flash历史数据
	flash_read_data(&address,&test_count);

	/* USER CODE END 2 */

	/* Infinite loop */
	/* USER CODE BEGIN WHILE */
	while (1)
	{
		/* USER CODE END WHILE */

		/* USER CODE BEGIN 3 */
		/*stm32f030cc单片机总计256Kbyte flash,每个page大小2Kbyte,所以总计128个page,
		  1Kwork(4Kbyte)为一个sector。
		  先使用127page,地址为0x0803 F800 - 0x0803 FFFF
		*/
		test_count ++;
		flash_write_data( &address, &test_count);
		HAL_Delay(1000);
		
		
	}

结果

在这里插入图片描述
在这里插入图片描述

总结

不用担心10万次擦写上限了,如果有多个需要保存的数据,可以多开几个扇区。这种数据太多,也可以打包一个结构体。

  • 3
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
STM32Flash是用来存储程序的,其中的循环复用是指在程序运行过程中,可以将Flash用作存储临时数据或者运行时状态的缓存。循环复用可以通过将Flash的某个区域划分为多个块,然后对这些块进行循环使用来实现。这样做的好处是可以减少对外部存储器的访问次数,提高系统的运行效率。 具体到STM32Flash循环复用,可以参考引用中提到的在SPI通信中访问外部高速Flash的例子。通过将外部Flash芯片的一部分区域划分为多个块,可以按照一定的规则进行数据的读写和擦除操作。这样就可以实现在程序运行过程中,使用Flash作为临时存储空间,而不需要频繁地访问外部存储器。 需要注意的是,STM32Flash有容量上的限制,具体的容量取决于芯片型号,可以参考引用和引用中提到的容量大小。在进行Flash循环复用时,需要根据具体的需求和系统资源进行合理的规划和设计,以确保程序的正常运行和数据的安全存储。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [STM32嵌入式FLASH擦除与写入](https://blog.csdn.net/ABCisCOOL/article/details/115128808)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [STM32F103(二十七)超长篇解读【STM32访问外部flash】](https://blog.csdn.net/Curnane0_0/article/details/122107793)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值