AT32F405支持QPI外设,挂载FLASH可以方便存储设备日志和历史数据。
今天测试一下QPI操作FLASH的速度,板载16MB SPI-FLASH。
测试代码如下:
if (1 == nortst.check_req)
{
uint32_t amount = nortst.amount;
uint32_t ticks;
// 写入数据
uint32_t dats = nortst.dat = nortst.dat_first;
flash_dbg_print("nor flash check : start : R/W : %dMB\n", amount / (1024 * 1024));
ticks = app_tick_get();
for (nortst.addr = nortst.addr_start; nortst.addr < amount + nortst.addr_start; nortst.addr += SPI_NOR_PAGE_SIZE)
{
if (nortst.addr % SPI_NOR_SECTOR_SIZE == 0)
{
bsp_snor_sector_erase(nortst.addr);
}
for (int index = 0; index < SPI_NOR_PAGE_SIZE / 4; index++)
{
nortst.buff[index].uVal = nortst.dat++;
}
// 写入一页数据
bsp_snor_write(nortst.addr, SPI_NOR_PAGE_SIZE, nortst.buff[0].v);
if (0 == (nortst.addr & 0x03FFFF))
{
flash_dbg_print("nor flash check write data: %d %% \n", (nortst.addr - nortst.addr_start) * 100 / amount);
}
if (!nortst.check_req)
break;
}
flash_dbg_print("nor flash write end: time : %d ms \n", app_tick_get() - ticks);
// 读回校验
ticks = app_tick_get();
nortst.dat = dats;
for (nortst.addr = nortst.addr_start; nortst.addr < amount + nortst.addr_start; nortst.addr += SPI_NOR_PAGE_SIZE)
{
if (nortst.addr % SPI_NOR_SECTOR_SIZE == 0)
{
// 读取一扇区数据
bsp_snor_read(nortst.addr, SPI_NOR_SECTOR_SIZE, nortst.buff[0].v);
for (int index = 0; index < SPI_NOR_SECTOR_SIZE / 4; index++)
{
if (nortst.buff[index].uVal != nortst.dat)
{
nortst.err++;
}
nortst.dat++;
}
if (nortst.err)
{
flash_dbg_print("nor flash check err: %d [url=home.php?mod=space&uid=72445]@[/url] %x \n", nortst.err, nortst.addr);
nortst.err = 0;
}
}
if (!nortst.check_req)
break;
}
nortst.check_req = 0;
flash_dbg_print("nor flash read and check end : time : %d ms\n", app_tick_get() - ticks);
set_u32(nortst.buff, 0, 4096 / 4);
nortst.chk_cnt++;
if (nortst.err)
nortst.chk_err_cnt++;
}
其主要功能是根据指定地址和数量写入数据,然后读取并验证数据是否损坏。
测试结果如下:
QPI时钟频率配置为54MHz。
控制台输入 nor check 4
测试4MB数据读写,写入耗时35s,大约100+KB/s。
读取并验证耗时:239ms,换算速度约16.7MB/s,这个速度相当可观。
下面附上测试代码:
AT32F405_EVAL.rar
(8.51 MB)
|