STM32内部的EEPROM其实是Flash模拟的,也就是会占用程序的存储空间,下载的程序也放在这个地方,不过L系列单独给eeprom分配的有位置,理论上所有的STM32都可以使用这个方法,但是要注意程序越大占用的空间越多,不要和程序覆盖在一起。
大家可能使用的型号都不同,我们首先在官网下载对应型号的参考手册
网址:意法半导体STM | STM32/STM8微控制器 | MCU单片机
STEP.2
打开pdf文档找到"Flash program memory and data EEPROM (FLASH)"
这里有详细的说明
找到对应的内存的设备
示意:
L071是196KB的所以是这个表格
STEP.3
开始编程(基于HAL库)
定义一个函数,像这样:
再由参考手册宏定义一下这两个eeprom的地址:
PS:如果是没有eeprom的stm32,只要程序不是足够大,可以把地址改成Flash的最后几页(避免和程序冲突导致错误),解锁上锁函数也要分别改为
HAL_FLASH_Unlock(void);
HAL_FLASH_Lock(void);
每次对其写数据要先解锁,用完再上锁。
读写函数:
这里读写的是8bit的数据,如果要用16,32bit的数据类型
直接改数据类型就可以啦!
使用方法:
代码:
#ifndef __EEPROM_H
#define __EEPROM_H
#include "main.h"
//MAX_3KB
#define MCU_Start_Address_Bank1 0x08080000
//MAX_3KB
#define MCU_Start_Address_Bank2 0x08080C00
void Flash_Write(uint32_t Address,uint8_t *Data,uint8_t Length);
void Flash_Read(uint32_t Address,uint8_t *Data,uint8_t Length);
#endif
#include "eeprom.h"
//max 3KB// 地址 数据 长度*/
void Flash_Write(uint32_t Address,uint8_t *Data,uint8_t Length)
{
HAL_FLASHEx_DATAEEPROM_Unlock();//解锁Flash
for(uint8_t i=0;i< Length;i++)
{
/* 数据类型 数据类型 */
*(__IO uint8_t *)Address = (uint8_t) Data[i];
Address+=1;
}
HAL_FLASHEx_DATAEEPROM_Lock();//上锁Flash
}//羊羊课代表
//max 3KB// 地址 数据 长度*/
void Flash_Read(uint32_t Address,uint8_t *Data,uint8_t Length)
{
for(uint8_t i=0;i< Length;i++)
{
/* 数据类型 */
Data[i]=*(__IO uint8_t *)Address;
Address+=1;
}
}//羊羊课代表