448 lines
17 KiB
C
448 lines
17 KiB
C
/***
|
||
***************************************************************************
|
||
* @file sdram.c
|
||
* @brief sdram初始化,本代码移植于官方stm32f429discovery例程,
|
||
* 并作出相应修改
|
||
*
|
||
******************************************************************************
|
||
*
|
||
*
|
||
*
|
||
*
|
||
***************************************************************************
|
||
***/
|
||
|
||
#include "sdram.h"
|
||
|
||
/******************************************************************************************************
|
||
* 函 数 名: SDRAM_delay
|
||
* 入口参数: 无
|
||
* 返 回 值: 无
|
||
* 函数功能: 简易延时函数,单位约为5ms
|
||
* 说 明: 无
|
||
*******************************************************************************************************/
|
||
|
||
void SDRAM_delay(__IO uint32_t nCount)
|
||
{
|
||
__IO uint32_t index = 0;
|
||
for(index = (100000 * nCount); index != 0; index--)
|
||
{
|
||
}
|
||
}
|
||
|
||
/******************************************************************************************************
|
||
* 函 数 名: SDRAM_GPIO_Config
|
||
* 入口参数: 无
|
||
* 返 回 值: 无
|
||
* 函数功能: 配置GPIO
|
||
* 说 明: 无
|
||
*******************************************************************************************************/
|
||
|
||
void SDRAM_GPIO_Config(void)
|
||
{
|
||
GPIO_InitTypeDef GPIO_InitStructure;
|
||
|
||
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE |
|
||
RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOH | RCC_AHB1Periph_GPIOI,ENABLE);
|
||
|
||
//IO口配置
|
||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //配置为复用功能
|
||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
|
||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
|
||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
||
|
||
//地址线
|
||
GPIO_PinAFConfig(FMC_A0_PORT, FMC_A0_PINSOURCE , FMC_A0_AF);
|
||
GPIO_PinAFConfig(FMC_A1_PORT, FMC_A1_PINSOURCE , FMC_A1_AF);
|
||
GPIO_PinAFConfig(FMC_A2_PORT, FMC_A2_PINSOURCE , FMC_A2_AF);
|
||
GPIO_PinAFConfig(FMC_A3_PORT, FMC_A3_PINSOURCE , FMC_A3_AF);
|
||
GPIO_PinAFConfig(FMC_A4_PORT, FMC_A4_PINSOURCE , FMC_A4_AF);
|
||
GPIO_PinAFConfig(FMC_A5_PORT, FMC_A5_PINSOURCE , FMC_A5_AF);
|
||
GPIO_PinAFConfig(FMC_A6_PORT, FMC_A6_PINSOURCE , FMC_A6_AF);
|
||
GPIO_PinAFConfig(FMC_A7_PORT, FMC_A7_PINSOURCE , FMC_A7_AF);
|
||
GPIO_PinAFConfig(FMC_A8_PORT, FMC_A8_PINSOURCE , FMC_A8_AF);
|
||
GPIO_PinAFConfig(FMC_A9_PORT, FMC_A9_PINSOURCE , FMC_A9_AF);
|
||
GPIO_PinAFConfig(FMC_A10_PORT, FMC_A10_PINSOURCE , FMC_A10_AF);
|
||
GPIO_PinAFConfig(FMC_A11_PORT, FMC_A11_PINSOURCE , FMC_A11_AF);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_A0_PIN;
|
||
GPIO_Init(FMC_A0_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_A1_PIN;
|
||
GPIO_Init(FMC_A1_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_A2_PIN;
|
||
GPIO_Init(FMC_A2_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_A3_PIN;
|
||
GPIO_Init(FMC_A3_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_A4_PIN;
|
||
GPIO_Init(FMC_A4_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_A5_PIN;
|
||
GPIO_Init(FMC_A5_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_A6_PIN;
|
||
GPIO_Init(FMC_A6_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_A7_PIN;
|
||
GPIO_Init(FMC_A7_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_A8_PIN;
|
||
GPIO_Init(FMC_A8_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_A9_PIN;
|
||
GPIO_Init(FMC_A9_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_A10_PIN;
|
||
GPIO_Init(FMC_A10_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_A11_PIN;
|
||
GPIO_Init(FMC_A11_PORT, &GPIO_InitStructure);
|
||
|
||
//数据线
|
||
GPIO_PinAFConfig(FMC_D0_PORT, FMC_D0_PINSOURCE , FMC_D0_AF);
|
||
GPIO_PinAFConfig(FMC_D1_PORT, FMC_D1_PINSOURCE , FMC_D1_AF);
|
||
GPIO_PinAFConfig(FMC_D2_PORT, FMC_D2_PINSOURCE , FMC_D2_AF);
|
||
GPIO_PinAFConfig(FMC_D3_PORT, FMC_D3_PINSOURCE , FMC_D3_AF);
|
||
GPIO_PinAFConfig(FMC_D4_PORT, FMC_D4_PINSOURCE , FMC_D4_AF);
|
||
GPIO_PinAFConfig(FMC_D5_PORT, FMC_D5_PINSOURCE , FMC_D5_AF);
|
||
GPIO_PinAFConfig(FMC_D6_PORT, FMC_D6_PINSOURCE , FMC_D6_AF);
|
||
GPIO_PinAFConfig(FMC_D7_PORT, FMC_D7_PINSOURCE , FMC_D7_AF);
|
||
GPIO_PinAFConfig(FMC_D8_PORT, FMC_D8_PINSOURCE , FMC_D8_AF);
|
||
GPIO_PinAFConfig(FMC_D9_PORT, FMC_D9_PINSOURCE , FMC_D9_AF);
|
||
GPIO_PinAFConfig(FMC_D10_PORT, FMC_D10_PINSOURCE , FMC_D10_AF);
|
||
GPIO_PinAFConfig(FMC_D11_PORT, FMC_D11_PINSOURCE , FMC_D11_AF);
|
||
GPIO_PinAFConfig(FMC_D12_PORT, FMC_D12_PINSOURCE , FMC_D12_AF);
|
||
GPIO_PinAFConfig(FMC_D13_PORT, FMC_D13_PINSOURCE , FMC_D13_AF);
|
||
GPIO_PinAFConfig(FMC_D14_PORT, FMC_D14_PINSOURCE , FMC_D14_AF);
|
||
GPIO_PinAFConfig(FMC_D15_PORT, FMC_D15_PINSOURCE , FMC_D15_AF);
|
||
GPIO_PinAFConfig(FMC_D16_PORT, FMC_D16_PINSOURCE , FMC_D16_AF);
|
||
GPIO_PinAFConfig(FMC_D17_PORT, FMC_D17_PINSOURCE , FMC_D17_AF);
|
||
GPIO_PinAFConfig(FMC_D18_PORT, FMC_D18_PINSOURCE , FMC_D18_AF);
|
||
GPIO_PinAFConfig(FMC_D19_PORT, FMC_D19_PINSOURCE , FMC_D19_AF);
|
||
GPIO_PinAFConfig(FMC_D20_PORT, FMC_D20_PINSOURCE , FMC_D20_AF);
|
||
GPIO_PinAFConfig(FMC_D21_PORT, FMC_D21_PINSOURCE , FMC_D21_AF);
|
||
GPIO_PinAFConfig(FMC_D22_PORT, FMC_D22_PINSOURCE , FMC_D22_AF);
|
||
GPIO_PinAFConfig(FMC_D23_PORT, FMC_D23_PINSOURCE , FMC_D23_AF);
|
||
GPIO_PinAFConfig(FMC_D24_PORT, FMC_D24_PINSOURCE , FMC_D24_AF);
|
||
GPIO_PinAFConfig(FMC_D25_PORT, FMC_D25_PINSOURCE , FMC_D25_AF);
|
||
GPIO_PinAFConfig(FMC_D26_PORT, FMC_D26_PINSOURCE , FMC_D26_AF);
|
||
GPIO_PinAFConfig(FMC_D27_PORT, FMC_D27_PINSOURCE , FMC_D27_AF);
|
||
GPIO_PinAFConfig(FMC_D28_PORT, FMC_D28_PINSOURCE , FMC_D28_AF);
|
||
GPIO_PinAFConfig(FMC_D29_PORT, FMC_D29_PINSOURCE , FMC_D29_AF);
|
||
GPIO_PinAFConfig(FMC_D30_PORT, FMC_D30_PINSOURCE , FMC_D30_AF);
|
||
GPIO_PinAFConfig(FMC_D31_PORT, FMC_D31_PINSOURCE , FMC_D31_AF);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D0_PIN;
|
||
GPIO_Init(FMC_D0_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D1_PIN;
|
||
GPIO_Init(FMC_D1_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D2_PIN;
|
||
GPIO_Init(FMC_D2_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D3_PIN;
|
||
GPIO_Init(FMC_D3_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D4_PIN;
|
||
GPIO_Init(FMC_D4_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D5_PIN;
|
||
GPIO_Init(FMC_D5_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D6_PIN;
|
||
GPIO_Init(FMC_D6_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D7_PIN;
|
||
GPIO_Init(FMC_D7_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D8_PIN;
|
||
GPIO_Init(FMC_D8_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D9_PIN;
|
||
GPIO_Init(FMC_D9_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D10_PIN;
|
||
GPIO_Init(FMC_D10_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D11_PIN;
|
||
GPIO_Init(FMC_D11_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D12_PIN;
|
||
GPIO_Init(FMC_D12_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D13_PIN;
|
||
GPIO_Init(FMC_D13_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D14_PIN;
|
||
GPIO_Init(FMC_D14_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D15_PIN;
|
||
GPIO_Init(FMC_D15_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D16_PIN;
|
||
GPIO_Init(FMC_D16_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D17_PIN;
|
||
GPIO_Init(FMC_D17_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D18_PIN;
|
||
GPIO_Init(FMC_D18_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D19_PIN;
|
||
GPIO_Init(FMC_D19_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D20_PIN;
|
||
GPIO_Init(FMC_D20_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D21_PIN;
|
||
GPIO_Init(FMC_D21_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D22_PIN;
|
||
GPIO_Init(FMC_D22_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D23_PIN;
|
||
GPIO_Init(FMC_D23_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D24_PIN;
|
||
GPIO_Init(FMC_D24_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D25_PIN;
|
||
GPIO_Init(FMC_D25_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D26_PIN;
|
||
GPIO_Init(FMC_D26_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D27_PIN;
|
||
GPIO_Init(FMC_D27_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D28_PIN;
|
||
GPIO_Init(FMC_D28_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D29_PIN;
|
||
GPIO_Init(FMC_D29_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D30_PIN;
|
||
GPIO_Init(FMC_D30_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_D31_PIN;
|
||
GPIO_Init(FMC_D31_PORT, &GPIO_InitStructure);
|
||
|
||
//控制线
|
||
GPIO_PinAFConfig(FMC_CS_PORT, FMC_CS_PINSOURCE , FMC_CS_AF);
|
||
GPIO_PinAFConfig(FMC_BA0_PORT, FMC_BA0_PINSOURCE , FMC_BA0_AF);
|
||
GPIO_PinAFConfig(FMC_BA1_PORT, FMC_BA1_PINSOURCE , FMC_BA1_AF);
|
||
GPIO_PinAFConfig(FMC_WE_PORT, FMC_WE_PINSOURCE , FMC_WE_AF);
|
||
GPIO_PinAFConfig(FMC_RAS_PORT, FMC_RAS_PINSOURCE , FMC_RAS_AF);
|
||
GPIO_PinAFConfig(FMC_CAS_PORT, FMC_CAS_PINSOURCE , FMC_CAS_AF);
|
||
GPIO_PinAFConfig(FMC_CLK_PORT, FMC_CLK_PINSOURCE , FMC_CLK_AF);
|
||
GPIO_PinAFConfig(FMC_CKE_PORT, FMC_CKE_PINSOURCE , FMC_CKE_AF);
|
||
GPIO_PinAFConfig(FMC_UDQM_PORT, FMC_UDQM_PINSOURCE , FMC_UDQM_AF);
|
||
GPIO_PinAFConfig(FMC_LDQM_PORT, FMC_LDQM_PINSOURCE , FMC_LDQM_AF);
|
||
GPIO_PinAFConfig(FMC_NBL2_PORT, FMC_NBL2_PINSOURCE , FMC_NBL2_AF);
|
||
GPIO_PinAFConfig(FMC_NBL3_PORT, FMC_NBL3_PINSOURCE , FMC_NBL3_AF);
|
||
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_CS_PIN;
|
||
GPIO_Init(FMC_CS_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_BA0_PIN;
|
||
GPIO_Init(FMC_BA0_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_BA1_PIN;
|
||
GPIO_Init(FMC_BA1_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_WE_PIN;
|
||
GPIO_Init(FMC_WE_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_RAS_PIN;
|
||
GPIO_Init(FMC_RAS_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_CAS_PIN;
|
||
GPIO_Init(FMC_CAS_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_CLK_PIN;
|
||
GPIO_Init(FMC_CLK_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_CKE_PIN;
|
||
GPIO_Init(FMC_CKE_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_UDQM_PIN;
|
||
GPIO_Init(FMC_UDQM_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_LDQM_PIN;
|
||
GPIO_Init(FMC_LDQM_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_NBL2_PIN;
|
||
GPIO_Init(FMC_NBL2_PORT, &GPIO_InitStructure);
|
||
|
||
GPIO_InitStructure.GPIO_Pin = FMC_NBL3_PIN;
|
||
GPIO_Init(FMC_NBL3_PORT, &GPIO_InitStructure);
|
||
|
||
}
|
||
|
||
/******************************************************************************************************
|
||
* 函 数 名: SDRAM_InitSequence
|
||
* 入口参数: 无
|
||
* 返 回 值: 无
|
||
* 函数功能: SDRAM 参数配置
|
||
* 说 明: 配置SDRAM相关时序和控制方式
|
||
*******************************************************************************************************/
|
||
|
||
void SDRAM_InitSequence(void)
|
||
{
|
||
FMC_SDRAMCommandTypeDef FMC_SDRAMCommandStructure;
|
||
u32 Reg = 0; // 定义寄存器变量
|
||
|
||
FMC_SDRAMCommandStructure.FMC_CommandMode = FMC_Command_Mode_CLK_Enabled; // 开启SDRAM时钟
|
||
FMC_SDRAMCommandStructure.FMC_CommandTarget = FMC_COMMAND_TARGET_BANK; // 选择要控制的区域
|
||
FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 1;
|
||
FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = 0;
|
||
while(FMC_GetFlagStatus(FMC_BANK_SDRAM, FMC_FLAG_Busy) != RESET); //等待SDRAM空闲
|
||
FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStructure); // 配置SDRAM
|
||
SDRAM_delay(1); //延时5ms
|
||
|
||
|
||
FMC_SDRAMCommandStructure.FMC_CommandMode = FMC_Command_Mode_PALL; // 预充电命令
|
||
FMC_SDRAMCommandStructure.FMC_CommandTarget = FMC_COMMAND_TARGET_BANK; // 选择要控制的区域
|
||
FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 1;
|
||
FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = 0;
|
||
while(FMC_GetFlagStatus(FMC_BANK_SDRAM, FMC_FLAG_Busy) != RESET) //等待SDRAM空闲
|
||
FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStructure); // 配置SDRAM
|
||
SDRAM_delay(1); //延时5ms
|
||
|
||
//自动刷新配置
|
||
FMC_SDRAMCommandStructure.FMC_CommandMode = FMC_Command_Mode_AutoRefresh; // 使用自动刷新
|
||
FMC_SDRAMCommandStructure.FMC_CommandTarget = FMC_COMMAND_TARGET_BANK; // 选择要控制的区域
|
||
FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 8; // 自动刷新次数
|
||
FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = 0;
|
||
while(FMC_GetFlagStatus(FMC_BANK_SDRAM, FMC_FLAG_Busy) != RESET); //等待SDRAM空闲
|
||
FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStructure); // 配置SDRAM
|
||
|
||
//寄存器配置
|
||
Reg = (u32)SDRAM_MODEREG_BURST_LENGTH_2 |
|
||
SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL |
|
||
SDRAM_MODEREG_CAS_LATENCY_3 |
|
||
SDRAM_MODEREG_OPERATING_MODE_STANDARD |
|
||
SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;
|
||
|
||
FMC_SDRAMCommandStructure.FMC_CommandMode = FMC_Command_Mode_LoadMode; // 加载模式寄存器命令
|
||
FMC_SDRAMCommandStructure.FMC_CommandTarget = FMC_COMMAND_TARGET_BANK; // 选择要控制的区域
|
||
FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 1;
|
||
FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = Reg; // 寄存器值
|
||
while(FMC_GetFlagStatus(FMC_BANK_SDRAM, FMC_FLAG_Busy) != RESET); //等待SDRAM空闲
|
||
FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStructure); // 配置SDRAM
|
||
|
||
FMC_SetRefreshCount(1386); // 设置刷新计数器
|
||
while(FMC_GetFlagStatus(FMC_BANK_SDRAM, FMC_FLAG_Busy) != RESET); //等待SDRAM空闲
|
||
}
|
||
|
||
/******************************************************************************************************
|
||
* 函 数 名: SDRAM_Init
|
||
* 入口参数: 无
|
||
* 返 回 值: 无
|
||
* 函数功能: SDRAM初始化
|
||
* 说 明: 初始化FMC和SDRAM配置
|
||
*******************************************************************************************************/
|
||
|
||
void SDRAM_Init(void)
|
||
{
|
||
u32 i = 0; // 计数变量
|
||
|
||
FMC_SDRAMInitTypeDef FMC_SDRAMInitStructure;
|
||
FMC_SDRAMTimingInitTypeDef FMC_SDRAMTimingInitStructure;
|
||
|
||
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FMC, ENABLE); // 开启FMC时钟
|
||
SDRAM_GPIO_Config(); // 初始化IO口
|
||
|
||
FMC_SDRAMTimingInitStructure.FMC_LoadToActiveDelay = 2; // TMRD: min=12ns (2x11.11ns)
|
||
FMC_SDRAMTimingInitStructure.FMC_ExitSelfRefreshDelay = 7; // TXSR: min=72ns (7x11.11ns)
|
||
FMC_SDRAMTimingInitStructure.FMC_SelfRefreshTime = 4; // TRAS: min=42ns (4x11.11ns)
|
||
FMC_SDRAMTimingInitStructure.FMC_RowCycleDelay = 6; // TRC: min=60ns (6x11.11ns)
|
||
FMC_SDRAMTimingInitStructure.FMC_WriteRecoveryTime = 2; // TWR: 2 Tck
|
||
FMC_SDRAMTimingInitStructure.FMC_RPDelay = 2; // TRP: 18ns => 2x11.11ns
|
||
FMC_SDRAMTimingInitStructure.FMC_RCDDelay = 2; // TRCD: 12ns => 2x11.11ns
|
||
|
||
FMC_SDRAMInitStructure.FMC_Bank = FMC_BANK_SDRAM; // 选择BANK区
|
||
FMC_SDRAMInitStructure.FMC_ColumnBitsNumber = FMC_ColumnBits_Number_8b; // 行地址宽度
|
||
FMC_SDRAMInitStructure.FMC_RowBitsNumber = FMC_RowBits_Number_12b; // 列地址线宽度
|
||
FMC_SDRAMInitStructure.FMC_SDMemoryDataWidth = FMC_SDMemory_Width_32b; // 数据宽度
|
||
FMC_SDRAMInitStructure.FMC_InternalBankNumber = FMC_InternalBank_Number_4; // bank数量
|
||
FMC_SDRAMInitStructure.FMC_CASLatency = FMC_CAS_Latency_3; // CAS
|
||
FMC_SDRAMInitStructure.FMC_WriteProtection = FMC_Write_Protection_Disable; // 禁止写保护
|
||
FMC_SDRAMInitStructure.FMC_SDClockPeriod = FMC_SDClock_Period_2; // 分频
|
||
FMC_SDRAMInitStructure.FMC_ReadBurst = FMC_Read_Burst_Enable; // 突发模式
|
||
FMC_SDRAMInitStructure.FMC_ReadPipeDelay = FMC_ReadPipe_Delay_1; // 读延迟
|
||
FMC_SDRAMInitStructure.FMC_SDRAMTimingStruct = &FMC_SDRAMTimingInitStructure;
|
||
|
||
FMC_SDRAMInit(&FMC_SDRAMInitStructure); // 初始化FMC接口
|
||
SDRAM_InitSequence(); //配置SDRAM
|
||
|
||
// 初始化之后,将整个内存区写一遍数据,因为刚初始化时,第一次写数据存在不稳定的情况,所以先写一次数据。
|
||
for (i = 0; i < SDRAM_Size/4; i++)
|
||
{
|
||
*(__IO u32*) (SDRAM_BANK_ADDR + 4*i) = 0x55555555;
|
||
}
|
||
for (i = 0; i < SDRAM_Size/4; i++)
|
||
{
|
||
*(__IO u32*) (SDRAM_BANK_ADDR + 4*i) = 0x00000000;
|
||
}
|
||
}
|
||
|
||
/******************************************************************************************************
|
||
* 函 数 名: SDRAM_Test
|
||
* 入口参数: 无
|
||
* 返 回 值: SUCCESS - 成功,ERROR - 失败
|
||
* 函数功能: SDRAM测试
|
||
* 说 明: 先以32位的数据宽度写入数据,再读取出来一一进行比较,随后以8位的数据宽度写入,
|
||
* 用以验证NBL0和NBL1两个引脚的连接是否正常。
|
||
*******************************************************************************************************/
|
||
|
||
u8 SDRAM_Test(void)
|
||
{
|
||
u32 i = 0; // 计数变量
|
||
u32 ReadData = 0; // 读取到的数据
|
||
u8 ReadData_8b;
|
||
|
||
printf("STM32F429 SDRAM测试\r\n");
|
||
printf("测试开始,以32位数据宽度写入数据...\r\n");
|
||
for (i = 0; i < SDRAM_Size/4; i++)
|
||
{
|
||
*(__IO u32*) (SDRAM_BANK_ADDR + 4*i) = i; // 写入数据
|
||
}
|
||
|
||
printf("写入完毕,读取数据并比较...\r\n");
|
||
for(i = 0; i < SDRAM_Size/4;i++ )
|
||
{
|
||
ReadData = *(__IO u32*)(SDRAM_BANK_ADDR + 4 * i ); // 从SDRAM读出数据
|
||
if( ReadData != i ) //检测数据,若不相等,跳出函数,返回检测失败结果。
|
||
{
|
||
printf("SDRAM测试失败!!\r\n");
|
||
return ERROR; // 返回失败标志
|
||
}
|
||
}
|
||
|
||
printf("32位数据宽度读写通过,以8位数据宽度写入数据\r\n");
|
||
for (i = 0; i < 255; i++)
|
||
{
|
||
*(__IO u8*) (SDRAM_BANK_ADDR + i) = i;
|
||
}
|
||
printf("写入完毕,读取数据并比较...\r\n");
|
||
for (i = 0; i < 255; i++)
|
||
{
|
||
ReadData_8b = *(__IO u8*) (SDRAM_BANK_ADDR + i);
|
||
if( ReadData_8b != (u8)i ) //检测数据,若不相等,跳出函数,返回检测失败结果。
|
||
{
|
||
printf("8位数据宽度读写测试失败!!\r\n");
|
||
printf("请检查NBL0和NBL1的连接\r\n");
|
||
return ERROR; // 返回失败标志
|
||
}
|
||
}
|
||
printf("8位数据宽度读写通过\r\n");
|
||
printf("SDRAM读写测试通过,系统正常\r\n");
|
||
return SUCCESS; // 返回成功标志
|
||
}
|