50.4. Eeprom hal emulation 功能测试
50.4.1. 概述
本示例演示如何使用 EEPROM HAL 驱动接口访问 EEPROM 存储。默认使用 e2p_emulation 组件(基于 Flash 的 EEPROM 模拟),因此无需外接物理 EEPROM 硬件。同一套 HAL API 也可通过注册其他驱动用于物理 EEPROM 设备。
50.4.2. 板级设置
使用模拟后端时无需额外硬件(使用板载 NOR Flash)。
50.4.3. 配置说明
模拟相关参数在 main.c 中定义:
宏 |
说明 |
|---|---|
BOARD_APP_EEPROM_EMU_ERASE_SIZE |
Flash 擦除单元大小(默认 4096 字节) |
BOARD_APP_EEPROM_EMU_SECTOR_COUNT |
扇区数量,必须为偶数(默认 32) |
BOARD_APP_EEPROM_EMU_START_ADDR |
模拟区域起始地址(由 Flash 大小及上述参数推导) |
模拟区域位于板载 NOR Flash 末尾(双半区设计,用于掉电保护)。
50.4.4. 测试内容
示例运行两类测试:
基本 I/O(小块写入)
在固定地址(如 0x42)单字节写入与读取
非对齐小块写入(地址 5 处 7 字节)并读回校验
大块、跨页、非对齐 I/O
从非对齐地址 0xA 写入 150 字节
验证跨页与防回卷行为
读回并比较数据
测试均通过 HAL API:hpm_eeprom_write_block() 与 hpm_eeprom_read_block() 完成。
50.4.5. 使用步骤
将模拟参数注册到设备结构体:
e2p_emu_xpi_host_config_t emu_host = { .base = BOARD_APP_XPI_NOR_XPI_BASE }; e2p_emu_xpi_attribute_config_t emu_config = { .flash_base_addr = BOARD_FLASH_BASE_ADDRESS, .version = 0x4553, .opt_header = BOARD_APP_XPI_NOR_CFG_OPT_HDR, .opt0 = BOARD_APP_XPI_NOR_CFG_OPT_OPT0, .opt1 = BOARD_APP_XPI_NOR_CFG_OPT_OPT1, .start_addr = BOARD_APP_EEPROM_EMU_START_ADDR, .erase_size = BOARD_APP_EEPROM_EMU_ERASE_SIZE, .sector_cnt = BOARD_APP_EEPROM_EMU_SECTOR_COUNT, }; hpm_eeprom_device_t dev = { .host = &emu_host, .flag = EEPROM_FLAG_EMULATION_XPI, .config = &emu_config, }; e2p_emulation_xpi_register_param(&dev);
向 HAL 注册设备并打开:
hpm_eeprom_register(&dev, "e2p_test"); hpm_eeprom_device_t *device = hpm_eeprom_find("e2p_test"); hpm_eeprom_init(device);
使用 HAL 读写 API:
hpm_eeprom_write_block(device, addr, len, data); hpm_eeprom_read_block(device, addr, len, buf);
50.4.6. 运行示例
工程运行后,串口会输出初始化与测试结果。使用 e2p_emulation 组件时,初始化输出类似:
EEPROM HAL sample test start.
------------ flash->eeprom init ok -----------
start address: 0x80fc0000
sector count: 16
flash erase granularity: 4096
version: 0x4553
end address: 0x80fd0000
data write addr = 0x80fc013c, info write addr = 0x80fcff84, remain flash size = 0xfe48
valid count percent info count( 3 / 6 )
----------------------------------------------
随后为测试输出:
--- Running Test: Basic I/O (Small Writes) ---
Testing single byte write at a known-good address (e.g., 0x42)...
[PASS] Single Byte I/O: Data verified successfully.
Testing a small, non-aligned write...
[PASS] Small Non-aligned Write: Data verified successfully.
--- [PASS] Basic I/O (Small Writes) ---
--- Running Test: Large Block, Multi-Page, Non-Aligned I/O ---
Writing a large block (150 bytes) from a non-aligned address (0xA)...
[PASS] Large Block Verification: Data verified successfully.
--- [PASS] Large Block, Multi-Page, Non-Aligned I/O ---
Result: ALL TESTS PASSED!
EEPROM HAL sample test done.