OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3017|回复: 3

f429-阿波罗的nand例程,测试下来写的速度比读快,不知是什么问题?

[复制链接]

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2018-3-17
在线时间
9 小时
发表于 2020-3-10 19:21:04 | 显示全部楼层 |阅读模式
1金钱

测试方法:使用 systick 时钟计时,记录写一个 page 的时间和读一个 page 的时间。分别测试100次,最后统计平均值。

测试结果:
write test 100 times
CPU: 180 MHz
Average time: 269.161 us
Maximum time: 399.188 us
Minimum time: 243.300 us

read test 100 times
CPU: 180 MHz
Average time: 296.327 us
Maximum time: 399.188 us
Minimum time: 243.300 us


不知有没有论坛大神做过这个测试。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2018-3-17
在线时间
9 小时
 楼主| 发表于 2020-3-10 19:26:58 | 显示全部楼层
本帖最后由 改个名字 于 2020-3-10 19:29 编辑

这是读写 page 的代码
  1. u8 NAND_ReadPage(u32 PageNum,u16 ColNum,u8 *pBuffer,u16 NumByteToRead)
  2. {
  3.     vu16 i=0;
  4.         u8 res=0;
  5.         u8 eccnum=0;               
  6.         u8 eccstart=0;               
  7.         u8 errsta=0;
  8.         u8 *p;
  9.      *(vu8*)(NAND_ADDRESS|NAND_CMD)=NAND_AREA_A;
  10.     //·¢ËíμØÖ·
  11.     *(vu8*)(NAND_ADDRESS|NAND_ADDR)=(u8)ColNum;
  12.     *(vu8*)(NAND_ADDRESS|NAND_ADDR)=(u8)(ColNum>>8);
  13.     *(vu8*)(NAND_ADDRESS|NAND_ADDR)=(u8)PageNum;
  14.     *(vu8*)(NAND_ADDRESS|NAND_ADDR)=(u8)(PageNum>>8);
  15.     *(vu8*)(NAND_ADDRESS|NAND_ADDR)=(u8)(PageNum>>16);
  16.     *(vu8*)(NAND_ADDRESS|NAND_CMD)=NAND_AREA_TRUE1;
  17.    
  18.         res=NAND_WaitRB(0);                        //μè′yRB=0
  19.     if(res)return NSTA_TIMEOUT;        
  20.         res=NAND_WaitRB(1);                        //μè′yRB=1
  21.     if(res)return NSTA_TIMEOUT;        //3¬ê±íË3ö
  22.         if(NumByteToRead%NAND_ECC_SECTOR_SIZE)
  23.         {
  24.                 //¶áè¡NAND FLASHÖDμÄÖμ
  25.                 for(i=0;i<NumByteToRead;i++)
  26.                 {
  27.                         *(vu8*)pBuffer++ = *(vu8*)NAND_ADDRESS;
  28.                 }
  29.         }else
  30.         {
  31.                 eccnum=NumByteToRead/NAND_ECC_SECTOR_SIZE;                        //μ&#195;μ&#189;ecc&#188;&#198;&#203;&#227;′&#206;êy
  32.                 eccstart=ColNum/NAND_ECC_SECTOR_SIZE;
  33.                 p=pBuffer;
  34.                 for(res=0;res<eccnum;res++)
  35.                 {
  36.                         FMC_Bank2_3->PCR3|=1<<6;                                                //ê1&#196;üECCD£&#209;é
  37.                         for(i=0;i<NAND_ECC_SECTOR_SIZE;i++)                                //&#182;áè&#161;NAND_ECC_SECTOR_SIZE&#184;&#246;êy&#190;Y
  38.                         {
  39.                                 *(vu8*)pBuffer++ = *(vu8*)NAND_ADDRESS;
  40.                         }               
  41.                         while(!(FMC_Bank2_3->SR3&(1<<6)));                                //μè′yFIFO&#191;&#213;        
  42.                         nand_dev.ecc_hdbuf[res+eccstart]=FMC_Bank2_3->ECCR3;//&#182;áè&#161;ó2&#188;t&#188;&#198;&#203;&#227;oóμ&#196;ECC&#214;μ
  43.                         FMC_Bank2_3->PCR3&=~(1<<6);                                                //&#189;&#251;&#214;1ECCD£&#209;é
  44.                 }
  45.                 i=nand_dev.page_mainsize+0X10+eccstart*4;                        //′óspare&#199;&#248;μ&#196;0X10&#206;&#187;&#214;&#195;&#191;aê&#188;&#182;áè&#161;&#214;&#174;&#199;°′&#230;′¢μ&#196;ecc&#214;μ
  46.                 NAND_Delay(30);//μè′ytADL
  47.                 *(vu8*)(NAND_ADDRESS|NAND_CMD)=0X05;                                //&#203;&#230;&#187;ú&#182;á&#214;&#184;á&#238;
  48.                 //·¢&#203;íμ&#216;&#214;·
  49.                 *(vu8*)(NAND_ADDRESS|NAND_ADDR)=(u8)i;
  50.                 *(vu8*)(NAND_ADDRESS|NAND_ADDR)=(u8)(i>>8);
  51.                 *(vu8*)(NAND_ADDRESS|NAND_CMD)=0XE0;                                //&#191;aê&#188;&#182;áêy&#190;Y
  52.                 NAND_Delay(30);//μè′ytADL
  53.                 pBuffer=(u8*)&nand_dev.ecc_rdbuf[eccstart];
  54.                 for(i=0;i<4*eccnum;i++)                                                                //&#182;áè&#161;±£′&#230;μ&#196;ECC&#214;μ
  55.                 {
  56.                         *(vu8*)pBuffer++= *(vu8*)NAND_ADDRESS;
  57.                 }                        
  58.                 for(i=0;i<eccnum;i++)                                                                //&#188;ì&#209;éECC
  59.                 {
  60.                         if(nand_dev.ecc_rdbuf[i+eccstart]!=nand_dev.ecc_hdbuf[i+eccstart])//2&#187;&#207;àμè,DèòaD£&#213;y
  61.                         {
  62.                                 printf("err hd,rd:0x%x,0x%x\r\n",nand_dev.ecc_hdbuf[i+eccstart],nand_dev.ecc_rdbuf[i+eccstart]);
  63.                                  printf("eccnum,eccstart:%d,%d\r\n",eccnum,eccstart);        
  64.                                 printf("PageNum,ColNum:%d,%d\r\n",PageNum,ColNum);        
  65.                                 res=NAND_ECC_Correction(p+NAND_ECC_SECTOR_SIZE*i,nand_dev.ecc_rdbuf[i+eccstart],nand_dev.ecc_hdbuf[i+eccstart]);//ECCD£&#209;é
  66.                                 if(res)errsta=NSTA_ECC2BITERR;                                //±ê&#188;&#199;2BIT&#188;°ò&#212;é&#207;ECC′í&#206;ó
  67.                                 else errsta=NSTA_ECC1BITERR;                                //±ê&#188;&#199;1BIT ECC′í&#206;ó
  68.                         }
  69.                 }                 
  70.         }
  71.     if(NAND_WaitForReady()!=NSTA_READY)errsta=NSTA_ERROR;        //ê§°ü
  72.     return errsta;        //3é1|   
  73. }
复制代码

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-3-11 00:41:34 | 显示全部楼层
看FSMC的配置,另外,ST的FSMC性能是比较垃圾的,你配置的不一定就是你得到的结果,所以,只能修改值观察结果。
回复

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-4-12
在线时间
6 小时
发表于 2020-3-16 18:50:55 | 显示全部楼层
一个page是2048个字节,读一个page有这么快?我的为啥是35ms?楼主确定没把单位搞错?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 05:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表