你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 7825|回复: 9

请教stm32 FSMC读取NAND速度能多快?我测试到只有不到5Mbyte/S

[复制链接]

1

主题

5

回帖

0

蝴蝶豆

新手上路

最后登录
2018-11-20
发表于 2015-1-14 08:48:26 | 显示全部楼层 |阅读模式
今天在神舟3号开发板上测试STM32F103ZET6使用FSMC来读取NAND flash(HY27UF081G2A)。但是无论如何配置FSMC总线,速度都只能不到5Mbyte/S。我用示波器查看的FSMC_NOE引脚波形。然后我用代码读取2048字节耗时大概500uS(读取前后翻转IO电平)。跟4.5M的速度也比较吻合。具体原理图和代码请参考下图:
原理图.jpg 初始化NAND部分代码.jpg 读NAND函数.jpg


<
回复

使用道具 举报

1

主题

5

回帖

0

蝴蝶豆

新手上路

最后登录
2018-11-20
 楼主| 发表于 2015-1-14 08:49:06 | 显示全部楼层
void FSMC_NAND_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  FSMC_NANDInitTypeDef FSMC_NANDInitStructure;
  FSMC_NAND_PCCARDTimingInitTypeDef  p;
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |
                         RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, ENABLE);
  
/*-- GPIO Configuration ------------------------------------------------------*/
/* CLE, ALE, D0->D3, NOE, NWE and NCE2  NAND pin configuration  */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15 |  
                                 GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |
                                 GPIO_Pin_7;                                 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_Init(GPIOD, &GPIO_InitStructure);

/* D4->D7 NAND pin configuration  */  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;

  GPIO_Init(GPIOE, &GPIO_InitStructure);


/* NWAIT NAND pin configuration */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;                                                            
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

  GPIO_Init(GPIOD, &GPIO_InitStructure);

/* INT2 NAND pin configuration */  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;                                                            
  GPIO_Init(GPIOG, &GPIO_InitStructure);

  /*-- FSMC Configuration ------------------------------------------------------*/
#if 0
  p.FSMC_SetupTime = 0x1;
  p.FSMC_WaitSetupTime = 0x3;
  p.FSMC_HoldSetupTime = 0x2;
  p.FSMC_HiZSetupTime = 0x1;
#endif
//#if 0
  p.FSMC_SetupTime = 0x1;
        p.FSMC_WaitSetupTime = 0x1;
        p.FSMC_HoldSetupTime = 0x1;
        p.FSMC_HiZSetupTime = 0x1;
//#endif

  FSMC_NANDInitStructure.FSMC_Bank = FSMC_Bank2_NAND;
  //FSMC_NANDInitStructure.FSMC_Waitfeature = FSMC_Waitfeature_Enable;
  FSMC_NANDInitStructure.FSMC_Waitfeature = FSMC_Waitfeature_Disable;
  FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;
  //FSMC_NANDInitStructure.FSMC_ECC = FSMC_ECC_Enable;
  FSMC_NANDInitStructure.FSMC_ECC = FSMC_ECC_Disable;
  //FSMC_NANDInitStructure.FSMC_ECCPageSize = FSMC_ECCPageSize_512Bytes;
  // for Hynix HY27UF081G2A
  FSMC_NANDInitStructure.FSMC_ECCPageSize = FSMC_ECCPageSize_2048Bytes;
  
  FSMC_NANDInitStructure.FSMC_AddressLowMapping = FSMC_AddressLowMapping_Direct;
  FSMC_NANDInitStructure.FSMC_TCLRSetupTime = 0x00;
  FSMC_NANDInitStructure.FSMC_TARSetupTime = 0x00;
  FSMC_NANDInitStructure.FSMC_CommonSpaceTimingStruct = &p;
  FSMC_NANDInitStructure.FSMC_AttributeSpaceTimingStruct = &p;

  FSMC_NANDInit(&FSMC_NANDInitStructure);

  /* FSMC NAND Bank Cmd Test */
  FSMC_NANDCmd(FSMC_Bank2_NAND, ENABLE);
}
回复 支持 反对

使用道具 举报

1

主题

5

回帖

0

蝴蝶豆

新手上路

最后登录
2018-11-20
 楼主| 发表于 2015-1-14 08:49:28 | 显示全部楼层
u32 FSMC_NAND_ReadSmallPage(u8 *pBuffer, NAND_ADDRESS Address, u32 NumPageToRead)
{
  u32 index = 0x00, numpageread = 0x00, addressstatus = NAND_VALID_ADDRESS;
  u32 status = NAND_READY, size = 0x00;

  while((NumPageToRead != 0x0) && (addressstatus == NAND_VALID_ADDRESS))
  {           
    /* Page Read command and page address */
    *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_READ_1;
   
    *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = 0x00;
    *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = 0X00;
    *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS);  
    *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS);  
   
    *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_READ_TRUE;
   
    //
    while( GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_6) == 0 );
   
    /* Calculate the size */
    size = NAND_PAGE_SIZE + (NAND_PAGE_SIZE * numpageread);
#if 0   
    /* Get Data into Buffer */   
    for(; index < size; index++)
    {
      pBuffer[index]= *(vu8 *)(Bank_NAND_ADDR | DATA_AREA);
    }
#endif
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
        DMA1->IFCR = 0x000FUL;        
        DMA1_Channel1->CCR &= ~DMA_CCR1_EN;

        DMA1->IFCR = 0x000FUL;                                                                        /*Clear Flag*/
        DMA1_Channel1->CCR &= ~DMA_CCR1_EN;
        DMA1_Channel1->CNDTR = size;                                                        /*Config LCD Data Transfer*/
        DMA1_Channel1->CPAR  = (u32)(Bank_NAND_ADDR | DATA_AREA);
        DMA1_Channel1->CMAR  = (u32)(&pBuffer[index]);
        DMA1_Channel1->CCR   = DMA_CCR2_PL | DMA_CCR1_MEM2MEM | DMA_CCR1_MINC | DMA_CCR1_EN;
        while((DMA1->ISR&DMA_ISR_TCIF1) != DMA_ISR_TCIF1);               
        DMA1->IFCR = 0x000FUL;                                                                        /*Clear Flag*/
        DMA1_Channel1->CCR &= ~DMA_CCR1_EN;
    numpageread++;
   
    NumPageToRead--;

    /* Calculate page address */                                    
    addressstatus = FSMC_NAND_AddressIncrement(&Address);
  }

  status = FSMC_NAND_GetStatus();
  
  return (status | addressstatus);
}
回复 支持 反对

使用道具 举报

1

主题

5

回帖

0

蝴蝶豆

新手上路

最后登录
2018-11-20
 楼主| 发表于 2015-1-14 08:56:00 | 显示全部楼层
自己对这STM32的手册看了一天了,确实没有找到速度亏在哪里了,CPU时钟72MHz肯定没有问题!刚刚用示波器抓的FSMC_NOE引脚波形:
时序图.jpg 时序图1.jpg

回复 支持 反对

使用道具 举报

12

主题

1347

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-9-2
发表于 2015-1-14 09:10:44 | 显示全部楼层
我去 这么专业  赞一个
回复 支持 反对

使用道具 举报

35

主题

604

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-3-30
发表于 2015-1-14 09:41:33 | 显示全部楼层
我连怎么测都不知道。。
回复 支持 反对

使用道具 举报

1

主题

5

回帖

0

蝴蝶豆

新手上路

最后登录
2018-11-20
 楼主| 发表于 2015-1-14 09:44:29 | 显示全部楼层
刚刚也在Google搜索了一下其他信息。看来FSMC整体速度也就那样了。很多说速度处于5~10MHz(SYSCLK=72MHz)。所以得想起他办法了,要是用STM32+NAND+LCD方案来做LCD显示的话。估计速度更不行了。因为大家都要用FSMC!
回复 支持 反对

使用道具 举报

14

主题

712

回帖

29

蝴蝶豆

金牌会员

最后登录
2020-4-19
发表于 2015-11-19 16:10:41 | 显示全部楼层
这个速度可以了
回复 支持 反对

使用道具 举报

0

主题

29

回帖

4

蝴蝶豆

初级会员

最后登录
2019-6-28
发表于 2016-9-21 11:30:52 | 显示全部楼层
FMSC驱动屏幕闪屏应该是显示屏的问题,扫描刷新慢。  240*320=76800    76800*24(帧)=1843200(速率) =1.8MHz   而FMSC的吞吐速度足够显示视频。
回复 支持 反对

使用道具 举报

0

主题

2189

回帖

397

蝴蝶豆

论坛元老

最后登录
2020-10-13
发表于 2016-9-21 12:54:58 | 显示全部楼层
膜拜一下楼主,学习了。
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版