STM32CubeMX-Flash Hal库 内部Flash掉电存储

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


前言

本文将介绍STM32F1的内部FLASH,通过内部FLASH实现数据读写操作。从而做到掉电存储。不同型号的STM32,其FLASH:容量也有所不同,最小的只有 16K字节,最大的则达到了1024K字节。此处我们使用的是 STM32F103ZET6,其FLASH容量为512K字节,属于大容量产品,大容量产品的闪存模块组织图如下图示
stm32保存数据到内部flash,stm32,单片机,嵌入式硬件

别的博主的文章大多都是用键盘来验证是否存储完成,但是我感觉我又不是每次都要用按键存储,且存储的东西都很单一,我这篇里面会提到如何存储各种数据。


一、HAL库提供的代码

//源文件: stm32f1xx_hal_flash.c和stm32f1xx_hal_flash_ex.c
HAL_FLASH_Unlock(void); //解锁函数
HAL_FLASH_Lock(void);   //锁定函数
HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);   //写操作函数
HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError);   //擦除函数
HAL_FLASH_WaitForLastOperation(uint32_t Timeout);   //等待操作完成函数

这些都是本文要用到的。

cubemx不需要进行额外的配置。

二、代码编程

1.flash.c文件

首先给出整体代码随后会对每一部分进行一定的分析

#include "flash.h"
#include <stdio.h>
#include <string.h>
/*FLASH写入程序*/
void WriteFlash(uint32_t addr,uint32_t *Data,uint32_t L)
{
	uint32_t i=0;
	/* 1/4解锁FLASH*/
	HAL_FLASH_Unlock();
	/* 2/4擦除FLASH*/
	/*初始化FLASH_EraseInitTypeDef*/
	/*擦除方式页擦除FLASH_TYPEERASE_PAGES,块擦除FLASH_TYPEERASE_MASSERASE*/
	/*擦除页数*/
	/*擦除地址*/
	FLASH_EraseInitTypeDef FlashSet;
	FlashSet.TypeErase = FLASH_TYPEERASE_PAGES;
	FlashSet.PageAddress = addr;
	FlashSet.NbPages = 1;
	/*设置PageError,调用擦除函数*/
	uint32_t PageError = 0;
	HAL_FLASHEx_Erase(&FlashSet, &PageError);
	/* 3/4对FLASH烧写*/
	for(i=0;i<L;i++)
	{
		HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr+4*i, Data[i]);
	}
	/* 4/4锁住FLASH*/
	HAL_FLASH_Lock();
}

void Flash_Read(uint32_t address, uint32_t *data, uint16_t length)
{
    uint16_t i;
    for (i = 0; i < length; i++) {
        data[i] = *(__IO uint32_t *)(address + (i * 4)); // 以字为单位读取Flash
    }
}
//
DataToSave data_to_save ;//这个是要保存的数据
void my_flash_write(void)
{
	// 将数据转换为uint32_t数组以便写入Flash
	uint32_t flash_data[sizeof(DataToSave) / sizeof(uint32_t)];
	memcpy(flash_data, &data_to_save, sizeof(DataToSave));

	// 将数据写入Flash
	WriteFlash(FLASH_SAVE_ADDR, flash_data, sizeof(DataToSave) / sizeof(uint32_t));
}
int fff;//这是用来测试的
void my_flash_read(void)
{
	// 将读取到的数据转换回原始结构体
	DataToSave data_read;
	// 从Flash中读取数据
	uint32_t flash_data_read[sizeof(DataToSave) / sizeof(uint32_t)];
	Flash_Read(FLASH_SAVE_ADDR, flash_data_read, sizeof(DataToSave) / sizeof(uint32_t));
	memcpy(&data_read, flash_data_read, sizeof(DataToSave));
	// 现在,data_read.float_data 和 data_read.int_data 中分别包含从Flash中读取的float和int数据
	//读取完以后的数据可以从这里拿出!!!!
	fff=data_read.int_data[0];
}

WriteFlash函数

先解锁flash然后配置一下,再进行擦除(写入0即可),接着把需要数据写入,最后还需要上锁

Flash_Read函数

以字为单位读取Flash

my_flash_read函数

当你需要存储数据的时候直接调用这个函数就可以

my_flash_read函数

当你需要读取的时候直接调用就可以

2.flash.h文件

这里注意定义了一个结构体DataToSave,结构体里面就是你需要的存储的数据,你只需要定义好你需要存储的类型即可。

#ifndef __FLASH_H
#define __FLASH_H
#include "main.h"
void WriteFlash(uint32_t addr,uint32_t *Data,uint32_t L);
void Flash_Read(uint32_t address, uint32_t *data, uint16_t length);
#define FLASH_SAVE_ADDR  (0x08060000) // 这地方不用改直接用这个地址。
typedef struct {
    float float_data[4];
    int int_data[4];
} DataToSave;								//这个是要保存数据的结构体
extern DataToSave data_to_save ;//这个是要保存的数据
void my_flash_write(void);
void my_flash_read(void);
#endif

三、主函数编写

由于我们在.h文件中声明了外部变量extern DataToSave data_to_save ;所以当使用的时候只需要包含头文件就可以了,不用在main.c中进行变量的声明了。
由此在循环之前写这些。

	data_to_save.float_data[0] = float_variable1;
	data_to_save.float_data[1] = float_variable2;
	data_to_save.float_data[2] = float_variable3;
	data_to_save.float_data[3] = float_variable4;

	data_to_save.int_data[0] = int_variable1;
	data_to_save.int_data[1] = int_variable2;
	data_to_save.int_data[2] = int_variable3;
	data_to_save.int_data[3] = int_variable4;	

//	my_flash_write();//写入的时候就可以把这个注释取消。
	my_flash_read();//读取的时候就可以把这个注释取消。

由于在.h文件的函数my_flash_read()中有fff这个全局变量,所以当你写入以后,断电,再重新烧录读取的那个代码就可以在调试窗口中看到那个全局变量的值是你存进去的值!!!!!


总结

本文讲述了STM32CubeMX-ADC Hal库 内部Flash掉电存储
也说明了如何存储和读取不同类型数据,希望对你有所帮助。文章来源地址https://www.toymoban.com/news/detail-649795.html

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

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

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

相关文章

  • STM32F103C8T6(HAL库函数 - 内部Flash操作)

    STM32F103C8T6 内部Flash 为 64KB,本次将对他多余空间进行读写。 数据手册下载 STM32F103x8/STM32F103xB 数据手册 包含Flash Memory Page分布 STM32F设备命名 设备容量类型 中容量类型 内部空间介绍 Flash Memory 从 0x0800 0000 ~ 0x0801 FFFF 页分布1K每页, STM32F103C8T6 只有64KByte, 那就是64页 使用 controll

    2024年01月21日
    浏览(58)
  • STM32 CubeMX ADC采集 单通道,多通道,内部温度(轮询,DMA,中断)(HAL库)

    12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部 信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右 对齐方式存储在16位数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定

    2024年02月06日
    浏览(78)
  • STM32实现数据掉电存储

            在嵌入式系统中,实现数据的掉电存储通常是为了确保关键数据在系统断电或重启时不会丢失。 实现方式:数据量不大时将数据保存在片内flash中。(注意flash的读写寿命) 一、STM32内部flash简介         STM32 芯片内部有一个 FLASH 存储器,它主要用于存储代码

    2024年02月03日
    浏览(30)
  • STM32内部Flash

    目录 一、内部Flash简介 二、内部Flash构成 1. 主存储器 2. 系统存储区 3. 选项字节 三、内部Flash写入过程 1. 解锁 2. 页擦除 3. 写入数据 四、工程空间分布 某工程的ROM存储器分布映像: 1. 程序ROM的加载与执行空间 2. ROM空间分布表         STM32芯片内部有一个Flash存储器,主要

    2024年02月19日
    浏览(47)
  • stm32读写内部Flash

    因为我的stm32f407的内部flash是1M的所以块2不存在,但他的地址仍然存在,只是没有作用,这是stm32的整体框架。    一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域,它是存储用户应用程序的空间,芯片型号说明中的 1M FLASH、2M FLASH 都是指这个区域的大小。 主存储

    2024年02月01日
    浏览(32)
  • STM32内部flash详解(1)

    今天说一下STM32中的内部flash。 当我们把写好的代码下载MCU中,这个代码时存放在flash中的。当芯片重启复位上电后,会通过内核对flash进行代码的加载运行。大致是这个过程。 flash读操作 flash编程/擦除操作 读写保护 I-Code 上的预取操作 I-Code 上的 64 个缓存(128 位宽) D-Code

    2024年02月04日
    浏览(42)
  • STM32 使用HAL库操作FLASH

    本文参考 :STM32CubeMX学习笔记(51)——读写内部Flash - 简书 STM32F103C8T6 stmhalflash.h stmhalflash.c 使用示例

    2024年02月12日
    浏览(37)
  • 【11】STM32·HAL库开发-STM32CubeMX简介、安装 | 新建STM32CubeMX工程步骤

      STM32CubeMX是ST开发的一款图形配置工具,可通过配置自动生成 初始化代码 (并不包括逻辑代码)。以下是STM32CubeMX官方宣传图片,适用于Windows和macOS系统,用于生成初始化代码,一个图形配置工具,搭配不同系列的STM32Cube固件包,即可支持不同系列的STM32芯片,初始化代码

    2024年02月17日
    浏览(59)
  • STM32 HAL库 STM32CubeMX -- SPI

    SPI (Serial Peripheral Interface)协议,即串行外围设备接口,是一种高速全双工的通信总线。 它被广泛地使用在ADC、LCD 等设备与MCU 间,要求通讯速率较高的场合。 SPI 通讯使用3 条总线及片选线, 3 条总线分别为SCK、MOSI、MISO,片选线为SS(CS) ,它们的作用介绍如下: (1) SS( Slav

    2024年02月13日
    浏览(47)
  • STM32 HAL库 STM32CubeMX -- ADC

    ADC(Analog-to-Digital Converter)指模/数转换器或者模拟/数字转换器。 是指将连续变量的模拟信号转换为离散的数字信号的器件。 也就是将 模拟信号 转化为 数字信号 。 STM32f103 系列有3 个ADC,精度为12 位,每个ADC 最多有16 个外部通道和2个内部信号源。其中ADC1 和ADC2 都有16 个外部

    2024年02月15日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包