STM32H750XB_RT-THREAD/25-FMC—扩展外部NAND/User/sdram/bsp_sdram.c

519 lines
16 KiB
C
Raw Normal View History

2025-07-21 06:34:29 +00:00
/**
******************************************************************************
* @file bsp_sdram.c
* @author fire
* @version V1.0
* @date 2015-xx-xx
* @brief sdramӦ<EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
******************************************************************************
* @attention
*
* ʵ<EFBFBD><EFBFBD>ƽ̨:Ұ<EFBFBD><EFBFBD> STM32 H743 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD>̳ :http://www.chuxue123.com
* <EFBFBD>Ա<EFBFBD> :http://firestm32.taobao.com
*
******************************************************************************
*/
#include "./sdram/bsp_sdram.h"
static FMC_SDRAM_CommandTypeDef Command;
SDRAM_HandleTypeDef hsdram1;
#define sdramHandle hsdram1
/**
* @brief <EFBFBD>ӳ<EFBFBD>һ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
* @param <EFBFBD>ӳٵ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>
* @retval None
*/
static void SDRAM_delay(__IO uint32_t nCount)
{
__IO uint32_t index = 0;
for(index = (100000 * nCount); index != 0; index--)
{
}
}
/**
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SDRAM<EFBFBD><EFBFBD>IO
* @param <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
static void SDRAM_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* ʹ<><CAB9>SDRAM<41><4D><EFBFBD>ص<EFBFBD>IOʱ<4F><CAB1> */
/*<2A><>ַ<EFBFBD>ź<EFBFBD><C5BA><EFBFBD>*/
FMC_A0_GPIO_CLK();FMC_A1_GPIO_CLK(); FMC_A2_GPIO_CLK();
FMC_A3_GPIO_CLK();FMC_A4_GPIO_CLK(); FMC_A5_GPIO_CLK();
FMC_A6_GPIO_CLK();FMC_A7_GPIO_CLK(); FMC_A8_GPIO_CLK();
FMC_A9_GPIO_CLK();FMC_A10_GPIO_CLK();FMC_A11_GPIO_CLK();
FMC_A12_GPIO_CLK();
/*<2A><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD>*/
FMC_D0_GPIO_CLK(); FMC_D1_GPIO_CLK() ; FMC_D2_GPIO_CLK() ;
FMC_D3_GPIO_CLK(); FMC_D4_GPIO_CLK() ; FMC_D5_GPIO_CLK() ;
FMC_D6_GPIO_CLK(); FMC_D7_GPIO_CLK() ; FMC_D8_GPIO_CLK() ;
FMC_D9_GPIO_CLK(); FMC_D10_GPIO_CLK(); FMC_D11_GPIO_CLK();
FMC_D12_GPIO_CLK();FMC_D13_GPIO_CLK(); FMC_D14_GPIO_CLK();
FMC_D15_GPIO_CLK();FMC_D16_GPIO_CLK(); FMC_D17_GPIO_CLK();
FMC_D18_GPIO_CLK();FMC_D19_GPIO_CLK(); FMC_D20_GPIO_CLK();
FMC_D21_GPIO_CLK();FMC_D22_GPIO_CLK(); FMC_D23_GPIO_CLK();
FMC_D24_GPIO_CLK();FMC_D25_GPIO_CLK(); FMC_D26_GPIO_CLK();
FMC_D27_GPIO_CLK();FMC_D28_GPIO_CLK(); FMC_D29_GPIO_CLK();
FMC_D30_GPIO_CLK();FMC_D31_GPIO_CLK();
/*<2A><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD>*/
FMC_CS_GPIO_CLK() ; FMC_BA0_GPIO_CLK(); FMC_BA1_GPIO_CLK() ;
FMC_WE_GPIO_CLK() ; FMC_RAS_GPIO_CLK(); FMC_CAS_GPIO_CLK();
FMC_CLK_GPIO_CLK(); FMC_CKE_GPIO_CLK(); FMC_UDQM_GPIO_CLK();
FMC_LDQM_GPIO_CLK();FMC_UDQM2_GPIO_CLK();FMC_LDQM2_GPIO_CLK();
/*-- SDRAM IO <20><><EFBFBD><EFBFBD> -----------------------------------------------------*/
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;//<2F><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ù<EFBFBD><C3B9><EFBFBD>
GPIO_InitStructure.Pull = GPIO_PULLUP;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStructure.Alternate = GPIO_AF12_FMC;
/*<2A><>ַ<EFBFBD>ź<EFBFBD><C5BA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
GPIO_InitStructure.Pin = FMC_A0_GPIO_PIN;
HAL_GPIO_Init(FMC_A0_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_A1_GPIO_PIN;
HAL_GPIO_Init(FMC_A1_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_A2_GPIO_PIN;
HAL_GPIO_Init(FMC_A2_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_A3_GPIO_PIN;
HAL_GPIO_Init(FMC_A3_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_A4_GPIO_PIN;
HAL_GPIO_Init(FMC_A4_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_A5_GPIO_PIN;
HAL_GPIO_Init(FMC_A5_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_A6_GPIO_PIN;
HAL_GPIO_Init(FMC_A6_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_A7_GPIO_PIN;
HAL_GPIO_Init(FMC_A7_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_A8_GPIO_PIN;
HAL_GPIO_Init(FMC_A8_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_A9_GPIO_PIN;
HAL_GPIO_Init(FMC_A9_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_A10_GPIO_PIN;
HAL_GPIO_Init(FMC_A10_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_A11_GPIO_PIN;
HAL_GPIO_Init(FMC_A11_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_A12_GPIO_PIN;
HAL_GPIO_Init(FMC_A12_GPIO_PORT, &GPIO_InitStructure);
/*<2A><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
GPIO_InitStructure.Pin = FMC_D0_GPIO_PIN;
HAL_GPIO_Init(FMC_D0_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D1_GPIO_PIN;
HAL_GPIO_Init(FMC_D1_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D2_GPIO_PIN;
HAL_GPIO_Init(FMC_D2_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D3_GPIO_PIN;
HAL_GPIO_Init(FMC_D3_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D4_GPIO_PIN;
HAL_GPIO_Init(FMC_D4_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D5_GPIO_PIN;
HAL_GPIO_Init(FMC_D5_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D6_GPIO_PIN;
HAL_GPIO_Init(FMC_D6_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D7_GPIO_PIN;
HAL_GPIO_Init(FMC_D7_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D8_GPIO_PIN;
HAL_GPIO_Init(FMC_D8_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D9_GPIO_PIN;
HAL_GPIO_Init(FMC_D9_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D10_GPIO_PIN;
HAL_GPIO_Init(FMC_D10_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D11_GPIO_PIN;
HAL_GPIO_Init(FMC_D11_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D12_GPIO_PIN;
HAL_GPIO_Init(FMC_D12_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D13_GPIO_PIN;
HAL_GPIO_Init(FMC_D13_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D14_GPIO_PIN;
HAL_GPIO_Init(FMC_D14_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D15_GPIO_PIN;
HAL_GPIO_Init(FMC_D15_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D16_GPIO_PIN;
HAL_GPIO_Init(FMC_D16_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D17_GPIO_PIN;
HAL_GPIO_Init(FMC_D17_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D18_GPIO_PIN;
HAL_GPIO_Init(FMC_D18_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D19_GPIO_PIN;
HAL_GPIO_Init(FMC_D19_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D20_GPIO_PIN;
HAL_GPIO_Init(FMC_D20_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D21_GPIO_PIN;
HAL_GPIO_Init(FMC_D21_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D22_GPIO_PIN;
HAL_GPIO_Init(FMC_D22_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D23_GPIO_PIN;
HAL_GPIO_Init(FMC_D23_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D24_GPIO_PIN;
HAL_GPIO_Init(FMC_D24_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D25_GPIO_PIN;
HAL_GPIO_Init(FMC_D25_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D26_GPIO_PIN;
HAL_GPIO_Init(FMC_D26_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D27_GPIO_PIN;
HAL_GPIO_Init(FMC_D27_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D28_GPIO_PIN;
HAL_GPIO_Init(FMC_D28_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D29_GPIO_PIN;
HAL_GPIO_Init(FMC_D29_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D30_GPIO_PIN;
HAL_GPIO_Init(FMC_D30_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_D31_GPIO_PIN;
HAL_GPIO_Init(FMC_D31_GPIO_PORT, &GPIO_InitStructure);
/*<2A><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD>*/
GPIO_InitStructure.Pin = FMC_CS_GPIO_PIN;
HAL_GPIO_Init(FMC_CS_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_BA0_GPIO_PIN;
HAL_GPIO_Init(FMC_BA0_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_BA1_GPIO_PIN;
HAL_GPIO_Init(FMC_BA1_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_WE_GPIO_PIN;
HAL_GPIO_Init(FMC_WE_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_RAS_GPIO_PIN;
HAL_GPIO_Init(FMC_RAS_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_CAS_GPIO_PIN;
HAL_GPIO_Init(FMC_CAS_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_CLK_GPIO_PIN;
HAL_GPIO_Init(FMC_CLK_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_CKE_GPIO_PIN;
HAL_GPIO_Init(FMC_CKE_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_UDQM_GPIO_PIN;
HAL_GPIO_Init(FMC_UDQM_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_LDQM_GPIO_PIN;
HAL_GPIO_Init(FMC_LDQM_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_UDQM2_GPIO_PIN;
HAL_GPIO_Init(FMC_UDQM2_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = FMC_LDQM2_GPIO_PIN;
HAL_GPIO_Init(FMC_LDQM2_GPIO_PORT, &GPIO_InitStructure);
}
/**
* @brief <EFBFBD><EFBFBD>SDRAMоƬ<EFBFBD><EFBFBD><EFBFBD>г<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param None.
* @retval None.
*/
static void SDRAM_InitSequence(void)
{
uint32_t tmpr = 0;
/* Step 1 ----------------------------------------------------------------*/
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEA3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B9A9>SDRAM<41><4D>ʱ<EFBFBD><CAB1> */
Command.CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;
Command.CommandTarget = FMC_COMMAND_TARGET_BANK;
Command.AutoRefreshNumber = 1;
Command.ModeRegisterDefinition = 0;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
HAL_SDRAM_SendCommand(&sdramHandle, &Command, SDRAM_TIMEOUT);
/* Step 2: <20><>ʱ100us */
SDRAM_delay(1);
/* Step 3 ----------------------------------------------------------------*/
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEA3BA><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>bankԤ<6B><D4A4><EFBFBD><EFBFBD> */
Command.CommandMode = FMC_SDRAM_CMD_PALL;
Command.CommandTarget = FMC_COMMAND_TARGET_BANK;
Command.AutoRefreshNumber = 1;
Command.ModeRegisterDefinition = 0;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
HAL_SDRAM_SendCommand(&sdramHandle, &Command, SDRAM_TIMEOUT);
/* Step 4 ----------------------------------------------------------------*/
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD>ˢ<EFBFBD><CBA2> */
Command.CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
Command.CommandTarget = FMC_COMMAND_TARGET_BANK;
Command.AutoRefreshNumber = 8;
Command.ModeRegisterDefinition = 0;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
HAL_SDRAM_SendCommand(&sdramHandle, &Command, SDRAM_TIMEOUT);
/* Step 5 ----------------------------------------------------------------*/
/* <20><><EFBFBD><EFBFBD>sdram<61>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
tmpr = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1 |
SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL |
SDRAM_MODEREG_CAS_LATENCY_3 |
SDRAM_MODEREG_OPERATING_MODE_STANDARD |
SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEA3BA><EFBFBD><EFBFBD>SDRAM<41>Ĵ<EFBFBD><C4B4><EFBFBD> */
Command.CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
Command.CommandTarget = FMC_COMMAND_TARGET_BANK;
Command.AutoRefreshNumber = 1;
Command.ModeRegisterDefinition = tmpr;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
HAL_SDRAM_SendCommand(&sdramHandle, &Command, SDRAM_TIMEOUT);
/* Step 6 ----------------------------------------------------------------*/
/* <20><><EFBFBD><EFBFBD>ˢ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD> */
/* ˢ<><CBA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=64ms/4096<39><36>=15.625us */
/* COUNT=(15.625us x Freq) - 20 */
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˢ<EFBFBD><CBA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
HAL_SDRAM_ProgramRefreshRate(&sdramHandle, 1855);
}
/**
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>SDRAM<EFBFBD><EFBFBD>FMC<EFBFBD><EFBFBD>GPIO<EFBFBD>ӿڣ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SDRAM<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param None
* @retval None
*/
void SDRAM_Init(void)
{
FMC_SDRAM_TimingTypeDef SdramTiming;
RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;
/* <20><><EFBFBD><EFBFBD>FMC<4D>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD>ص<EFBFBD> GPIO*/
SDRAM_GPIO_Config();
/* <20><><EFBFBD><EFBFBD>SDRAMʱ<4D><CAB1>Դ*/
RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_FMC;
RCC_PeriphClkInit.PLL2.PLL2M = 5;
RCC_PeriphClkInit.PLL2.PLL2N = 144;
RCC_PeriphClkInit.PLL2.PLL2P = 2;
RCC_PeriphClkInit.PLL2.PLL2Q = 2;
RCC_PeriphClkInit.PLL2.PLL2R = 3;
RCC_PeriphClkInit.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_2;
RCC_PeriphClkInit.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
RCC_PeriphClkInit.PLL2.PLL2FRACN = 0;
RCC_PeriphClkInit.FmcClockSelection = RCC_FMCCLKSOURCE_PLL2;
if (HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit) != HAL_OK)
{
while(1);
}
/* ʹ<><CAB9> FMC ʱ<><CAB1> */
__FMC_CLK_ENABLE();
/*ִ<><D6B4>SDRAM1<4D><31><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
hsdram1.Instance = FMC_SDRAM_DEVICE;
/* hsdram1<6D><EFBFBD><E1B9B9><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>*/
hsdram1.Init.SDBank = FMC_SDRAM_BANK2;
hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9;//SDRAM<41><4D><EFBFBD><EFBFBD>
hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13;//SDRAM<41><4D><EFBFBD><EFBFBD>
hsdram1.Init.MemoryDataWidth = SDRAM_MEMORY_WIDTH;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD>Ϊ32λ
hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;//4<><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3;//<2F>е<EFBFBD>ַѡͨ<D1A1><CDA8><EFBFBD><EFBFBD>ʱ
hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;//<2F><>ֹд<D6B9><D0B4><EFBFBD><EFBFBD>
hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2;//SDRAMʱ<4D><CAB1>120MHz
hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE; //ʹ<><CAB9>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1; //<2F><>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>ʱ
/* SDRAMʱ<4D><CAB1> */
SdramTiming.LoadToActiveDelay = 2;//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>ˢ<EFBFBD><CBA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>
SdramTiming.ExitSelfRefreshDelay = 8;//<2F>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>ˢ<EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>
SdramTiming.SelfRefreshTime = 5;//<2F><><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>
SdramTiming.RowCycleDelay = 8;//<2F><><EFBFBD><EFBFBD>ˢ<EFBFBD><CBA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>
SdramTiming.WriteRecoveryTime = 2;//д<><D0B4><EFBFBD><EFBFBD><EFBFBD>Ԥ<EEB5BD><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>
SdramTiming.RPDelay = 2;//Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>
SdramTiming.RCDDelay = 2;//<2F><><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ж<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>
HAL_SDRAM_Init(&hsdram1, &SdramTiming);
/* FMC SDRAM <20>豸ʱ<E8B1B8><CAB1><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC> */
SDRAM_InitSequence();
}
/**
* @brief <EFBFBD>ԡ<EFBFBD><EFBFBD>֡<EFBFBD>Ϊ<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>sdramд<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param pBuffer: ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ָ<EFBFBD><EFBFBD>
* @param uwWriteAddress: Ҫд<EFBFBD><EFBFBD><EFBFBD><EFBFBD>SDRAM<EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD>ַ
* @param uwBufferSize: Ҫд<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD>С
* @retval None.
*/
void SDRAM_WriteBuffer(uint32_t* pBuffer, uint32_t uwWriteAddress, uint32_t uwBufferSize)
{
__IO uint32_t write_pointer = (uint32_t)uwWriteAddress;
/* <20><>ֹд<D6B9><D0B4><EFBFBD><EFBFBD> */
HAL_SDRAM_WriteProtection_Disable(&hsdram1);
/* <20><><EFBFBD><EFBFBD>SDRAM<41><4D>־<EFBFBD><D6BE><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>SDRAM<41><4D><EFBFBD><EFBFBD> */
while(HAL_SDRAM_GetState(&hsdram1) != RESET)
{
}
/* ѭ<><D1AD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
for (; uwBufferSize != 0; uwBufferSize--)
{
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>SDRAM */
*(uint32_t *) (SDRAM_BANK_ADDR + write_pointer) = *pBuffer++;
/* <20><>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>*/
write_pointer += 4;
}
}
/**
* @brief <EFBFBD><EFBFBD>SDRAM<EFBFBD>ж<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param pBuffer: ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>buffer
* @param ReadAddress: Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>ݵĵ<EFBFBD>ʮ
* @param uwBufferSize: Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD>С
* @retval None.
*/
void SDRAM_ReadBuffer(uint32_t* pBuffer, uint32_t uwReadAddress, uint32_t uwBufferSize)
{
__IO uint32_t write_pointer = (uint32_t)uwReadAddress;
/* <20><><EFBFBD><EFBFBD>SDRAM<41><4D>־<EFBFBD><D6BE><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>SDRAM<41><4D><EFBFBD><EFBFBD> */
while ( HAL_SDRAM_GetState(&hsdram1) != RESET)
{
}
/*<2A><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> */
for(; uwBufferSize != 0x00; uwBufferSize--)
{
*pBuffer++ = *(__IO uint32_t *)(SDRAM_BANK_ADDR + write_pointer );
/* <20><>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>*/
write_pointer += 4;
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>SDRAM<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param None
* @retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
*/
uint8_t SDRAM_Test(void)
{
/*д<><D0B4><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD><EFBFBD>*/
uint32_t counter=0;
/* 8λ<38><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
uint8_t ubWritedata_8b = 0, ubReaddata_8b = 0;
/* 16λ<36><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
uint16_t uhWritedata_16b = 0, uhReaddata_16b = 0;
SDRAM_INFO("<EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD>SDRAM<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16λ<EFBFBD>ķ<EFBFBD>ʽ<EFBFBD><EFBFBD>дsdram...");
/*<2A><><38><CEBB>ʽ<EFBFBD><CABD>д<EFBFBD><D0B4><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>У<EFBFBD><D0A3>*/
/* <20><>SDRAM<41><4D><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0 <20><>SDRAM_SIZE<5A><45><EFBFBD><EFBFBD>8λΪ<CEBB><CEAA>λ<EFBFBD><CEBB> */
for (counter = 0x00; counter < SDRAM_SIZE; counter++)
{
*(__IO uint8_t*) (SDRAM_BANK_ADDR + counter) = (uint8_t)0x0;
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SDRAMд<4D><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 8λ */
for (counter = 0; counter < SDRAM_SIZE; counter++)
{
*(__IO uint8_t*) (SDRAM_BANK_ADDR + counter) = (uint8_t)(ubWritedata_8b + counter);
}
/* <20><>ȡ SDRAM <20><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD>*/
for(counter = 0; counter<SDRAM_SIZE;counter++ )
{
ubReaddata_8b = *(__IO uint8_t*)(SDRAM_BANK_ADDR + counter); //<2F>Ӹõ<D3B8>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(ubReaddata_8b != (uint8_t)(ubWritedata_8b + counter)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD>ʧ<EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD><EFBFBD><EFBFBD>
{
SDRAM_ERROR("<EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>󣡳<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ã<EFBFBD>%d",counter);
return 0;
}
}
/*<2A><>16λ<36><CEBB>ʽ<EFBFBD><CABD>д<EFBFBD><D0B4><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
/* <20><>SDRAM<41><4D><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0 */
for (counter = 0x00; counter < SDRAM_SIZE/2; counter++)
{
*(__IO uint16_t*) (SDRAM_BANK_ADDR + 2*counter) = (uint16_t)0x00;
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SDRAMд<4D><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 16λ */
for (counter = 0; counter < SDRAM_SIZE/2; counter++)
{
*(__IO uint16_t*) (SDRAM_BANK_ADDR + 2*counter) = (uint16_t)(uhWritedata_16b + counter);
}
/* <20><>ȡ SDRAM <20><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD>*/
for(counter = 0; counter<SDRAM_SIZE/2;counter++ )
{
uhReaddata_16b = *(__IO uint16_t*)(SDRAM_BANK_ADDR + 2*counter); //<2F>Ӹõ<D3B8>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(uhReaddata_16b != (uint16_t)(uhWritedata_16b + counter)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD>ʧ<EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD><EFBFBD><EFBFBD>
{
SDRAM_ERROR("16λ<EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>󣡳<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ã<EFBFBD>%d",counter);
return 0;
}
}
SDRAM_INFO("SDRAM<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>return 1 */
return 1;
}
/*********************************************END OF FILE**********************/