stm32F030 FLASH 模拟eeprom代码 ,使用hal库写
时间: 2024-01-14 14:04:49 浏览: 161
以下是使用HAL库编写的STM32F030 FLASH模拟EEPROM代码:
```c
#include "main.h"
#include "stm32f0xx_hal.h"
//定义存储的地址
#define EEPROM_START_ADDRESS ((uint32_t)0x08007800) /* 0x08007800 - 0x08007FFF */
//定义存储的数据结构
typedef struct {
uint32_t value1;
uint32_t value2;
uint32_t value3;
} EEPROM_DataTypeDef;
//定义EEPROM数据变量
EEPROM_DataTypeDef EEPROM_Data = {0};
//定义FLASH操作变量
FLASH_EraseInitTypeDef EraseInitStruct;
uint32_t PageError = 0;
//定义函数原型
void EEPROM_Init(void);
void EEPROM_WriteData(EEPROM_DataTypeDef *data);
void EEPROM_ReadData(EEPROM_DataTypeDef *data);
int main(void)
{
HAL_Init();
EEPROM_Init();
//写入数据
EEPROM_Data.value1 = 0xAA;
EEPROM_Data.value2 = 0xBB;
EEPROM_Data.value3 = 0xCC;
EEPROM_WriteData(&EEPROM_Data);
//读取数据
EEPROM_ReadData(&EEPROM_Data);
while (1)
{
}
}
void EEPROM_Init(void)
{
//使能FLASH时钟
__HAL_RCC_FLASH_CLK_ENABLE();
//解锁FLASH
HAL_FLASH_Unlock();
//初始化FLASH擦除结构体
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.PageAddress = EEPROM_START_ADDRESS;
EraseInitStruct.NbPages = 1;
//擦除指定FLASH页面
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)
{
while (1)
{
}
}
//加锁FLASH
HAL_FLASH_Lock();
}
void EEPROM_WriteData(EEPROM_DataTypeDef *data)
{
//解锁FLASH
HAL_FLASH_Unlock();
//写入数据
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, EEPROM_START_ADDRESS, data->value1) != HAL_OK)
{
while (1)
{
}
}
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, EEPROM_START_ADDRESS + 4, data->value2) != HAL_OK)
{
while (1)
{
}
}
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, EEPROM_START_ADDRESS + 8, data->value3) != HAL_OK)
{
while (1)
{
}
}
//加锁FLASH
HAL_FLASH_Lock();
}
void EEPROM_ReadData(EEPROM_DataTypeDef *data)
{
//读取数据
data->value1 = (*(__IO uint32_t *)EEPROM_START_ADDRESS);
data->value2 = (*(__IO uint32_t *)(EEPROM_START_ADDRESS + 4));
data->value3 = (*(__IO uint32_t *)(EEPROM_START_ADDRESS + 8));
}
```
这段代码实现了将一个数据结构存储在FLASH中,并可以读取出来。其中,EEPROM_Init()函数用于初始化FLASH操作,EEPROM_WriteData()函数用于将数据写入FLASH,EEPROM_ReadData()函数用于从FLASH中读取数据。
需要注意的是,STM32F030的FLASH大小为64KB,其中EEPROM存储区域为2KB,地址范围为0x08007800 - 0x08007FFF。在使用前需确保该区域没有被其他程序使用。同时,在读取数据时需要将地址转换成指针并使用指针读取数据。
阅读全文