Demo:Flash
(重定向自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
代码将会有很多的输出,因为测量了较为大量的数据。