stm32 写eeprom
时间: 2023-07-20 16:11:09 浏览: 93
在 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` 函数来写入数据。在每次写入数据之前,我们都会检查函数的返回值,以确定写入是否成功。
阅读全文