返回列表 发新帖我要提问本帖赏金: 50.00元(功能说明)

[AT32F437] AT-START-F437]QSPI flash在QIO noDMA、QIO DMA、以及QPI DMA下性能测试

[复制链接]
78|4
幻境之眼 发表于 2026-3-27 09:57 | 显示全部楼层 |阅读模式

AT-START-F437这块板子板载了一块16MB的QSPI nor flash,接入AT32F437的QSPI控制器。nor flash型号EN25QH128,它和AT32F437的QSPI主控都支持SPI、QIO、DIO、DOUT以及QPI等模式。SPI、DIO、DOUT等因为少用了数据线,所以想都不用想性能肯定不如QIO以及QPI,所以笔者只关心QIO以及QPI性能差别能有多少。同时因为AT32F437的QSPI有DMA加持,那DMA又会影响性能吗?最终决定测试三种case:QIO no DMA、QIO DMA、QPI DMA的读、擦除、写的性能。


注:笔者理解中的QPI和QIO最大区别就是cmd阶段是否也用上4根数据线。


巧合的是雅特力的Firmware Library的示例中就有上述三种待测case的支持代码,分别是

  1. project/at_start_f437/examples/qspi/command_port_using_polling/
  2. project/at_start_f437/examples/qspi/command_port_using_dma
  3. project/at_start_f437/examples/qspi/command_port_using_dma_qpi_mode/

笔者直接利用这三个目录中的qspi_cmd_en25qh128a.c文件,但没用它们的测试用例,而是以nr_micro_shell和FreeRTOS为大环境写了功能测试和性能测量代码,并以nr_micro_shell的命令导出:

  1. static void sf_cmd_init(void)
  2. {
  3.         /* qspi config */
  4.         qspi_config();

  5.         /* switch to cmd port */
  6.         qspi_xip_enable(QSPI1, FALSE);

  7.         /* set sclk */
  8.         qspi_clk_division_set(QSPI1, QSPI_CLK_DIV_4);

  9.         /* set sck idle mode 0 */
  10.         qspi_sck_mode_set(QSPI1, QSPI_SCK_MODE_0);

  11.         /* set wip in bit 0 */
  12.         qspi_busy_config(QSPI1, QSPI_BUSY_OFFSET_0);

  13.         /* enable auto ispc */
  14.         qspi_auto_ispc_enable(QSPI1);

  15.         qspi_nor_init();
  16. }

  17. static void sf_cmd_demo(void)
  18. {
  19.         int i;

  20.         uint8_t *rbuf = pvPortMalloc(SECTOR_SIZE);
  21.         uint8_t *wbuf = pvPortMalloc(SECTOR_SIZE);
  22.         if (!rbuf || !wbuf) {
  23.                 printf("failed to alloc mem\n");
  24.                 vPortFree(rbuf);
  25.                 vPortFree(wbuf);
  26.                 return;
  27.         }

其中sf demo命令就是先擦除一个sector(4KB),然后都会检验是否全0xff,然后再写入数据,再读回和写入数据比较,一致就说明nor flash基本能用了。而sf bench命令更关注性能方面,分别测量以4KB粒度擦除全部16MB时间、写入以及读取全部16MB所有时间。
注:擦除笔者就关心最小粒度的擦除,因为后面要上文件系统,大粒度的擦除比如block erase以及chip erase没什么意义。


编译烧录后,测试如下。

QIO未用DMA:

7411069c4a1c67fd3c.jpg

QIO DMA:

3839369c4a1d2dee87.jpg

QPI DMA:

3889469c4a1ddc4695.jpg

由此看到,QIO与QPI性能数据几乎无差别,性能数据在误差范围内;DMA可以提升读速度大概一倍,DMA可以稍微提升那么一点点写的速度,但幅度很小,估计写的时候瓶颈在nor flash自身吧;DMA反而降低了erase的速度,原因未知,笔者对比了下命令erase在用dma和未用dma情形下是一样的代码和命令,这是预料中的事:erase发个命令过去即可,未有大量数据传输,不会启动dma引擎。



打赏榜单

muyichuan2012 打赏了 50.00 元 2026-03-27
理由:作品优秀

热爱童话世界 发表于 2026-6-12 12:15 | 显示全部楼层
测试结果表明DMA对读取性能的提升明显,但对擦除性能的影响出乎意料。
VelvetStars 发表于 2026-6-17 13:19 | 显示全部楼层
QIO与QPI性能数据几乎无差别,性能数据在误差范围内;DMA可以提升读速度大概一倍,这样看来还是dma好用啊
光影捕手 发表于 2026-6-26 11:01 | 显示全部楼层
热爱童话世界 发表于 2026-6-12 12:15
测试结果表明DMA对读取性能的提升明显,但对擦除性能的影响出乎意料。

那是肯定啊,dma是全自动的,速度效率肯定提高
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

141

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0