首页 > 其他分享 >stm32永久保存一些参数

stm32永久保存一些参数

时间:2023-06-07 13:35:11浏览次数:34  
标签:Flash FLASH 存储器 写入 永久 stm32 参数 HAL

 

如果需要在程序中永久保存一些参数,可以利用STM32的Flash存储器作为自定义存储器区域。在保存参数时,可以将参数按照一定的编码格式打包成一个字节数组(例如采用结构体表示),然后按照一定的规则写入Flash存储器。

1、定义参数结构体

定义一个结构体存放要保存的参数。例如,假设要保存两个参数,一个浮点数和一个整型数,可以定义如下结构体:

// 定义保存参数的结构体
typedef struct {
    float param1; // 浮点型参数
    int param2;   // 整型参数
} Parameters;

 

2、设置Flash存储器地址

在程序中设置Flash存储器的起始地址。可以定义一个常量来表示Flash存储器的起始地址,例如:

#define FLASH_BASE_ADDR 0x08004000 // 要保存的地址从0x08004000开始

 

3、计算存储器地址

在写入参数前,计算参数要保存的地址。可以定义一个变量(或常量)表示参数在Flash中的偏移量,例如:

#define PARAMS_OFFSET 0x40 // 参数在Flash中的偏移量为64字节

然后根据偏移量和存储器起始地址计算要保存的地址,例如:

uint32_t flash_addr = FLASH_BASE_ADDR + PARAMS_OFFSET; // 计算要保存的地址

  

4、擦除Flash存储器

在写入参数前,需要先将存储器的相关页进行擦除操作。可以借助HAL库函数来完成操作,例如:

FLASH_EraseInitTypeDef erase_config;
erase_config.TypeErase = FLASH_TYPEERASE_PAGES;
erase_config.PageAddress = FLASH_BASE_ADDR;
erase_config.NbPages = 1;
uint32_t page_error = 0;
HAL_FLASHEx_Erase(&erase_config, &page_error);

 

5、写入Flash存储器

在进行擦除操作后,可以使用 HAL_FLASH_Program() 函数将参数写入Flash存储器中,在写入前需要先解锁Flash存储器。例如:

// 解锁Flash存储器
HAL_FLASH_Unlock();

// 写入参数
Parameters params_to_save = {.param1 = 3.14, .param2 = 123};
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, flash_addr, *(uint32_t *)&params_to_save);
flash_addr += sizeof(Parameters);

// 再写入参数
Parameters another_params_to_save = {.param1 = 1.3, .param2 = 456};
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, flash_addr, *(uint32_t *)&another_params_to_save);

// 锁定Flash存储器
HAL_FLASH_Lock();

在上述代码中,首先解锁Flash存储器;然后定义要保存的参数,使用 HAL_FLASH_Program() 函数将参数写入Flash存储器中,每次写入一个字。写入后更新 flash_addr 变量,准备写入下一个参数。最后再次锁定Flash存储器。

在读取Flash存储器中的参数时,也可以采用类似的方法,计算出参数在Flash中的地址,取出来的数据需要按照存储时的编码格式进行解码。

 

标签:Flash,FLASH,存储器,写入,永久,stm32,参数,HAL
From: https://www.cnblogs.com/Bingley-Z/p/17463058.html

相关文章

  • stm32 adc采样滤波算法
     1、简单移动平均滤波算法(SMA):采样数据作为滤波器的输入,输出为移动平均值,即取最近一段采样值的平均值作为输出。简单移动平均滤波算法实现简单,计算速度快,但只适用于信号变化缓慢的场合。//简单移动平均滤波算法#defineN10//采样点数floatFilter_Arr[N];//保存过去N个......
  • STM32F429 Discovery开发板应用:实现SPI-SD Card文件写入(搭载FatFS文件系统)
    MCU:STM32F429ZIT6开发环境:STM32CubeMX+MDK5 外购了一个SPI接口的SDCard模块,想要实现SD卡存储数据的功能。首先需要打开STM32CubeMX工具。输入开发板MCU对应型号,找到开发板对应封装的MCU型号,双击打开(图中第三)。 此时,双击完后会关闭此界面,然后打开一个新界面。 ......
  • STM32CubeIDE 使用Ymodem协议通过串口在线更新程序IAP
    一:单片机的BootLoaderBootloader部分移植ST官网的例程,官网例程的IAP有多个文件,为了移植方便我把多个文件合成了一个ymodem.c文件和ymodem.h文件 /**ymodem.c**Createdon:Jun6,2023*Author:MingYi-LZQ*/#include"main.h"#include"ymodem.h"/*......
  • 野火STM32第35章 SDIO读写测试 实验过程犯的错误:卡在while(SD_GetStatus() != SD_TRAN
    看完书,我自己重新写了一遍代码。写代码过程中,对DMA以下标绿的部分很不以为意。1voidSD_DMA_TxConfig(uint32_t*DMA_Tx_Buf,uint32_tBufferSize)2{3DMA_InitTypeDefDMA_InitStruct;45/*ClockEnable-----InGPIOConfig*/67/*Flag......
  • Spring 学习笔记(4)—— Bean 的基本配置、依赖注入(DI)、注入参数引用其他Bean
    一、Bean的基本配置1装配一个Bean在Spring容器的配置文件中定义一个简要Bean的配置片段2Bean的命名二、依赖注入1属性注入属性注入要求Bean提供一个默认的构造函数,并为需要注入的属性提供对应的Setter方法。2构造函数注入按索引匹配入参三、注入参数引用其他Bean......
  • Jmeter-接口请求参数写入数据库后显示问号"???"
    现象:  接口请求参数写入数据库后显示问号"???" 数据库:  解决:jmeter默认使用GBK编码启动,需要自己更改为UTF-8。添加编码后如图     ......
  • python函数的位置参数和关键字参数
    基本类型:(1)位置参数(positional): 传参时不带"变量名=",顺序不可变, 需要按照函数定义时参数的顺序进行传参.(2)关键字参数(keyword):使用key=value形式传参, 传参时前面加上"变量名=",顺序可变,可以不按照函数定时参数的顺序进行传参.(3)可变位置参数(*args):......
  • Jmeter-请求参数类型
    1. 请求参数类型为:application/x-www-form-urlencoded格式在JMeter界面中的参数选项页直接添加参数,发送Post请求的时候,就发送的是x-www-form-urlencoded格式的数据。它是Post提交的默认格式.      请求发送后,可以在查看结果树中,看到请求头和请求......
  • 明解STM32—GPIO应用设计篇之IO外部中断EXTI原理及使用方法
    一、前言        在之前针对STM32的GPIO相关API函数及配置使用进行了详细的介绍,GPIO作为输入引脚时,调用相关读信号引脚函数接口就可以在程序的循环中,轮询的对输入信号进行读取检测操作,除了轮询的方式访问输入引脚,还可以通过另外一种叫做外部中断的方式来对引脚的输入信号进......
  • c++关于 左右值 和 左右值引用 及 函数参数(万能引用,引用折叠,forward完美转发)
    左右值和左右值引用是有区别的。左右值是指对变量类别的区分,左值是有地址的值,可以长期存在;而右值是将亡值,是临时量,没有名字。而左右值引用是指变量的类型,如int&,int&&等,下面举一个例子:voidfunc(int&p){cout<<"&p"<<endl;return;}voidfunc(int&&p){......