HAL库STM32内部EEPROM保存结构体

1、首先说一下初衷,有些程序的配置信息等需要永久保存,比如密码,用户配置,断电后不丢失,一般情况都会选择外部挂个E2PROM器件,常见的就是24C02了,单是STM32内部的程序存储器也是可以掉电保存的,不像外挂存储器的就可以用内部没有用到的FLASH来保存这些配置信息。虽然省了外挂器件节省了PCB空间和成本,但是也有缺点,读写次数或者刷程序时意外擦除,不能按字节操作等,有大神测试过速度,次数等并不是很逊色。根据情况自己选择吧。

2、根据数据手册,STM32系列将4G内存空间进行存储器映射,其中地址0x0800 000为内部主存储区首地址,也就是常说的内部Flash首地址,根据型号不同Flash内存大小不同, 

在此以C8T6为例举例,其他的可以查看数据手册存储器映射部分C8为中容量产品,64K的Flash,也就是ROM内存地址为0x0800 0000-0X0801 0000共64K,按1K划分页,Flash不像24C02这种器件可以按字节操作,STM32的内部FLASH只能按页操作,而且必须先整页擦除为0xFF,然后再写入,可以按半字,字,双字写入

 从Kei可以看出内部Flash起始地址和大小为0X10000也就是64kByte,还有运行内存RAM也就是起始地址0X2000 0000大小为0X5000(20KB)

再贴一个CubeMX的截图

 3、介绍完接下来开始按操作步骤写程序,先定义一个结构体,建议按照变量占用内存空间大小,从小到大顺序定义因为牵扯到内存对齐问题,可能会占用更大空间,我这里是按照人类更容易理解顺序定义的占用空间略大。#pragmatic pack(1) 可以修改字节对齐数量为1,比较省空间,慎用可能会产生别的问题

typedef struct 
{
uint16_t temperature_set;							//温度设定值
uint8_t rest_time;										//休眠时间
uint8_t sleep_time;										//睡眠时间
uint8_t OLED_Brightness;							/OLED的显示亮度
uint8_t POWER_calibration_point[3];		//电源电压校准点 1 2 3
uint16_t POWER_calibration[3];				//电源电压校准值1 2 3
uint16_t T12_calibration_point[9];		//电源电压校准点1-9
uint16_t T12_calibration[9];					//温度转换的校准值100 150 200 250 300 350 400 450 500
}system_set_struct;

 再进行初始化

system_set.OLED_Brightness=200;
system_set.rest_time=2;
system_set.sleep_time=5;
system_set.temperature_set=300;

 这里我将64K就是64页起始地址都宏定义了,你们可以不用这么麻烦

/* Base address of the Flash sectors STM32F103C8 64KB ROM 0x08000000-0x08010000*/ 
#define ADDR_FLASH_SECTOR_0     ((uint32_t)0x08000000) /* Base add
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_43175613

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值