STM32实现数据掉电存储

这篇具有很好参考价值的文章主要介绍了STM32实现数据掉电存储。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        在嵌入式系统中,实现数据的掉电存储通常是为了确保关键数据在系统断电或重启时不会丢失。

实现方式:数据量不大时将数据保存在片内flash中。(注意flash的读写寿命)

一、STM32内部flash简介

        STM32 芯片内部有一个 FLASH 存储器,它主要用于存储代码。
stm32f4实现掉电一瞬间数据存储,stm32,嵌入式硬件,单片机
        除了使用外部的工具(如下载器)读写内部 FLASH 外, STM32 芯片在运行的时候,也能对自身 的内部 FLASH 进行读写,因此,若内部 FLASH 存储了应用程序后还有剩余的空间,我们可以把 它像外部 SPI-FLASH 那样利用起来,存储一些程序运行时产生的需要掉电保存的数据。
        由于访问内部 FLASH 的速度要比外部的 SPI-FLASH 快得多,所以在紧急状态下常常会使用内部 FLASH 存储关键记录;为了防止应用程序被抄袭,有的应用会禁止读写内部 FLASH 中的内容或者在第一次运行时计算加密信息并记录到某些区域,然后删除自身的部分加密代码,这些应用
都涉及到内部 FLASH 的操作。
内部flash的构成:
        STM32 的内部 FLASH 包含主存储器、系统存储器以及选项字节区域,它们的地址分布及大小见 表 STM32 大容量产品内部 FLASH 的构成 (在《 STM32 参考手册》中没有关于其内部 FLASH 的 说明,需要了解这些内容时,要查阅《STM32F10x 闪存编程参考手册》)。
stm32f4实现掉电一瞬间数据存储,stm32,嵌入式硬件,单片机二、STM32内部flash的读写过程
1 解锁
由于内部 FLASH 空间主要存储的是应用程序,是非常关键的数据,为了防止误操作修改了这些
内容,芯片复位后默认会给控制寄存器 FLASH_CR 上锁,这个时候不允许设置 FLASH 的控制寄
存器,从而不能修改 FLASH 中的内容。
所以对 FLASH 写入数据前,需要先给它解锁。解锁的操作步骤如下:
(1) FPEC 键寄存器 FLASH_KEYR 中写入 KEY1 = 0x45670123
(2) 再往 FPEC 键寄存器 FLASH_KEYR 中写入 KEY2 = 0xCDEF89AB
2 页擦除
在写入新的数据前,需要先擦除存储区域, STM32 提供了页(扇区)擦除指令和整个 FLASH
( 批量擦除 ) 的指令,批量擦除指令仅针对主存储区。
页擦除的过程如下:
(1) 检查 FLASH_SR 寄存器中的“忙碌寄存器位 BSY ”,以确认当前未执行任何 Flash 操作;
(2) FLASH_CR 寄存器中,将“激活页擦除寄存器位 PER ”置 1
(3) FLASH_AR 寄存器选择要擦除的页;
(4) FLASH_CR 寄存器中的“开始擦除寄存器位 STRT ”置 1 ,开始擦除;
(5) 等待 BSY 位被清零时,表示擦除完成。
3 写入数据
擦除完毕后即可写入数据,写入数据的过程并不是仅仅使用指针向地址赋值,赋值前还还需要配
置一系列的寄存器,步骤如下:
(1) 检查 FLASH_SR 中的 BSY 位,以确认当前未执行任何其它的内部 Flash 操作;
(2) FLASH_CR 寄存器中的“激活编程寄存器位 PG ”置 1
(3) 向指定的 FLASH 存储器地址执行数据写入操作,每次只能以 16 位的方式写入;
(4) 等待 BSY 位被清零时,表示写入完成。
三、STM32内部flash的验证
实现功能:创建1个变量,将变量的值写入flash中,两个按键分别控制变量的增加和减小,对百年变量的值进行修改,然后断电观察打印的变量的值是不是最后设定的值。
写入流程:检查状态–>解锁–>擦除–>写入–>上锁。
读出流程:解锁–>读取–>上锁
1. flash写入函数:
void flash_write(void)
{
		/* 解锁 */
  FLASH_Unlock();

  /* 清空所有标志位 */
  FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);	

  /* 擦除 */ 
  FLASHStatus = FLASH_ErasePage(Address);
  
  /* 向内部FLASH写入数据 */
  while(FLASHStatus == FLASH_COMPLETE)   //判断是否擦除成功
  {
    FLASHStatus = FLASH_ProgramWord(Address, data);   //写入数据
  }

  /* 上锁 */	
  FLASH_Lock();	
}

2. flash读出函数:使用指针寻址读出地址的内容

//读取flash的值
FLASH_Unlock();
data = (*(__IO uint32_t*) Address); 
FLASH_Lock();

3. 整体显示代码:

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "key.h" 

uint32_t data = 1000; 	            //定义一个变量,4个字节
uint32_t Address = 0x08008000;			//记录写入的地址

typedef enum 
{
	FAILED = 0, 
  PASSED = !FAILED
} TestStatus;

FLASH_Status FLASHStatus = FLASH_COMPLETE;  //记录每次擦除的结果	
TestStatus MemoryProgramStatus = PASSED;    //记录整个测试结果

void flash_write(void)
{
		/* 解锁 */
  FLASH_Unlock();

  /* 清空所有标志位 */
  FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);	

  /* 擦除 */ 
  FLASHStatus = FLASH_ErasePage(Address);
  
  /* 向内部FLASH写入数据 */
  while(FLASHStatus == FLASH_COMPLETE)   //判断是否擦除成功
  {
    FLASHStatus = FLASH_ProgramWord(Address, data);   //写入数据
  }

  /* 上锁 */	
  FLASH_Lock();	
}

//按下key1,data减小10
void key1_handler(void)
{
	data += 10;
	flash_write();

}

//按下key2,data增加10
void key2_handler(void)
{
	data -= 10;
	flash_write();

}


u16 count=0;

 int main(void)
 {	
 
	delay_init();	    	 //延时函数初始化	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
	uart_init(115200);	 //串口初始化为115200
	LED_Init();		  	 //初始化与LED连接的硬件接口 
	KEY_Init();
 
	printf("\r\n STM32  flash 读写测试 \r\n");	
	
	//读取flash的值
  FLASH_Unlock();
	data = (*(__IO uint32_t*) Address); 
	FLASH_Lock();
	 	 
	while(1)
	{
		u8 t=0;	
		if(0==count%1)
		{
				t=KEY_Scan(0);		//得到键值
				switch(t)
				{
						case 1:
						{
							key1_handler();   
						}
						break;
						case 2:
						{
							key2_handler(); 
						}		
						break;			
					default:
					  break;
				}
		}
		
		if(0==count%1000)
		{
			printf("The duchu

4. 实现效果:

通过按键修改数值为:6160

stm32f4实现掉电一瞬间数据存储,stm32,嵌入式硬件,单片机

重新断电重启,观察数值:

stm32f4实现掉电一瞬间数据存储,stm32,嵌入式硬件,单片机

可以看到数值就是最后保存的数值。

完整代码:https://download.csdn.net/download/qq_39742246/88582982文章来源地址https://www.toymoban.com/news/detail-780587.html

到了这里,关于STM32实现数据掉电存储的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 运动控制器设计——基于FreeModbus在STM32F4平台实现ModbusTCP和ModbusRTU

    运动控制器设计——基于FreeModbus在STM32F4平台实现ModbusTCP和ModbusRTU

    本文笔者最近的项目是设计一款运动控制器,MCU使用的是STM32F429,要求是通过Modbus TCP协议实现与示教器通讯,并通过ModbusRTU实现与触摸屏通讯。 本文将介绍在STM32F4上实现 ModbusTCP和ModbusRTU通讯 的过程。笔者才疏学浅,如有错误还请指正。 Modbus协议是典型的主-从通讯结构,链

    2024年02月05日
    浏览(9)
  • MPU6050(读取原数据、移植DMP、stm32f4、HAL库、KEIL5)

    MPU6050(读取原数据、移植DMP、stm32f4、HAL库、KEIL5)

    记录一下自己遇到的问题及解决方法,希望能帮助到一些人。 第一步,读取芯片的原始数据。需要注意两点:1、对HAL库提供的IIC读取写入函数进行再包装。(千万不要觉的这步多此一举,后面移植DMP时用得到) 2、芯片的地址(这里面有俩坑)第一就是,芯片的 I2C 设备地址

    2023年04月08日
    浏览(12)
  • [GD32F4]基于GD32固件库移植cherryusb[STM32F4]

    [GD32F4]基于GD32固件库移植cherryusb[STM32F4]

    [GD32F4]基于GD32固件库移植cherryusb[STM32F4] 使用开发板是淘宝买的不知名开发板,没什么好说的,具体的型号是GD32F450VET6。 使用的cherryusb版本是0.9.0版本。 使用的GD32官方固件库版本是:GD32F4xx_Firmware_Library_V3.0.4 cherryusb最牛的地方在于抛弃掉所有的依赖,只需要知道芯片的usb中断

    2024年02月06日
    浏览(42)
  • 【STM32】STM32F4 GPIO口映射与复用

    【STM32】STM32F4 GPIO口映射与复用

    STM32F4 有很多的内置外设,这些外设的外部引脚都是与 GPIO 复用的。也就是说,一个 GPIO 如果可以复用为内置外设的功能引脚,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。 这部分知识在《STM32F4 中文参考手册》第七章和芯片数据手册有详细的讲解哪些 GPIO 管脚是

    2024年02月15日
    浏览(9)
  • STM32F4Timer

    STM32F4Timer

    ref https://blog.csdn.net/zhuxinmingde/article/details/131784852?ops_request_misc=request_id=biz_id=102utm_term=STM32%20%E9%AB%98%E7%BA%A7%EF%BC%8C%E6%99%AE%E9%80%9A%EF%BC%8C%E5%9F%BA%E6%9C%AC%E5%AE%9A%E6%97%B6%E5%99%A8utm_medium=distribute.pc_search_result.none-task-blog-2 all sobaiduweb~default-1-131784852.142 v99 controlspm=1018.2226.3001.4187 1. Timer re

    2024年02月02日
    浏览(14)
  • 第五步:STM32F4端口复用

    第五步:STM32F4端口复用

    STM32 有很多的内置外设,这些外设的外部引脚都是与 GPIO 复用的。也就是说,一个 GPIO 如果可以复用为内置外设的功能引脚,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。 例如串口 1 的发送接收引脚是 PA9,PA10 ,当我们把 PA9,PA10 不用作 GPIO ,而用做复用功能串口

    2024年02月12日
    浏览(15)
  • 第八步:STM32F4 EXTI

    第八步:STM32F4 EXTI

    STM32F4的每个IO都可以作为外部中断输入。 STM32F4的中断控制器支持22个外部中断/事件请求: EXTI线0~15:对应外部IO口的输入中断。 EXTI线16:连接到PVD输出。 EXTI线17:连接到RTC闹钟事件。 EXTI线18:连接到USB OTG FS唤醒事件。 EXTI线19:连接到以太网唤醒事件。 EXTI线20:连接到US

    2024年02月12日
    浏览(8)
  • 第三步:STM32F4时钟介绍

    第三步:STM32F4时钟介绍

    1. STM32 有 5 个时钟源 :HSI 、 HSE 、 LSI 、 LSE 、 PLL 。     ①、 HSI 是高速内部时钟, RC 振荡器,频率为 16MHz ,精度不高。可以直接作为系统   时钟或者用作 PLL 时钟输入。 ②、 HSE 是高速外部时钟,可接石英 / 陶瓷谐振器,或者接外部时                 钟源,频率范

    2024年02月12日
    浏览(14)
  • STM32F4X 定时器中断

    STM32F4X 定时器中断

    定时器(Timer)最基本的功能就是定时,比如定时翻转LED灯,定时向串口发送数据等。除此之外,定时器还可以跟GPIO结合使用,利用定时器产生PWM波形,利用定时器捕捉电平信号等。本章先来讲解定时器的最基本的用法,定时功能。 STM32F4X将定时器分成3类,分别是基本定时器,

    2024年02月12日
    浏览(17)
  • 基于STM32F4的心电监护仪

    基于STM32F4的心电监护仪

    从题目中可以看出该课题来源于 2020年省电赛A题的无线运动传感器节点的设计 ,该作品得过湖北省电赛二等奖,同时也是我本科毕业设计,这里我把自己做的关于心电部分的工作进行一次总结,也对我的大学四年进行一次总结。 处理器板子的选择 本研究的处理器模块选择

    2024年02月03日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包