银杏科技有限公司旗下技术文档发布平台 | |||
技术支持电话 | 0379-69926675-801 | ||
技术支持邮件 | Gingko@vip.163.com | ||
版本 | 日期 | 作者 | 修改内容 |
---|---|---|---|
V0.1 | 2020-11-11 | gingko | 初次建立 |
1.在主界面选择File–>New Project或者直接点击ACCEE TO MCU SELECTOR 2.出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置在搜索栏的下面,提供的各种查找方式,可以选择芯片内核,型号等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32F429IGHx。 3.配置RCC,使用外部时钟源 4.Debug选择Serial Wire时基源选择SysTick 5.将LEDG,LEDR,LEDB对应的PI3,PI4,PH14设置为GPIO_Output 6.引脚模式配置 7.配置FMC 8.时钟源设置,选择外部高速时钟源,配置为最大主频 9.工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可IDE我们使用的是 MDK V5.27 10.点击Code Generator,进行进一步配置
SDRAM具有多种工作模式,内部操作是一个复杂的状态机。SDRAM器件的引脚分为以下几类:
SDRAM的所有操作都同步于时钟。根据时钟上升沿控制管脚和地址输入的状态,可以产生多种输入命令:
1.主函数
int main(void) { int i,j; HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_FMC_Init(); BSP_SDRAM_Init(); for(j = 0; j < 64;j++) //向SDRAM中写入0~65536并读取校验 { for(i = 0;i < 65536;i++) { write_sdram((65536 * j + i),i); } } for(j = 0; j < 64; j++) { for(i = 0;i < 65536;i++) { if(i != read_sdram((65536 * j + i))) //读取SDRAM中的值,测试是否成功写入 { while(1) //测试失败,红色LED闪烁 { LED_RED_ON; HAL_Delay(500); LED_RED_OFF; HAL_Delay(500); } } } } HAL_Delay(1000); LED_RED_ON; //测试成功,红色LED常亮 while (1) { } }
2.SDRAM初始化函数
uint8_t BSP_SDRAM_Init(void) { static uint8_t sdramstatus = SDRAM_ERROR; /*SDRAM设备配置*/ SdramHandle.Instance = FMC_SDRAM_DEVICE; /* FMC SDRAM Bank配置 */ /* SD时钟频率为90 Mhz的定时配置(180Mhz / 2) */ /* TMRD:2个时钟周期 */ Timing.LoadToActiveDelay = 2; /* TXSR:最小值= 70ns(7x11.11ns) */ Timing.ExitSelfRefreshDelay = 7; /* TRAS:最小值= 42ns(4x11.11ns)最大值= 120k(ns) */ Timing.SelfRefreshTime = 4; /* TRC:最小值= 70(7x11.11ns) */ Timing.RowCycleDelay = 7; /* TWR:最小值 = 1 + 7ns(1 + 1x11.11ns) */ Timing.WriteRecoveryTime = 2; /* TRP: 20ns => 2x11.11ns*/ Timing.RPDelay = 2; /* TRCD: 20ns => 2x11.11ns */ Timing.RCDDelay = 2; /* FMC SDRAM控制配置 */ SdramHandle.Init.SDBank = FMC_SDRAM_BANK1; /* 列寻址: [7:0] */ SdramHandle.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8; /* 行寻址: [11:0] */ SdramHandle.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12; /*SDRAM的数据宽度 */ SdramHandle.Init.MemoryDataWidth = SDRAM_MEMORY_WIDTH; /*SDRAM内部的Bank数目 */ SdramHandle.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4; /*CASLatency的时钟个数*/ SdramHandle.Init.CASLatency = SDRAM_CAS_LATENCY; /*是否使能写保护模式 */ SdramHandle.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE; /*配置同步时钟SDCLK的参数*/ SdramHandle.Init.SDClockPeriod = SDCLOCK_PERIOD; /*是否使能突发读模式*/ SdramHandle.Init.ReadBurst = SDRAM_READBURST; /*在CAS个延迟后再等待多少个HCLK时钟才读取数据 */ SdramHandle.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1; /*SDRAM控制器初始化*/ BSP_SDRAM_MspInit(&SdramHandle, (void *)NULL); if(HAL_SDRAM_Init(&SdramHandle, &Timing) != HAL_OK) { sdramstatus = SDRAM_ERROR; } else { sdramstatus = SDRAM_OK; } /*SDRAM初始化顺序*/ BSP_SDRAM_Initialization_sequence(REFRESH_COUNT); return sdramstatus; }
3.SDRAM读写函数
#define write_sdram(offset,data) *(volatile unsigned short int *)(SDRAM_DEVICE_ADDR + (offset << 1)) = data #define read_sdram(offset) *(volatile unsigned short int *)(SDRAM_DEVICE_ADDR + (offset << 1))
4.FMC初始化函数
void MX_FMC_Init(void) { //本实验中我们只用到了FMC的引脚,时序配置使用官方提供的SDRAM驱动 FMC_SDRAM_TimingTypeDef SdramTiming = {0}; /* 执行SDRAM1存储器初始化序列 */ hsdram1.Instance = FMC_SDRAM_DEVICE; /* hsdram1初始化 */ hsdram1.Init.SDBank = FMC_SDRAM_BANK1; hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8; 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_1; hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE; hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_DISABLE; hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_DISABLE; hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0; /* Sdram时序 */ SdramTiming.LoadToActiveDelay = 16; SdramTiming.ExitSelfRefreshDelay = 16; SdramTiming.SelfRefreshTime = 16; SdramTiming.RowCycleDelay = 16; SdramTiming.WriteRecoveryTime = 16; SdramTiming.RPDelay = 16; SdramTiming.RCDDelay = 16; if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK) { Error_Handler( ); } }
SDRAM读写测试成功,红色LED灯常亮。测试失败红色LED灯闪烁。