STM32实现掉电保存多个数据(FLASH)

STM32实现掉电保存多个数据

本篇文章的具体内容:
1. 初步认识Flash
2. Flash写入多个数
3. 读取Flash中存储的数值

一、初步认识FLASH

如果想要实现掉电存储,首要的任务就是找到一个地方可以存放这些数据,当这些数据发生改变的时候,把数据存放进去,并且保证上电后不会被擦除。这么一来,等在次上电之后,通过读取掉电前存储的数据,实现掉电存储功能。
可以存放数据的地方可分为在两种片上flash和片外flash,常见的片上闪存有EEPROM,片外的存储芯片有W25QXXX。本篇文章使用的是直接在FLASH中存储。根据不同的芯片类型,闪存的大小都是不一样的。如下图(其他博客截取来的):
在这里插入图片描述
主控芯片的内存一般可分为8块:存放初始化程序的固化部分、数据段、代码段、堆空间、栈空间等。掉电存储数据的地方在第0块中的某个位置(0X0800 0000 ~0X0808 0000,这个的大小对应芯片闪存大小)只要存放的数据不超出这个范围,一切都好说。

二、FLASH写入数据

通过对上面的了解,大概知道了存放的位置。之后就可以向这个位置里面为所欲为啦?当然不是。下面以STM32标准库为例,你需要在工程里面加入stm32f10x_flash.c文件,这个文件抱恨了很多对flash操作的方法,我们只需要调用这些方法才可以为所欲为。(膜拜驱动大佬)。
怎么实现为所欲为呢?一般有两种:读和写。
写入:检查状态–>解锁–>擦除–>写入–>上锁–>完事。
读取:解锁–>读取–>上锁–>完事。

/*
功能:向flash中写入数据
参数:addr:地址  flashdata1:写入的数据  len:写入长度
返回值:
 */
void FLASH_WriteByte(u32 addr ,uint64_t *flashdata1,uint8_t len)
{
	
		int i = 0;
	
		FLASH_Status FLASHstatus = FLASH_COMPLETE;
		FLASH_Unlock(); //解锁flash

		FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);  //清除标志位

		FLASHstatus=FLASH_ErasePage(addr);   //擦除指定地址页
		
		for(i=0; i<len;i++)
		{
			FLASHstatus=FLASH_ProgramHalfWord(addr+i*4, flashdata1[i]);//从指定的地址写入数据
		}
		FLASH_Lock();//上锁 
}

有了这个函数之后,在封装一个函数,把想要存储的变量数据对应放到一个数组里面,然后将整一个数组写到flash中,实现最终的写入功能。

三、读取FLASH中存储的数据

通过上面的写入函数,就可以把数据写入到flash中了,之后找到同一个地址,将数据读取出来,读取的长度和写进去的长度一致,之后将数据存到一个数组当中,再将数组的值对应赋值给保存进来的时的变量,就可以实现读取功能。

/*
功能:读取FLASH中指定地址的值
参数:addr:起始地址  len:读取的长度
返回值:无
 */
void Read_Flash(uint32_t addr,uint8_t len)
{
	
	uint64_t NEW_ParArry[13] = {0};
	u8 i=0;
	
	uint64_t rdata = 0;
	
	FLASH_Unlock();//解锁flash
	
	for(i=0;i<len;i++)
	{
		NEW_ParArry[i] = *(u16 *)(addr + i*4);    //读取flash地址中的值
	}
	
	FLASH_Lock();//上锁
	
/*********** 重新赋值给变量 ********/		
	
	S_num = NEW_ParArry[0];
    F_num	= NEW_ParArry[1];
	R_num = NEW_ParArry[2];
	total = NEW_ParArry[3];  
	
	I_reg  = NEW_ParArry[4];
	VL_reg = NEW_ParArry[5];
	VH_reg = NEW_ParArry[6]; 
	T_reg  = NEW_ParArry[7]; 
	
	line1 = NEW_ParArry[8];
	line2 = NEW_ParArry[9];
	line3 = NEW_ParArry[10];
	line4 = NEW_ParArry[11];
	line5 = NEW_ParArry[12];
}

最后,只需要在主程序中的适当位置,调用闪存写入函数(一般是当数据发生改变时写入)。但尽量减少写入的次数,flash的读写次数在十万次左右。
STM32实现掉电保存功能的详细工程
点击即可跳转下载。
https://download.csdn.net/download/janson_24/12629396

  • 44
    点赞
  • 350
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: STM32F103是一款非常高性能、低功耗的32位微控制器,它在工业控制、机器人控制、嵌入式系统等领域得到了广泛应用。 在STM32F103掉电时,需要保存一些重要数据,这些数据可能包括程序计数器、寄存器、中断控制器、外设状态寄存器等。为了确保这些数据掉电后不会丢失,需要采用一些方法来保存它们。 其中一个常见方法是使用闪存,将数据保存在非易失性存储器中。STM32F103内置一个64KB的闪存,可以用于数据存储。在掉电时,微控制器会自动将数据从RAM加载到闪存中,以便在下次启动时恢复。但是,这种方法需要更多的存储空间,并且需要复杂的编程过程。 另一个方法是使用备用电源电池来保持数据的状态。STM32F103提供了备用电源引脚来连接外部电池,并且在掉电时自动切换到备用电源。这种方法是非常可靠的,但需要外部电池,并且在掉电后需要重新充电,以便准备下一次使用。 还有一种方法是使用EEPROM,这是一种电可擦写的非易失性存储器。STM32F103有一个1KB的EEPROM,可以用于保存数据。这种方法需要更少的存储空间,并且在掉电后可以立即使用,但是EEPROM的写入次数是有限制的,需要注意。 总之,STM32F103掉电数据保存可以采用多种方法,开发者需要根据自己的需求选择最适合的解决方案。 ### 回答2: 针对stm32f103掉电数据保存,我们可以采用以下几种方式: 1. EEPROM存储: EEPROM是一种非易失性存储器,即使掉电数据也不会丢失。stm32f103芯片中自带了一定大小的EEPROM存储空间,可以使用HAL库函数进行读写。但是EEPROM写入速度较慢,而且写入次数有限。 2. Flash存储: Flash存储也是一种非易失性存储器,数据不会丢失。在stm32f103芯片中,Flash存储空间非常大,可以使用HAL库函数进行读写。但是Flash写入速度也比较慢,而且写入次数也有限。 3. 外部EEPROM或Flash芯片存储: 如果需要更大的存储空间,可以使用外部EEPROM或Flash芯片进行数据存储。这种方式需要使用外部通信接口(如I2C、SPI等)进行数据读写,需要编写相应的驱动程序和通信协议。 4. RTC(实时时钟)备份寄存器: 在stm32f103芯片中,配有一个RTC模块,其中集成了多个备份寄存器(BKP)用于保存一些重要的掉电数据,如系统时钟设置、校准值、密码等。这些备份寄存器可以通过HAL库函数进行读写。 总之,针对stm32f103掉电数据保存,选择合适的存储方式需要考虑数据量、读写速度、写入次数等方面因素,对于重要的掉电数据还需要考虑数据的备份与恢复策略。 ### 回答3: STM32F103是一种ARM Cortex-M3处理器的微控制器。在许多情况下,STM32F103需要在掉电保存数据,以便在下次运行时可以继续使用。一种常见的方法就是使用EEPROM,不过STM32F103没有内置EEPROM,除非外部添加EEPROM芯片才可以实现数据保存。但是,STM32F103自带RTC(实时时钟),也可以在掉电保存数据。 在STM32F103中,RTC和Backup RAM同时都需要电池供电以保存数据。RTC可以提供时间和日期参数,同时也可以控制备份电源和复位保护,以保证数据的完整性。当系统通电时,可以从RTC读取上一次的数据和状态。当需要保存数据时,可以使用Backup RAM存储一些数据,然后将RAM数据写入闪存中,并在断电时由RTC提供电源。在下一次通电时,可以从闪存中恢复RAM数据。 需要注意的是,Backup RAM仅在Vbat被应用时才能保持数据。如果Vbat没有正确应用,数据将会丢失。此外,在RTC和Backup RAM同时工作时,如果RTC内的锁定寄存器被锁定,则无法对RAM访问进行读写操作。 因此,如果需要在STM32F103掉电保存数据,可以使用RTC和Backup RAM的组合,或者添加一个外部EEPROM芯片存储数据。在具体应用中,需要根据需要和资源来选择合适的方法来实现数据保存和恢复。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值