STM32H750XB_RT-THREAD/26-27-LTDC—液晶显示/刷外部FLASH程序(如何恢复字库)/User/sdram/bsp_sdram.c

568 lines
17 KiB
C
Raw Permalink 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 H750 <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/8192<39><32>=7.8125us */
/* COUNT=(7.8125us x Freq) - 20 */
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˢ<EFBFBD><CBA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
HAL_SDRAM_ProgramRefreshRate(&sdramHandle, 824);
}
/**
* @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)
{
//ʹ<><CAB9>GPIO<49><4F>ʱ<EFBFBD><CAB1>
RCC->AHB4ENR |= 0x1FC;
//<2F><><EFBFBD>ö˿<C3B6>C<EFBFBD><43>D<EFBFBD><44>E<EFBFBD><45>F<EFBFBD><46>G<EFBFBD><47>H<EFBFBD><48>I<EFBFBD><49>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPIOC->MODER = 0xFFFFFFFE;
GPIOC->OTYPER = 0;
GPIOC->OSPEEDR = 0x00000003;
GPIOC->PUPDR = 0x00000001;
GPIOC->AFR[0] = 0x0000000C;
GPIOD->MODER = 0xAFEAFFFA;
GPIOD->OTYPER = 0;
GPIOD->OSPEEDR = 0xF03F000F;
GPIOD->PUPDR = 0x50150005;
GPIOD->AFR[0] = 0x000000CC;
GPIOD->AFR[1] = 0xCC000CCC;
GPIOE->MODER = 0xAAAABFFA;
GPIOE->OTYPER = 0;
GPIOE->OSPEEDR = 0xFFFFC00F;
GPIOE->PUPDR = 0x55554005;
GPIOE->AFR[0] = 0xC00000CC;
GPIOE->AFR[1] = 0xCCCCCCCC;
GPIOF->MODER = 0xAABFFAAA;
GPIOF->OTYPER = 0;
GPIOF->OSPEEDR = 0xFFC00FFF;
GPIOF->PUPDR = 0x55400555;
GPIOF->AFR[0] = 0x00CCCCCC;
GPIOF->AFR[1] = 0xCCCCC000;
GPIOG->MODER = 0xBFFEFAEA;
GPIOG->OTYPER = 0;
GPIOG->OSPEEDR = 0xC0030F3F;
GPIOG->PUPDR = 0x40010515;
GPIOG->AFR[0] = 0x00CC0CCC;
GPIOG->AFR[1] = 0xC000000C;
GPIOH->MODER = 0xAAAAAFFF;
GPIOH->OTYPER = 0;
GPIOH->OSPEEDR = 0xFFFFF000;
GPIOH->PUPDR = 0x55555000;
GPIOH->AFR[0] = 0xCC000000;
GPIOH->AFR[1] = 0xCCCCCCCC;
GPIOI->MODER = 0xFFEBAAAA;
GPIOI->OTYPER = 0;
GPIOI->OSPEEDR = 0x003CFFFF;
GPIOI->PUPDR = 0x00145555;
GPIOI->AFR[0] = 0xCCCCCCCC;
GPIOI->AFR[1] = 0x00000CC0;
// //ʹ<><CAB9>PLL2R
// RCC->PLLCFGR |= (1 << 21);
// //<2F><><EFBFBD><EFBFBD>PLL2
// RCC->CR &= ~(1 << 26);
// RCC->PLLCKSELR |= (5 << 12);
// RCC->PLL2DIVR = 0x0201028F;
// RCC->PLLCFGR |= (2<<6);
// RCC->PLLCFGR &= ~(1<<5);
// RCC->CR |= (1 << 26);
// while(!(RCC->CR&(1<<27)));
//RCC->D1CCIPR |= (1<<0);
//ʹ<><CAB9>FMCʱ<43><CAB1>
RCC->AHB3ENR |= (1 << 12);
FMC_SDRAM_DEVICE->SDCR[0] = 0x00003AD0;
FMC_SDRAM_DEVICE->SDCR[1] = 0x000001E9;
FMC_SDRAM_DEVICE->SDTR[0] = 0x0F1F7FFF;
FMC_SDRAM_DEVICE->SDTR[1] = 0x01010471;
FMC_Bank1_R->BTCR[0] |= 0x80000000;
/* Step 1 ----------------------------------------------------------------*/
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEA3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B9A9>SDRAM<41><4D>ʱ<EFBFBD><CAB1> */
FMC_SDRAM_DEVICE->SDCMR = 0x00000009;
while((FMC_SDRAM_DEVICE->SDSR&(1<<5)));
/* 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> */
FMC_SDRAM_DEVICE->SDCMR = 0x0000000A;
while((FMC_SDRAM_DEVICE->SDSR&(1<<5)));
/* Step 4 ----------------------------------------------------------------*/
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD>ˢ<EFBFBD><CBA2> */
FMC_SDRAM_DEVICE->SDCMR = 0x000000EB;
while((FMC_SDRAM_DEVICE->SDSR&(1<<5)));
/* Step 5 ----------------------------------------------------------------*/
/* <20><><EFBFBD><EFBFBD>sdram<61>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
FMC_SDRAM_DEVICE->SDCMR =0x0004600C;
while((FMC_SDRAM_DEVICE->SDSR&(1<<5)));
/* Step 6 ----------------------------------------------------------------*/
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˢ<EFBFBD><CBA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
FMC_SDRAM_DEVICE->SDRTR |= (1855<<1);
}
/**
* @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**********************/