stm32f4 eeprom
时间: 2023-09-17 09:09:43 浏览: 47
stm32f4没有自带的EEPROM。但是,可以使用IAP功能将Flash当作EEPROM使用。在这种情况下,可以使用EEPROM的头文件eeprom.h来进行配置和读写操作。在main.c文件中,需要包含eeprom.h头文件,并进行初始化和读写测试。头文件中定义了一些常量和函数,包括EEPROM的配置函数、读函数、写函数以及删除数据函数等。
相关问题
stm32 flash eeprom
STM32F4是一款嵌入式微控制器,它本身没有自带EEPROM。然而,STM32F4具有IAP功能,也就是应用编程功能,可以将FLASH用作类似EEPROM的存储器。在对STM32F4的Flash执行写入或擦除操作期间,任何读取Flash的尝试都会导致总线阻塞,这意味着在进行写入或擦除操作时不能进行数据的读取。在实际发布的产品中,为了防止非法读取,STM32芯片的内部FLASH可以通过改写内部FLASH选项字节中的配置来开启保护功能。在默认状态下,该保护功能是不开启的。
stm32 写eeprom
在 STM32 中,可以使用标准库函数或 HAL 库函数来写入 EEPROM。
以下是使用标准库函数写入 EEPROM 的示例代码:
```c
#include "stm32f4xx.h"
#define EEPROM_START_ADDRESS ((uint32_t)0x08080000) // EEPROM 起始地址
#define EEPROM_PAGE_SIZE ((uint16_t)0x0800) // EEPROM 页面大小
#define EEPROM_SIZE ((uint16_t)0x1000) // EEPROM 大小
void write_to_eeprom(uint16_t* data, uint16_t size)
{
uint32_t eeprom_address = EEPROM_START_ADDRESS;
uint16_t page_address = EEPROM_START_ADDRESS;
FLASH_EraseInitTypeDef erase_init;
uint32_t page_error;
// 擦除整个 EEPROM
erase_init.TypeErase = FLASH_TYPEERASE_PAGES;
erase_init.PageAddress = EEPROM_START_ADDRESS;
erase_init.NbPages = EEPROM_SIZE / EEPROM_PAGE_SIZE;
HAL_FLASH_Unlock();
HAL_FLASHEx_Erase(&erase_init, &page_error);
HAL_FLASH_Lock();
// 写入数据
HAL_FLASH_Unlock();
for (int i = 0; i < size; i++)
{
if (eeprom_address % EEPROM_PAGE_SIZE == 0)
{
// 换页
HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, page_address, 0);
page_address = eeprom_address;
}
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, eeprom_address, *(data + i));
eeprom_address += sizeof(uint16_t);
}
HAL_FLASH_Lock();
}
```
在这个示例代码中,我们使用 `HAL_FLASHEx_Erase` 函数来擦除整个 EEPROM,在写入数据之前,确保 EEPROM 中没有旧数据。然后,我们使用 `HAL_FLASH_Program` 函数来写入数据,每次写入一个 16 位的数据,直到写完整个数据块。
使用 HAL 库函数写入 EEPROM 的示例代码如下:
```c
#include "stm32f4xx_hal.h"
#define EEPROM_START_ADDRESS ((uint32_t)0x08080000) // EEPROM 起始地址
#define EEPROM_PAGE_SIZE ((uint16_t)0x0800) // EEPROM 页面大小
#define EEPROM_SIZE ((uint16_t)0x1000) // EEPROM 大小
void write_to_eeprom(uint16_t* data, uint16_t size)
{
uint32_t eeprom_address = EEPROM_START_ADDRESS;
uint16_t page_address = EEPROM_START_ADDRESS;
FLASH_EraseInitTypeDef erase_init;
uint32_t page_error;
HAL_StatusTypeDef status;
// 擦除整个 EEPROM
erase_init.TypeErase = FLASH_TYPEERASE_PAGES;
erase_init.PageAddress = EEPROM_START_ADDRESS;
erase_init.NbPages = EEPROM_SIZE / EEPROM_PAGE_SIZE;
HAL_FLASH_Unlock();
status = HAL_FLASHEx_Erase(&erase_init, &page_error);
HAL_FLASH_Lock();
if (status != HAL_OK)
{
// 处理错误
}
// 写入数据
HAL_FLASH_Unlock();
for (int i = 0; i < size; i++)
{
if (eeprom_address % EEPROM_PAGE_SIZE == 0)
{
// 换页
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, page_address, 0);
page_address = eeprom_address;
if (status != HAL_OK)
{
// 处理错误
}
}
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, eeprom_address, *(data + i));
eeprom_address += sizeof(uint16_t);
if (status != HAL_OK)
{
// 处理错误
}
}
HAL_FLASH_Lock();
}
```
在 HAL 库函数中,我们使用 `HAL_FLASHEx_Erase` 函数来擦除整个 EEPROM,然后使用 `HAL_FLASH_Program` 函数来写入数据。在每次写入数据之前,我们都会检查函数的返回值,以确定写入是否成功。