11qiaoqi 发表于 2015-3-23 16:07:37

STM32F439外扩SDRAM

最近做一个项目,采用STM32F439外扩SDRAM做内存,现在发现外扩SDRAM可以运行,但是程序运行速率比较慢,实测了下大概有40多MHZ执行速率,求大虾帮忙分析是怎么回事?外扩是否能够达到90MHZ吗?
附SDRAM配置:
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)
#if defined (DATA_IN_ExtSDRAM)
register uint32_t tmpreg = 0, timeout = 0xFFFF;
register uint32_t index;

/* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface
      clock */
RCC->AHB1ENR |= 0x000000F8;

/* Connect PDx pins to FMC Alternate function */
GPIOD->AFR= 0x000000CC;
GPIOD->AFR= 0xCC000CCC;
/* Configure PDx pins in Alternate function mode */
GPIOD->MODER   = 0xA02A000A;
/* Configure PDx pins speed to 50 MHz */
GPIOD->OSPEEDR = 0xA02A000A;
/* Configure PDx pins Output type to push-pull */
GPIOD->OTYPER= 0x00000000;
/* No pull-up, pull-down for PDx pins */
GPIOD->PUPDR   = 0x00000000;

/* Connect PEx pins to FMC Alternate function */
GPIOE->AFR= 0xC00000CC;
GPIOE->AFR= 0xCCCCCCCC;
/* Configure PEx pins in Alternate function mode */
GPIOE->MODER   = 0xAAAA800A;
/* Configure PEx pins speed to 50 MHz */
GPIOE->OSPEEDR = 0xAAAA800A;
/* Configure PEx pins Output type to push-pull */
GPIOE->OTYPER= 0x00000000;
/* No pull-up, pull-down for PEx pins */
GPIOE->PUPDR   = 0x00000000;

/* Connect PFx pins to FMC Alternate function */
GPIOF->AFR= 0xCCCCCCCC;
GPIOF->AFR= 0xCCCCCCCC;
/* Configure PFx pins in Alternate function mode */   
GPIOF->MODER   = 0xAA800AAA;
/* Configure PFx pins speed to 50 MHz */
GPIOF->OSPEEDR = 0xAA800AAA;
/* Configure PFx pins Output type to push-pull */
GPIOF->OTYPER= 0x00000000;
/* No pull-up, pull-down for PFx pins */
GPIOF->PUPDR   = 0x00000000;

/* Connect PGx pins to FMC Alternate function */
GPIOG->AFR= 0xCCCCCCCC;
GPIOG->AFR= 0xCCCCCCCC;
/* Configure PGx pins in Alternate function mode */
GPIOG->MODER   = 0xAAAAAAAA;
/* Configure PGx pins speed to 50 MHz */
GPIOG->OSPEEDR = 0xAAAAAAAA;
/* Configure PGx pins Output type to push-pull */
GPIOG->OTYPER= 0x00000000;
/* No pull-up, pull-down for PGx pins */
GPIOG->PUPDR   = 0x00000000;

/* Connect PHx pins to FMC Alternate function */
GPIOH->AFR= 0x00C0CC00;
GPIOH->AFR= 0x00000000;
/* Configure PHx pins in Alternate function mode */
GPIOH->MODER   = 0x000008A0;
/* Configure PHx pins speed to 50 MHz */
GPIOH->OSPEEDR = 0x000008A0;
/* Configure PHx pins Output type to push-pull */
GPIOH->OTYPER= 0x00000000;
/* No pull-up, pull-down for PHx pins */
GPIOH->PUPDR   = 0x00000000;

///* Connect PIx pins to FMC Alternate function */
//GPIOI->AFR= 0xCCCCCCCC;
//GPIOI->AFR= 0x00000CC0;
///* Configure PIx pins in Alternate function mode */
//GPIOI->MODER   = 0x0028AAAA;
///* Configure PIx pins speed to 50 MHz */
//GPIOI->OSPEEDR = 0x0028AAAA;
///* Configure PIx pins Output type to push-pull */
//GPIOI->OTYPER= 0x00000000;
///* No pull-up, pull-down for PIx pins */
//GPIOI->PUPDR   = 0x00000000;

/*-- FMC Configuration ------------------------------------------------------*/
/* Enable the FMC interface clock */
RCC->AHB3ENR |= 0x00000001;

/* Configure and enable SDRAM bank1 */
FMC_Bank5_6->SDCR = 0x000019D4;
FMC_Bank5_6->SDTR = 0x01113121;      

/* SDRAM initialization sequence */
/* Clock enable command */
FMC_Bank5_6->SDCMR = 0x00000011;
tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
while((tmpreg != 0) && (timeout-- > 0))
{
    tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
}

/* Delay */
for (index = 0; index<1000; index++);

/* PALL command */
FMC_Bank5_6->SDCMR = 0x00000012;         
timeout = 0xFFFF;
while((tmpreg != 0) && (timeout-- > 0))
{
    tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
}

/* Auto refresh command */
FMC_Bank5_6->SDCMR = 0x00000073;
timeout = 0xFFFF;
while((tmpreg != 0) && (timeout-- > 0))
{
    tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
}

/* MRD register program */
FMC_Bank5_6->SDCMR = 0x00046014;
timeout = 0xFFFF;
while((tmpreg != 0) && (timeout-- > 0))
{
    tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
}

/* Set refresh count */
tmpreg = FMC_Bank5_6->SDRTR;
FMC_Bank5_6->SDRTR = (tmpreg | (0x00000569<<1));

/* Disable write protection */
tmpreg = FMC_Bank5_6->SDCR;
FMC_Bank5_6->SDCR = (tmpreg & 0xFFFFFDFF);

拼命三郎 发表于 2015-3-23 19:22:21

11qiaoqi 发表于 2015-3-23 19:34:37

自己顶下

zfz0122 发表于 2015-3-23 19:39:31

学习了

小蚂蚁快溜跑 发表于 2015-3-23 20:34:37

学习。。:D

wu1169668869 发表于 2015-3-24 00:25:36

没试过这么高端的东西

木木鱼 发表于 2015-3-24 08:39:26

不懂帮顶!

stary666 发表于 2015-3-24 09:50:49

顶一下。。。。。。。。。。

11qiaoqi 发表于 2015-3-25 13:59:57

经过几天的测试,现总结下测试情况,STM32F439外扩SDRAM(16bit)运行效率等同于在45MHZ效率,即使外扩SDRAM(32BIT)运行效率也达不到90MHZ,所谓180MHZ主频,在外扩方面根本就没法发挥芯片的性能。
上述测试,无论外扩内存或者是用内部内存,只要使用的变量定义在外扩SDRAM内,运行的结果都是一样的。看来FMC功能真的没法发挥想象的中的效率。

nocoyou 发表于 2015-3-28 19:30:04

帮忙顶一下
页: [1] 2
查看完整版本: STM32F439外扩SDRAM