Demo:Flash

来自Bouffalo Lab Docs
(重定向自Demo:Flash
跳转到导航 跳转到搜索

Demo介绍:

这部分Demo放在SDK下的 bouffalo_sdk/examples/peripherals/flash/ 路径下。

主要测试 flash 闪存的基本IO,加密功能,XIP功能。

flash_iomode:

该部分代码验证 flash 硬件的擦除功能;读出功能;写入功能,以此验证了软硬件功能的正确性和完整性。

该demo以不同的SPI通信模式来测试了基本的io

模式说明:

模式 全称 数据线数量 特点 应用场景
NIO Normal I/O 1线 标准SPI模式,单向传输 基本应用
DO Dual Output 2线 输出时使用双线 中等速度需求
QO Quad Output 4线 输出时使用四线 高速读取
DIO Dual I/O 2线 输入输出都使用双线 高速双向
QIO Quad I/O 4线 输入输出都使用四线 最高性能

性能测试

测量操作:擦除+写入+读取的总时间;比较不同I/O模式的性能差异

start_time = bflb_mtimer_get_time_ms();
//....
printf("cost time:%lld ms\r\n", (bflb_mtimer_get_time_ms() - start_time));

地址选择: 避开Bootloader区域;使用用户可编程区域

#define FLASH_RW_START_ADDR 0x10000

部分输出:

===========================
uart  sig1:ffffffff, sig2:0000f32f
clock gen1:9ffffffd, gen2:0fff0c11
xtal:40000000Hz(crystal)
board init done
===========================
select flash iomode:NIO
cost time:47 ms
flash data check success
select flash iomode:DO
cost time:44 ms
flash data check success
select flash iomode:QO
cost time:44 ms
flash data check success
select flash iomode:DIO
cost time:42 ms
flash data check success
select flash iomode:QIO
cost time:50 ms
flash data check success
flash io case success

flash_sucre_write_read:

这部分代码分为四部分:

首先进行了AES模块的加密功能性测试,然后对flash进行基本的功能性测试,最后使用flash_aes 解密测试和 AES模块解密测试。

测试内容总结:

测试阶段 测试内容 验证目的
基础AES测试 CTR模式加解密 硬件AES功能正常性
Flash读写测试 加密数据存储/读取 Flash驱动可靠性
Flash AES测试 实时解密功能 Flash AES模块正确性
分段解密测试 多段解密与IV管理 CTR模式连续操作能力

关键数据解释:

// AES-CTR 128位密钥
uint8_t aes_ctr_128bit_key[16] = {
    0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
    0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
};

// AES-CTR 128位初始化向量
uint8_t aes_ctr_128bit_iv[16] = {
    0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};


ATTR_NOCACHE_NOINIT_RAM_SECTION uint8_t aes_ctr_pt_buffer[AES_DATA_LEN];   // 明文
ATTR_NOCACHE_NOINIT_RAM_SECTION uint8_t aes_ctr_ct_buffer[AES_DATA_LEN];   // 密文
ATTR_NOCACHE_NOINIT_RAM_SECTION uint8_t aes_ctr_tmp_buffer[AES_DATA_LEN];  // 缓冲区
ATTR_NOCACHE_NOINIT_RAM_SECTION uint8_t aes_ctr_tmp_buffer2[AES_DATA_LEN]; // 缓冲区2

部分输出:

===========================
uart  sig1:ffffffff, sig2:0000f32f
clock gen1:9ffffffd, gen2:0fff0c11
xtal:40000000Hz(crystal)
board init done
===========================
aes ctr128 encrypt & decrypt success
flash write & read success
flash decrypt with flash aes ctr128 success
flash decrypt with sec eng aes ctr128 success
flash test success

flash_read_write:

该部分代码对 flash 进行基本的读写测试:

部分输出:

===========================
uart  sig1:ffffffff, sig2:0000f32f
clock gen1:9ffffffd, gen2:0fff0c11
xtal:40000000Hz(crystal)
board init done
===========================
erase addr:00010000
check success
erase addr:00011000
check success
erase addr:00012000
check success
erase addr:00013000
check success
erase addr:00014000
check success
erase addr:00015000
check success
erase addr:00016000
check success
erase addr:00017000
check success
erase addr:00018000
check success
erase addr:00019000
check success
flash read write success

flash_xip_read:

该部分代码主要测试XIP的软硬件支持,测试了大量的数据,从0x00到0xFF 大量数据来测试硬件的可靠性。

XIP读取

通过内存映射地址直接访问Flash,测试代码执行和数据访问的统一性

read_buf = (uint8_t *)(FLASH_XIP_BASE + flash_addr - bflb_flash_get_image_offset())

缓存一致性

每次读取前刷新数据缓存确保获取Flash最新数据,测试缓存管理。

bflb_l1c_dcache_invalidate_range(read_buf, sizeof(write_buf));

部分输出:

erase addr:0008b400
check success
erase addr:0008b800
check success
erase addr:0008bc00
check success
erase addr:0008c000
check success
erase addr:0008c400
check success
erase addr:0008c800
check success
erase addr:0008cc00
check success
erase addr:0008d000
check success
erase addr:0008d400
check success
erase addr:0008d800
check success
erase addr:0008dc00
check success
erase addr:0008e000
check success
erase addr:0008e400
check success
erase addr:0008e800
check success
erase addr:0008ec00
check success
erase addr:0008f000
check success
erase addr:0008f400
check success
erase addr:0008f800
check success
erase addr:0008fc00
check success
flash xip read success

代码将会有很多的输出,因为测量了较为大量的数据。