野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8722|回复: 14

STM32 F429 挑战者 液晶屏成这样啦, 怎 么回事啊

[复制链接]
发表于 2017-7-7 14:50:07 | 显示全部楼层 |阅读模式
本帖最后由 wlq19911021 于 2017-7-7 14:54 编辑

STM32 F429 挑战者 液晶屏成这样啦, 怎 么回事啊
好像是内出问题了-
为什么会有那个线
一--------------------------一--------------------------
我可以很明确的说液晶屏驱动是没有问题的, 问题出在了内存上面, 为什么会这样啊




2017-7-7_144658-54.png
回复

使用道具 举报

 楼主| 发表于 2017-7-7 15:01:36 | 显示全部楼层
本帖最后由 wlq19911021 于 2017-7-7 15:02 编辑

还有个问题
---------------------------------------------------------------
//PLLSAIR = 2; PLLSAIQ = 20; PLLSAIN = 200;
----------------------------------------------------------------
为什么这个PLLSAIQ 非要设为20, 手册上不是2-15么?????
为什么设为15,
LTDC 层2会不正常显示, 内存也没问题啊,但画面会变成斜线,
难道PLLSAIQ上的设备会干扰层2不成么???????????-----------------------------------------------------------------
关建是PLLSAIQ 上的设备跟 LTDC没关系呀
截图1499410577.png
回复 支持 反对

使用道具 举报

发表于 2017-7-7 16:38:35 | 显示全部楼层
用开发板配套的例程
回复 支持 反对

使用道具 举报

发表于 2017-7-7 16:39:44 | 显示全部楼层
wlq19911021 发表于 2017-7-7 15:01
还有个问题
---------------------------------------------------------------
//PLLSAIR = 2; PLLSAIQ  ...

一切以实际代码测试为准,不要太相信手册,这些手册都是根据A系列的驱动来写的,现在是用429这种单片机,具体以实际代码为准。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-7 17:32:33 | 显示全部楼层
fire 发表于 2017-7-7 16:39
一切以实际代码测试为准,不要太相信手册,这些手册都是根据A系列的驱动来写的,现在是用429这种单片机, ...

能问一下火哥么 , 那个屏怎么这这样显示, 那个线条为什么会这样
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-7 17:33:01 | 显示全部楼层
fire 发表于 2017-7-7 16:39
一切以实际代码测试为准,不要太相信手册,这些手册都是根据A系列的驱动来写的,现在是用429这种单片机, ...

内存中没给它存线条啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-7 17:34:09 | 显示全部楼层
fire 发表于 2017-7-7 16:39
一切以实际代码测试为准,不要太相信手册,这些手册都是根据A系列的驱动来写的,现在是用429这种单片机, ...

再说一下,那个黑色的线条,很细, 是连续的,拍的有问题
回复 支持 反对

使用道具 举报

发表于 2017-7-7 17:37:22 | 显示全部楼层
wlq19911021 发表于 2017-7-7 17:32
能问一下火哥么 , 那个屏怎么这这样显示, 那个线条为什么会这样

我怎么知道,你用的是不是我们配套的程序?如果配套的可以,你自己写的不可以,那就是你程序的问题啊。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-7 17:48:41 | 显示全部楼层
本帖最后由 wlq19911021 于 2017-7-7 17:57 编辑
fire 发表于 2017-7-7 17:37
我怎么知道,你用的是不是我们配套的程序?如果配套的可以,你自己写的不可以,那就是你程序的问题啊。

但关键是在例程里这个读通道配1可以
  FMC_SDRAMInitStructure.FMC_ReadPipeDelay = FMC_ReadPipe_Delay_1;
我要配0, 才可以,才没有线条, 实在想不通
SDRAM_SDCR_Temp |= 0<<13;             //RPIPE =1_(10); &#182;á1üμà__2&#184;&#246;HCLK&#209;ó3ù

/888888888888888/;
/888888888888888/;
PLLSAIQ 是I2S的;
PLLSAIR 才是LTDC的;
/****************/;
我的猜想是, 这两个设备可能靠的很近, 所以才会有干扰

回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-7 18:20:50 | 显示全部楼层
本帖最后由 wlq19911021 于 2017-7-7 18:23 编辑

刚刚又发现了一个问题
-------------------------------------------------;
关于SDRAM 的:

为什么用SDRAM_BANK2 要BANK1 -BANK2同时设置, 否则就不成功, 下载完之后芯片会卡死, 难道 BANK2 是与BANK1 共用一个时钟分频器么, 只有BANK1 才有SDRAM_CLK 时钟分频器么?????

上个图证实一下------------------------------------------------------;
void  FMC_SDRAM_Init(void)
    {
                uint32_t  SDRAM_SDTR_Temp = 0x00000000;
    uint32_t        SDRAM_SDCR_Temp = 0x00000000;
               
                /*** &#191;a&#198;&#244;FMC_SDRAM ê±&#214;ó ***/
                RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FMC, ENABLE);
               
                /*** SDRAM_ê±Dò&#188;&#196;′&#230;&#198;÷(SDTR2) ***/   //SDRAM__Bank2  //ò&#212;(90MHZ__11.1ns)&#188;&#198;&#203;&#227;        //&#203;ùóD&#190;ù&#188;&#245;1;
                SDRAM_SDTR_Temp |= 1<<24;             //TRCD =1_0001__2&#184;&#246;&#214;ü&#198;ú__(15ns)__DDμ&#189;áD&#209;ó3ù
                SDRAM_SDTR_Temp |= 1<<20;             //TRP = 1_0001__2&#184;&#246;&#214;ü&#198;ú__(15ns)__DD&#212;¤3&#228;μ&#231;&#209;ó3ù
                SDRAM_SDTR_Temp |= 1<<16;             //TWR = 1_0001__2&#184;&#246;&#214;ü&#198;ú__(2CLK)__&#187;&#214;&#227;1&#209;ó3ù
                SDRAM_SDTR_Temp |= 5<<12;             //TRC = 5_0101__6&#184;&#246;&#214;ü&#198;ú__(63ns)__DD&#209;-&#187;·&#209;ó3ù
                SDRAM_SDTR_Temp |= 3<<8;              //TRAS =3_0011__4&#184;&#246;&#214;ü&#198;ú__(42ns)__×&#212;&#203;¢D&#194;&#209;ó3ù
                SDRAM_SDTR_Temp |= 6<<4;              //TXSR =6_0111__7&#184;&#246;&#214;ü&#198;ú__(70ns)__í&#203;3&#246;×&#212;&#203;¢D&#194;&#209;ó3ù
                SDRAM_SDTR_Temp |= 1<<0;              //TMRD =1_0001__2&#184;&#246;&#214;ü&#198;ú__(2CLK)__&#188;ó&#212;&#216;&#196;£ê&#189;&#188;&#196;′&#230;&#198;÷μ&#189;&#188;¤&#187;&#238;
               
                /*** ê1ó&#195;BANK1 &#214;&#187;Dèéè&#214;&#195;BANK1, ê1ó&#195;BANK2 ±&#216;Dè&#207;èéèBANK1 &#212;ùéèBANK2***/
                FMC_Bank5_6 -> SDTR[0] = SDRAM_SDTR_Temp;      //&#189;&#171;2&#206;êy&#213;&#251;o&#207;oóD′è&#235;ê±Dò&#188;&#196;′&#230;&#198;÷_SDTR1_
                FMC_Bank5_6 -> SDTR[1] = SDRAM_SDTR_Temp;      //&#189;&#171;2&#206;êy&#213;&#251;o&#207;oóD′è&#235;ê±Dò&#188;&#196;′&#230;&#198;÷_SDTR2_
               
                /*** SDRAM_&#191;&#216;&#214;&#198;&#188;&#196;′&#230;&#198;÷(SDCR2) ***/    //SDRAM__Bank2  //ò&#212;(90MHZ__11.1ns)&#188;&#198;&#203;&#227;        
                SDRAM_SDCR_Temp |= 0<<13;             //RPIPE = 2_(10); &#182;á1üμà__2&#184;&#246;HCLK&#209;ó3ù
                SDRAM_SDCR_Temp &= ~(1<<12);             //RBURST = 0; í&#187;·¢&#182;á__ê&#188;&#214;&#213;1&#216;±&#213;μ¥′&#206;í&#187;·¢&#182;á&#199;&#235;&#199;ó

                SDRAM_SDCR_Temp |= 2<<10;             //SDCLK = 2XHCLK; SDRAM ê±&#214;ó&#197;&#228;&#214;&#195; SDCLK = HCLK/2;
               
                SDRAM_SDCR_Temp &= ~(1<<9);           //WP = 0; D′±£&#187;¤__&#212;êDíD′·&#195;&#206;ê
                SDRAM_SDCR_Temp |= 3<<7;              //CAS = 3_(10); CAS&#209;ó3ù__2&#184;&#246;&#214;ü&#198;ú

                SDRAM_SDCR_Temp |= 1<<6;              //NB = 1; &#196;ú′&#230;&#199;&#248;óòêy__4&#184;&#246; BANK;
                SDRAM_SDCR_Temp |= 1<<4;              //NWID = 1_(01); ′&#230;′¢&#198;÷×ü&#207;&#223;&#191;í__16Bit;
                SDRAM_SDCR_Temp |= 1<<2;              //NR = 1_(01); DDμ&#216;&#214;·&#206;&#187;êy__12&#206;&#187;;
                SDRAM_SDCR_Temp &= ~(3<<0);           //NC = 0_(00); áDμ&#216;&#214;·&#206;&#187;êy__8&#206;&#187;;
               
                /*** ê1ó&#195;BANK1 &#214;&#187;Dèéè&#214;&#195;BANK1, ê1ó&#195;BANK2 ±&#216;Dè&#207;èéèBANK1 &#212;ùéèBANK2***/
                FMC_Bank5_6 -> SDCR[0] = SDRAM_SDCR_Temp;      //&#189;&#171;2&#206;êy&#213;&#251;o&#207;oóD′è&#235;ê±Dò&#188;&#196;′&#230;&#198;÷_SDCR1_
                FMC_Bank5_6 -> SDCR[1] = SDRAM_SDCR_Temp;      //&#189;&#171;2&#206;êy&#213;&#251;o&#207;oóD′è&#235;ê±Dò&#188;&#196;′&#230;&#198;÷_SDCR2_
                };;;
;;
;;
仔细看BANK2 怎 么设都不会有 SDCLK 的参数娈化

截图1499422495.png
回复 支持 反对

使用道具 举报

发表于 2017-7-7 21:03:24 | 显示全部楼层
SDRAM的配置问题,你要看ST的参考手册,比如,有两个FMC_SDTR时序寄存器,一个控制bank1,一个控制bank2,但其中的TRCD、TRP等都只有第一个寄存器中的值有效,所以要配置bank1。
LCD的频率,如果是野火那个F429至尊版的板子,建议LTDC时钟频率设为17~19MHz,这个范围,ARGB8888和RGB888都比较好,其它值会闪烁。
显示不正确的情况多从代码上找吧,时序不对、驱动算法不对都肯定出错。且我试了,两层ARGB8888格式的时候,时钟频率21MH以上会屏幕混乱,不知道什么原因,改下时钟就好了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-9 21:17:29 | 显示全部楼层
LiuMC 发表于 2017-7-7 21:03
SDRAM的配置问题,你要看ST的参考手册,比如,有两个FMC_SDTR时序寄存器,一个控制bank1,一个控制bank2, ...

谢谢你的回答, 这个问题早就已经解决了, 现在可以在各种状态下跑了, 跟手册上面的参数可以一模一样了, 21M卡是设置有问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-9 21:19:35 | 显示全部楼层
本帖最后由 wlq19911021 于 2017-7-9 21:23 编辑
LiuMC 发表于 2017-7-7 21:03
SDRAM的配置问题,你要看ST的参考手册,比如,有两个FMC_SDTR时序寄存器,一个控制bank1,一个控制bank2, ...

可以参考下, 这种完美的设置, 除了内存占用高会影响内存外,目前没有问题
/*************************************/
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-9 21:22:13 | 显示全部楼层
wlq19911021 发表于 2017-7-9 21:19
可以参考下, 这种完美的设置, 除了内存占用高会影响内存外,目前没有问题
/**************************** ...

乱码了,再发一次
/***************************/;

//向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;                //设置刷新频率计数器
}
回复 支持 反对

使用道具 举报

发表于 2017-7-9 22:43:50 | 显示全部楼层
wlq19911021 发表于 2017-7-9 21:17
谢谢你的回答, 这个问题早就已经解决了, 现在可以在各种状态下跑了, 跟手册上面的参数可以一模一样了, 21 ...

你是说SDRAM时序设置的问题吗?等过几天再仔细看看
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-13 21:08 , Processed in 0.034405 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表