STM32L0 内部FLASH和EEPROM写读

孤街醉人 提交于 2020-01-02 12:39:47

STM32L0 内部FLASH和EEPROM写读

说明

STM32L0内部的FLASH和EEPROM访问方式一致,写操作由解锁,擦除,写入,加锁过程组成,读过程则无需解锁。至于STM32L0内部的非易失空间区分为FLASH和EEPROM,主要体现在用ST-LINK等工具进行整片擦除时,只擦除FLASH的空间,EEPROM的部分不会被擦除,如同外部EEPROM芯片,MPU的代码升级不影响EEPROM的内容。后面以内部EEPROM的写读作为范例。

基础写读函数

定义内部EEPROM的地址空间:

//STM32L031K6T6
#define EEPROM_BASE_ADDR	0x08080000
#define EEPROM_BYTE_SIZE	0x03FF

基础字节写函数

//Byte write
void FLASHEx_EEPROM_WRITE(uint16_t BiasAddress, uint8_t *Data, uint8_t len)
{
	uint8_t i;
	HAL_StatusTypeDef status = HAL_OK;

	HAL_FLASHEx_DATAEEPROM_Unlock();
	for(i=0;i<len;i++)
	{
		status +=HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE, EEPROM_BASE_ADDR+BiasAddress+i, *Data);
		Data++;
	}
	HAL_FLASHEx_DATAEEPROM_Lock();
}

基础字节读函数

//Byte read
void FLASHEx_EEPROM_READ(uint16_t BiasAddress,uint8_t *Buffer,uint16_t Length)
{
	uint8_t *wAddr;
	wAddr=(uint8_t *)(EEPROM_BASE_ADDR+BiasAddress);
	while(Length--)
	{
		*Buffer++=*wAddr++;
	}
}

可靠性增强写读函数

如果考虑到写读过程中,可以出现错误的情况,为了保证操作的正确性,需要采用校验方式进行写读。
对于写过程,需要将写入的数据,读回做比较。
对于读过程,需要将两次读回的数据,进行比较。
如果比较正确,则操作完成。
如果错误,可重新进行写或读操作,并在设定的重新操作次数范围内,进行重新操作识别,如果正确,则报告正确,如果错误,则报告错误。

设定重复校验次数

#include <string.h>
#define iEEPROM_CHECK_NUM 2

带操作校验的写函数

HAL_StatusTypeDef EEPROM_WRITE_W_CHECK(uint16_t BiasAddress, uint8_t *Data, uint8_t len)
{
	uint8_t buff[len];
	uint8_t i;
	for (i=0;i<iEEPROM_CHECK_NUM;i++)
	{
		FLASHEx_EEPROM_WRITE(BiasAddress, Data, len);
		FLASHEx_EEPROM_READ(BiasAddress, buff, len);
		if (memcmp(Data, buff, len)==0)
		{
			return HAL_OK;
		}
	}

	return HAL_ERROR;
}

带操作校验的读函数

HAL_StatusTypeDef EEPROM_Read_W_CHECK(uint16_t BiasAddress, uint8_t *Data, uint8_t len)
{
	uint8_t buff0[len];
	uint8_t buff1[len];
	uint8_t i;
	for (i=0;i<iEEPROM_CHECK_NUM;i++)
	{
		FLASHEx_EEPROM_READ(BiasAddress, buff0, len);
		FLASHEx_EEPROM_READ(BiasAddress, buff1, len);

		if (memcmp(buff0, buff1, len)==0)
		{
			memcpy(Data, buff0, len);
			return HAL_OK;
		}
	}

	return HAL_ERROR;
}

其中BiasAddress为0对应内部EEPROM的0地址(EEPROM_BASE_ADDR定义了其基址),Data为数据字节指针,len为操作字节长度。

-End-

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!