liudashuang 发表于 2016-5-25 09:46:08

STM32F429驱动SDRAM时,SDRAM时钟脚没有信号

本帖最后由 liudashuang 于 2016-5-25 09:46 编辑

在用STM32F429驱动SDRAM时,初始化代码用cubeMX生成,代码如下:

DRAM_HandleTypeDef hsdram1;
/* FMC initialization function */
void MX_FMC_Init(void)
{
FMC_SDRAM_TimingTypeDef SdramTiming;
/** Perform the SDRAM1 memory initialization sequence
*/
hsdram1.Instance = FMC_SDRAM_DEVICE;
/* hsdram1.Init */
hsdram1.Init.SDBank = FMC_SDRAM_BANK1;
hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9;
hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12;
hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;
hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3;
hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2;
hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE;
hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1;
/* SdramTiming */
SdramTiming.LoadToActiveDelay = 2;
SdramTiming.ExitSelfRefreshDelay = 7;
SdramTiming.SelfRefreshTime = 4;
SdramTiming.RowCycleDelay = 7;
SdramTiming.WriteRecoveryTime = 2;
SdramTiming.RPDelay = 2;
SdramTiming.RCDDelay = 2;
if(HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK)
{
    /* Initialization Error */
#ifdef DEBUG
    printf("SDRAM Initialization Error\n");
#endif
}
}
static int FMC_Initialized = 0;
static void HAL_FMC_MspInit(void){
/* USER CODE BEGIN FMC_MspInit 0 */
/* USER CODE END FMC_MspInit 0 */
GPIO_InitTypeDef GPIO_InitStruct;
if (FMC_Initialized) {
    return;
}
FMC_Initialized = 1;
/* Peripheral clock enable */
__HAL_RCC_FMC_CLK_ENABLE();

/** FMC GPIO Configuration
PF0   ------> FMC_A0
PF1   ------> FMC_A1
PF2   ------> FMC_A2
PF3   ------> FMC_A3
PF4   ------> FMC_A4
PF5   ------> FMC_A5
PC0   ------> FMC_SDNWE
PC2   ------> FMC_SDNE0
PC3   ------> FMC_SDCKE0
PF11   ------> FMC_SDNRAS
PF12   ------> FMC_A6
PF13   ------> FMC_A7
PF14   ------> FMC_A8
PF15   ------> FMC_A9
PG0   ------> FMC_A10
PG1   ------> FMC_A11
PE7   ------> FMC_D4
PE8   ------> FMC_D5
PE9   ------> FMC_D6
PE10   ------> FMC_D7
PE11   ------> FMC_D8
PE12   ------> FMC_D9
PE13   ------> FMC_D10
PE14   ------> FMC_D11
PE15   ------> FMC_D12
PD8   ------> FMC_D13
PD9   ------> FMC_D14
PD10   ------> FMC_D15
PD14   ------> FMC_D0
PD15   ------> FMC_D1
PG4   ------> FMC_BA0
PG5   ------> FMC_BA1
PG8   ------> FMC_SDCLK
PD0   ------> FMC_D2
PD1   ------> FMC_D3
PG15   ------> FMC_SDNCAS
PE0   ------> FMC_NBL0
PE1   ------> FMC_NBL1
*/
/* GPIO_InitStruct */
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
                        |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_11|GPIO_PIN_12
                        |GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
/* GPIO_InitStruct */
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/* GPIO_InitStruct */
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5
                        |GPIO_PIN_8|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
/* GPIO_InitStruct */
GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10
                        |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
                        |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
/* GPIO_InitStruct */
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14
                        |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
/* USER CODE BEGIN FMC_MspInit 1 */
/* USER CODE END FMC_MspInit 1 */
}
void HAL_SDRAM_MspInit(SDRAM_HandleTypeDef* hsdram){
/* USER CODE BEGIN SDRAM_MspInit 0 */
/* USER CODE END SDRAM_MspInit 0 */
HAL_FMC_MspInit();
/* USER CODE BEGIN SDRAM_MspInit 1 */
/* USER CODE END SDRAM_MspInit 1 */
}
static int FMC_DeInitialized = 0;
static void HAL_FMC_MspDeInit(void){
/* USER CODE BEGIN FMC_MspDeInit 0 */
/* USER CODE END FMC_MspDeInit 0 */
if (FMC_DeInitialized) {
    return;
}
FMC_DeInitialized = 1;
/* Peripheral clock enable */
__HAL_RCC_FMC_CLK_DISABLE();

/** FMC GPIO Configuration
PF0   ------> FMC_A0
PF1   ------> FMC_A1
PF2   ------> FMC_A2
PF3   ------> FMC_A3
PF4   ------> FMC_A4
PF5   ------> FMC_A5
PC0   ------> FMC_SDNWE
PC2   ------> FMC_SDNE0
PC3   ------> FMC_SDCKE0
PF11   ------> FMC_SDNRAS
PF12   ------> FMC_A6
PF13   ------> FMC_A7
PF14   ------> FMC_A8
PF15   ------> FMC_A9
PG0   ------> FMC_A10
PG1   ------> FMC_A11
PE7   ------> FMC_D4
PE8   ------> FMC_D5
PE9   ------> FMC_D6
PE10   ------> FMC_D7
PE11   ------> FMC_D8
PE12   ------> FMC_D9
PE13   ------> FMC_D10
PE14   ------> FMC_D11
PE15   ------> FMC_D12
PD8   ------> FMC_D13
PD9   ------> FMC_D14
PD10   ------> FMC_D15
PD14   ------> FMC_D0
PD15   ------> FMC_D1
PG4   ------> FMC_BA0
PG5   ------> FMC_BA1
PG8   ------> FMC_SDCLK
PD0   ------> FMC_D2
PD1   ------> FMC_D3
PG15   ------> FMC_SDNCAS
PE0   ------> FMC_NBL0
PE1   ------> FMC_NBL1
*/
HAL_GPIO_DeInit(GPIOF, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
                        |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_11|GPIO_PIN_12
                        |GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3);
HAL_GPIO_DeInit(GPIOG, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5
                        |GPIO_PIN_8|GPIO_PIN_15);
HAL_GPIO_DeInit(GPIOE, GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10
                        |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
                        |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1);
HAL_GPIO_DeInit(GPIOD, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14
                        |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1);
/* USER CODE BEGIN FMC_MspDeInit 1 */

/* USER CODE END FMC_MspDeInit 1 */
}
void HAL_SDRAM_MspDeInit(SDRAM_HandleTypeDef* hsdram){
/* USER CODE BEGIN SDRAM_MspDeInit 0 */
/* USER CODE END SDRAM_MspDeInit 0 */
HAL_FMC_MspDeInit();
/* USER CODE BEGIN SDRAM_MspDeInit 1 */
/* USER CODE END SDRAM_MspDeInit 1 */
}
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

配置代码如下:
static void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command)
{

__IO uint32_t tmpmrd =0;
/* Step 3:Configure a clock configuration enable command */
/* ʱÖÓÅäÖÃʹÄÜ,¶ÔÓ¦STM32³õʼ»¯SDRAM²½Öè3 */
Command->CommandMode   = FMC_SDRAM_CMD_CLK_ENABLE;
Command->CommandTarget    = FMC_SDRAM_CMD_TARGET_BANK1;
Command->AutoRefreshNumber   = 1;
Command->ModeRegisterDefinition = 0;
/* Send the command */
HAL_SDRAM_SendCommand(hsdram,Command, 0x1000);
/* Step 4: Insert 100 ms delay */
/* µÈ´ýÖ¸¶¨ÑÓ³ÙÖÜÆÚ,¶ÔÓ¦STM32³õʼ»¯SDRAM²½Öè4 */
HAL_Delay(100);
   
/* Step 5: Configure a PALL (precharge all) command */
/* PALL£¨¡°Ô¤³äµçËùÓÐ´æ´¢ÇøÓò¡±£©ÃüÁî,¶ÔÓ¦STM32³õʼ»¯SDRAM²½Öè5 */
Command->CommandMode   = FMC_SDRAM_CMD_PALL;
Command->CommandTarget       = FMC_SDRAM_CMD_TARGET_BANK1;
Command->AutoRefreshNumber   = 1;
Command->ModeRegisterDefinition = 0;
/* Send the command */
HAL_SDRAM_SendCommand(hsdram,Command, 0x1000);

/* Step 6 : Configure a Auto-Refresh command */
/* ×ÔË¢ÐÂÃüÁî,8¸ö×ÔË¢ÐÂÖÜÆÚ,¶ÔÓ¦STM32³õʼ»¯SDRAM²½Öè6 */
Command->CommandMode   = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
Command->CommandTarget    = FMC_SDRAM_CMD_TARGET_BANK1;
Command->AutoRefreshNumber   = 9;
Command->ModeRegisterDefinition = 0;
/* Send the command */
HAL_SDRAM_SendCommand(hsdram,Command, 0x1000);

/* Step 7: Program the external memory mode register */
   /* ÅäÖÃSDRAMģʽ¼Ä´æÆ÷,¶ÔÓ¦STM32³õʼ»¯SDRAM²½Öè7 */
/* Í»·¢³¤¶È£º1
   Í»·¢´«Ê䷽ʽ£ºË³Ðò
   CASDZ·üÆÚ£º2
   ²Ù×÷ģʽ£º±ê×¼
   ²Ù×÷ģʽ£ºÍ»·¢¶Á/µ¥Ò»Ð´
*/
tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1          |
                     SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |
                     SDRAM_MODEREG_CAS_LATENCY_2          |
                     SDRAM_MODEREG_OPERATING_MODE_STANDARD |
                     SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;

Command->CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
Command->CommandTarget    = FMC_SDRAM_CMD_TARGET_BANK1;
Command->AutoRefreshNumber   = 1;
Command->ModeRegisterDefinition = tmpmrd;
/* Send the command */
HAL_SDRAM_SendCommand(hsdram,Command, 0x1000);

/* Step 8: Set the refresh rate counter */
/* Ë¢ÐÂÂÊÉèÖÃ,¶ÔÓ¦STM32³õʼ»¯SDRAM²½Öè8 */
/* (15.62 us x Freq) - 20 */
/* Set the device refresh counter */
HAL_SDRAM_ProgramRefreshRate(hsdram, REFRESH_COUNT);
}

硬件部分已经检查了很多遍,没有连接错误,没有假焊/短路,但是SDRAM就是读写错误,用示波器测试一下,发现SDCLK没有信号输出.测量没有发现短路和开路.把SDRAM更换了也一样.请各位高手帮忙看看是否代码有问题,谢谢!!!!!!!





发表于 2016-5-25 14:36:55

看一下硬件上的资源选择是否正确,我测试407的。用的NE3操作SRAM是没有问题的。

xmshao 发表于 2016-5-26 10:19:43

你确认SDRAM时钟使能了。

看你代码里有 __HAL_RCC_FMC_CLK_ENABLE(); 和 __HAL_RCC_FMC_CLK_DISABLE(); 你确认下到底最后哪个在起作用。

人之颠 发表于 2016-5-26 11:17:25

应该是你FMC时钟没开启

liudashuang 发表于 2016-5-26 15:43:50

确认FMC的时钟已经使能,在DEBUG下查看相关控制寄存器的数值都是对的,其它数据线/地址线引脚上都有信号输出,就是SDCLK和SDCKE上没有输出信号,SDRAM和STM32F429的芯片都更换过了,结果还是一样

yechengyuan 发表于 2016-9-25 11:35:33

本帖最后由 yechengyuan 于 2016-9-25 15:36 编辑

我也遇到同样问题,读写的时候,地址,数据都有波形,clk,nwe等等都是没有信号,没有找到原因
我是用stm32cube 生成的代码,不知道哪里出错

/* FMC initialization function */
static void MX_FMC_Init(void)
{
FMC_SDRAM_TimingTypeDef SdramTiming;
/** Perform the SDRAM1 memory initialization sequence
*/
hsdram1.Instance = FMC_SDRAM_DEVICE;
/* hsdram1.Init */
hsdram1.Init.SDBank = FMC_SDRAM_BANK1;
hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9;
hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13;
hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;
hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_2;
hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2;
hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_DISABLE;
hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0;
/* SdramTiming */
SdramTiming.LoadToActiveDelay = 3;
SdramTiming.ExitSelfRefreshDelay = 12;
SdramTiming.SelfRefreshTime = 3;
SdramTiming.RowCycleDelay = 8;
SdramTiming.WriteRecoveryTime = 2;
SdramTiming.RPDelay = 3;
SdramTiming.RCDDelay = 3;
if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK)
{
    Error_Handler();
}
}


页: [1]
查看完整版本: STM32F429驱动SDRAM时,SDRAM时钟脚没有信号