大学生
最后登录1970-1-1
在线时间 小时
注册时间2017-7-7
|
楼主 |
发表于 2017-7-9 21:22:13
|
显示全部楼层
乱码了,再发一次
/***************************/;
//向SDRAM发送命令
//bankx:0,向BANK5上面的SDRAM发送指令
// 1,向BANK6上面的SDRAM发送指令
//cmd:指令(0,正常模式/1,时钟配置使能/2,预充电所有存储区/3,自动刷新/4,加载模式寄存器/5,自刷新/6,掉电)
//refresh:自刷新次数(cmd=3时有效)
//regval:模式寄存器的定义
//返回值:0,正常;1,失败.
u8 SDRAM_Send_Cmd(u8 bankx,u8 cmd,u8 refresh,u16 regval)
{
u32 retry=0;
u32 tempreg=0;
tempreg|=cmd<<0; //设置指令
tempreg|=1<<(4-bankx); //设置发送指令到bank5还是6
tempreg|=refresh<<5; //设置自刷新次数
tempreg|=regval<<9; //设置模式寄存器的值
FMC_Bank5_6->SDCMR=tempreg; //配置寄存器
while((FMC_Bank5_6->SDSR&(1<<5)))//等待指令发送完成
{
retry++;
if(retry>0X1FFFFF)return 1;
}
return 0;
}
/***********************************************************************************/
/*** FMC_SDRAM_GPIO_Config ***/
void FMC_SDRAM_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*** 使能GPIO时钟 ***/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF
| RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOH, ENABLE);
/*** 配置GPIO端口模式 ***/ //SDRAM__Bank2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOC, &GPIO_InitStructure); /*** 配置GPIO端口C ***/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9
| GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_Init(GPIOD, &GPIO_InitStructure); /*** 配置GPIO端口D ***/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 |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_Init(GPIOE, &GPIO_InitStructure); /*** 配置GPIO端口E ***/
GPIO_InitStructure.GPIO_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_Init(GPIOF, &GPIO_InitStructure); /*** 配置GPIO端口F ***/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5
| GPIO_Pin_8 | GPIO_Pin_15;
GPIO_Init(GPIOG, &GPIO_InitStructure); /*** 配置GPIO端口G ***/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_Init(GPIOH, &GPIO_InitStructure); /*** 配置GPIO端口H ***/
/*** GPIO_AFIO_Configration ***/
GPIO_PinAFConfig(GPIOF, GPIO_PinSource0, GPIO_AF_FMC); //FMC_A0
GPIO_PinAFConfig(GPIOF, GPIO_PinSource1, GPIO_AF_FMC); //FMC_A1
GPIO_PinAFConfig(GPIOF, GPIO_PinSource2, GPIO_AF_FMC); //FMC_A2
GPIO_PinAFConfig(GPIOF, GPIO_PinSource3, GPIO_AF_FMC); //FMC_A3
GPIO_PinAFConfig(GPIOF, GPIO_PinSource4, GPIO_AF_FMC); //FMC_A4
GPIO_PinAFConfig(GPIOF, GPIO_PinSource5, GPIO_AF_FMC); //FMC_A5
GPIO_PinAFConfig(GPIOF, GPIO_PinSource12, GPIO_AF_FMC); //FMC_A6
GPIO_PinAFConfig(GPIOF, GPIO_PinSource13, GPIO_AF_FMC); //FMC_A7
GPIO_PinAFConfig(GPIOF, GPIO_PinSource14, GPIO_AF_FMC); //FMC_A8
GPIO_PinAFConfig(GPIOF, GPIO_PinSource15, GPIO_AF_FMC); //FMC_A9
GPIO_PinAFConfig(GPIOG, GPIO_PinSource0, GPIO_AF_FMC); //FMC_A10
GPIO_PinAFConfig(GPIOG, GPIO_PinSource1, GPIO_AF_FMC); //FMC_A11
GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FMC); //FMC_DA0
GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FMC); //FMC_DA1
GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FMC); //FMC_DA2
GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FMC); //FMC_DA3
GPIO_PinAFConfig(GPIOE, GPIO_PinSource7, GPIO_AF_FMC); //FMC_DA4
GPIO_PinAFConfig(GPIOE, GPIO_PinSource8, GPIO_AF_FMC); //FMC_DA5
GPIO_PinAFConfig(GPIOE, GPIO_PinSource9, GPIO_AF_FMC); //FMC_DA6
GPIO_PinAFConfig(GPIOE, GPIO_PinSource10, GPIO_AF_FMC); //FMC_DA7
GPIO_PinAFConfig(GPIOE, GPIO_PinSource11, GPIO_AF_FMC); //FMC_DA8
GPIO_PinAFConfig(GPIOE, GPIO_PinSource12, GPIO_AF_FMC); //FMC_DA9
GPIO_PinAFConfig(GPIOE, GPIO_PinSource13, GPIO_AF_FMC); //FMC_DA10
GPIO_PinAFConfig(GPIOE, GPIO_PinSource14, GPIO_AF_FMC); //FMC_DA11
GPIO_PinAFConfig(GPIOE, GPIO_PinSource15, GPIO_AF_FMC); //FMC_DA12
GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FMC); //FMC_DA13
GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FMC); //FMC_DA14
GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FMC); //FMC_DA15
GPIO_PinAFConfig(GPIOG, GPIO_PinSource4, GPIO_AF_FMC); //FMC_A14_BA0
GPIO_PinAFConfig(GPIOG, GPIO_PinSource5, GPIO_AF_FMC); //FMC_A15_BA1
GPIO_PinAFConfig(GPIOE, GPIO_PinSource0, GPIO_AF_FMC); //FMC_NBL0
GPIO_PinAFConfig(GPIOE, GPIO_PinSource1, GPIO_AF_FMC); //FMC_NBL1
GPIO_PinAFConfig(GPIOC, GPIO_PinSource0, GPIO_AF_FMC); //FMC_SDNWE
GPIO_PinAFConfig(GPIOG, GPIO_PinSource8, GPIO_AF_FMC); //FMC_SCLK
GPIO_PinAFConfig(GPIOF, GPIO_PinSource11, GPIO_AF_FMC); //FMC_SDNRAS
GPIO_PinAFConfig(GPIOG, GPIO_PinSource15, GPIO_AF_FMC); //FMC_SDNCAS
GPIO_PinAFConfig(GPIOH, GPIO_PinSource6, GPIO_AF_FMC); //FMC_SDNE1
GPIO_PinAFConfig(GPIOH, GPIO_PinSource7, GPIO_AF_FMC); //FMC_SDCKE1
}
/***********************************************************************************/
/*** FMC_SDRAM_Init ***/
void FMC_SDRAM_Init(void)
{
uint32_t SDRAM_SDTR_Temp = 0x00000000;
uint32_t SDRAM_SDCR_Temp = 0x00000000;
/*** 开启FMC_SDRAM 时钟 ***/
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FMC, ENABLE);
/*** SDRAM_时序寄存器(SDTR2) ***/ //SDRAM__Bank2 //以(90MHZ__11.1ns)计算 //所有均减1;
SDRAM_SDTR_Temp |= 1<<24; //TRCD =1_0001__2个周期__(15ns)__行到列延迟
SDRAM_SDTR_Temp |= 1<<20; //TRP = 1_0001__2个周期__(15ns)__行预充电延迟
SDRAM_SDTR_Temp |= 1<<16; //TWR = 1_0001__2个周期__(2CLK)__恢愎延迟
SDRAM_SDTR_Temp |= 5<<12; //TRC = 5_0101__6个周期__(63ns)__行循环延迟
SDRAM_SDTR_Temp |= 3<<8; //TRAS =3_0011__4个周期__(42ns)__自刷新延迟
SDRAM_SDTR_Temp |= 6<<4; //TXSR =6_0111__7个周期__(70ns)__退出自刷新延迟
SDRAM_SDTR_Temp |= 1<<0; //TMRD =1_0001__2个周期__(2CLK)__加载模式寄存器到激活
/*** 使用BANK1 只需设置BANK1, 使用BANK2 必需先设BANK1 再设BANK2***/
FMC_Bank5_6 -> SDTR[0] = SDRAM_SDTR_Temp; //将参数整合后写入时序寄存器_SDTR1_
FMC_Bank5_6 -> SDTR[1] = SDRAM_SDTR_Temp; //将参数整合后写入时序寄存器_SDTR2_
/*** SDRAM_控制寄存器(SDCR2) ***/ //SDRAM__Bank2 //以(90MHZ__11.1ns)计算
SDRAM_SDCR_Temp |= 1<<13; //RPIPE = 1_(01); 读管道__0个HCLK延迟
SDRAM_SDCR_Temp &= ~(1<<12); //RBURST = 0; 突发读__始终关闭单次突发读请求
SDRAM_SDCR_Temp |= 2<<10; //SDCLK = 2XHCLK; SDRAM 时钟配置 SDCLK = HCLK/2;
SDRAM_SDCR_Temp &= ~(1<<9); //WP = 0; 写保护__允许写访问
SDRAM_SDCR_Temp |= 2<<7; //CAS = 2_(10); CAS延迟__2个周期, 必需与内存上的CAS Length设置保持一致
SDRAM_SDCR_Temp |= 1<<6; //NB = 1; 内存区域数__4个 BANK;
SDRAM_SDCR_Temp |= 1<<4; //NWID = 1_(01); 存储器总线宽__16Bit;
SDRAM_SDCR_Temp |= 1<<2; //NR = 1_(01); 行地址位数__12位;
SDRAM_SDCR_Temp &= ~(3<<0); //NC = 0_(00); 列地址位数__8位;
/*** 使用BANK1 只需设置BANK1, 使用BANK2 必需先设BANK1 再设BANK2***/
FMC_Bank5_6 -> SDCR[0] = SDRAM_SDCR_Temp; //将参数整合后写入时序寄存器_SDCR1_
FMC_Bank5_6 -> SDCR[1] = SDRAM_SDCR_Temp; //将参数整合后写入时序寄存器_SDCR2_
}
/***********************************************************************************/
/**
* @brief 初始化配置使用SDRAM的FMC及GPIO接口,
* 本函数在SDRAM读写操作前需要被调用
* @param None
* @retval None
*/
void SDRAM_Init(void)
{
u32 sdctrlreg=0,sdtimereg=0;
u16 mregval=0;
FMC_SDRAM_GPIO_Config();
/* 使能 FMC 时钟 */
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FMC, ENABLE);
FMC_SDRAM_Init();
SDRAM_Send_Cmd(1,1,1,0); //时钟配置使能
delay_us(500); //至少延迟200us.
SDRAM_Send_Cmd(1,2,1,0); //对所有存储区预充电
SDRAM_Send_Cmd(1,3,8,0); //设置自刷新次数
mregval|=2<<0; //设置突发长度:4(可以是1/2/4/8)
mregval|=0<<3; //设置突发类型:连续(可以是连续/交错)
mregval|=2<<4; //设置CAS值:3(可以是2/3)
mregval|=0<<7; //设置操作模式:0,标准模式
mregval|=1<<9; //设置突发写模式:1,单点访问
SDRAM_Send_Cmd(1,4,1,mregval); //设置SDRAM的模式寄存器
//刷新频率计数器(以SDCLK频率计数),计算方法:
//COUNT=SDRAM刷新周期/行数-20=SDRAM刷新周期(us)*SDCLK频率(Mhz)/行数
//我们使用的SDRAM刷新周期为64ms,SDCLK=168/2=84Mhz,行数为4096(2^12).
//所以,COUNT=(64*1000*84)/4096-20=1293
FMC_Bank5_6-> SDRTR |= 1293<<1; //设置刷新频率计数器
} |
|