请选择 进入手机版 | 继续访问电脑版
查看: 1704|回复: 11

[已解决] LPC4357读写sdram一段时间后死机

[复制链接]

该用户从未签到

1

主题

8

帖子

0

新手上路

Rank: 1

积分
15
最后登录
2021-4-30
发表于 2021-4-26 11:49:38 | 显示全部楼层 |阅读模式
本帖最后由 小恩GG 于 2021-5-21 11:55 编辑

各位好,现在用lpc4357的208脚的芯片做测试,发现配置好sdrm后,lcd可以正常刷sdram的数据,lcd的显示也跟着改变,但是不断写sdram的内容一段时间后,就会出现系统崩溃。同样的程序在之前的lpc4357的bga256的芯片上不会出现死机的问题。两种的配置除了脚位稍微有一点不一样外,不知道哪里还有不一样的地方导致208脚的死机。请各位赐教,可能出现问题的地方在哪里。谢谢
我知道答案 目前已有11人回答
回复

使用道具 举报

该用户从未签到

648

主题

6301

帖子

0

超级版主

Rank: 8Rank: 8

积分
19539
最后登录
2024-3-28
发表于 2021-4-27 10:25:53 | 显示全部楼层
楼主您好,
请调试代码,查看运行到哪一步时,系统崩溃,具体崩溃的现象是什么样的。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

8

帖子

0

新手上路

Rank: 1

积分
15
最后登录
2021-4-30
 楼主| 发表于 2021-4-27 11:32:43 | 显示全部楼层
小恩GG 发表于 2021-4-27 10:25
楼主您好,
请调试代码,查看运行到哪一步时,系统崩溃,具体崩溃的现象是什么样的。 ...

在实际调试的时候,主机已经无法运行(通过串口无输出和led灯可判断),但是keil软件还在继续,并没有提示错误。
我改变做法,不断用一个字节来写入并读取sdran,用16bit的格式不断写入和读取sdram并判断是否写入和读取数据一致,用32bit的格式不断写入和读取sdram并判断是否写入和读取数据一致.三种做法分别测试,一开始都时对的,但是运行一定次数后,系统就不再运行。而且每一种方式可以运行的次数都是固定的,比如8bit的方式就是固定能运行200次,16bit的方式能运行次数比8bit的次数少,但是比32bit的访问方式次数多,而且每一种访问方式的次数都固定,到了那个次数就死了。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

8

帖子

0

新手上路

Rank: 1

积分
15
最后登录
2021-4-30
 楼主| 发表于 2021-4-27 11:35:23 | 显示全部楼层
小恩GG 发表于 2021-4-27 10:25
楼主您好,
请调试代码,查看运行到哪一步时,系统崩溃,具体崩溃的现象是什么样的。 ...

如果配置sdram后,不再往sdram写和读数据,则不会出现问题。现在感觉配置sdram没有大问题,因为lcd利用sdram进行显示都是可以显示。但是问题应该还是出现在sdram上,不知时什么问题。请指教。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

8

帖子

0

新手上路

Rank: 1

积分
15
最后登录
2021-4-30
 楼主| 发表于 2021-4-27 11:39:54 | 显示全部楼层
小恩GG 发表于 2021-4-27 10:25
楼主您好,
请调试代码,查看运行到哪一步时,系统崩溃,具体崩溃的现象是什么样的。 ...

我们之前用bga256的封装的4357的sdram时没有这个问题的。由于不适合加工才改用208脚的产品。我仔细看了,两种区别是总线位数一个是32位,一个是16bit,sdram用到的脚位有点不一样,但是这些我们如果配置错误的话,应该是完全错误的,应该不能正确存取的。所以很懵逼。项目被卡死了
回复 支持 反对

使用道具 举报

  • TA的每日心情
    擦汗
    2016-12-2 08:40
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    97

    主题

    835

    帖子

    7

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    3939
    最后登录
    2024-3-28
    发表于 2021-4-27 14:08:56 | 显示全部楼层
    DRAM降频看看?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2016-12-2 08:40
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    97

    主题

    835

    帖子

    7

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    3939
    最后登录
    2024-3-28
    发表于 2021-4-27 14:10:58 | 显示全部楼层
    降频如果没事儿的话,就在出事儿的主频上跑读写测试的代码,看是哪个bit除了问题,或者固定的地址出问题,根据地址的bit或者数据的bit去查硬件
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    8

    帖子

    0

    新手上路

    Rank: 1

    积分
    15
    最后登录
    2021-4-30
     楼主| 发表于 2021-4-27 14:47:20 | 显示全部楼层
    mgn 发表于 2021-4-27 14:10
    降频如果没事儿的话,就在出事儿的主频上跑读写测试的代码,看是哪个bit除了问题,或者固定的地址出问题, ...

    你好。我在当前的程序去试过写sdram并读回来进行比较,有的时候是会出现读出来的和写入的不一样,但是出现错误的时候,也不一定马上死机。这种死机到底是怎么的可能导致它出现的呢?
    另:降频是应该要操作PLL1的那些系数来道道PLL的频率降低吧?BASE_M4_CLK这个是M4的内核的频率吧,这个频率的源选择的就是PLL1. 但是sdram用的是那个频率还真搞不懂。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    8

    帖子

    0

    新手上路

    Rank: 1

    积分
    15
    最后登录
    2021-4-30
     楼主| 发表于 2021-4-27 14:49:20 | 显示全部楼层
    这个函数是设置系统频率:供参考
    void SetClock (void) {
      uint32_t x, i;
      uint32_t selp, seli;

      /* Set flash wait states to maximum                                         */
      LPC_EMC->STATICWAITRD0  = 0x1F;

      /* Switch BASE_M4_CLOCK to IRC                                              */
      LPC_CGU->BASE_M4_CLK = (0x01        << 11) |  /* Autoblock En               */
                             (CLK_SRC_IRC << 24) ;  /* Set clock source           */

      /* Configure input to crystal oscilator                                     */
      LPC_CGU->XTAL_OSC_CTRL = (0 << 0) |   /* Enable oscillator-pad              */
                               (0 << 1) |   /* Operation with crystal connected   */
                               (0 << 2) ;   /* Low-frequency mode                 */

    #if (USE_SPIFI)
    /* configure SPIFI clk to IRC via IDIVA (later IDIVA is configured to PLL1/3) */
      LPC_CGU->IDIVA_CTRL     = (0              <<  0) |  /* Disable Power-down   */
                                (0              <<  2) |  /* IDIV                 */
                                (1              << 11) |  /* Autoblock En         */
                                (CLK_SRC_IRC    << 24) ;  /* Clock source         */

      LPC_CGU->BASE_SPIFI_CLK = (0              <<  0) |  /* Disable Power-down   */
                                (0              <<  2) |  /* IDIV                 */
                                (1              << 11) |  /* Autoblock En         */
                                (CLK_SRC_IDIVA  << 24) ;  /* Clock source         */
    #endif

    /*----------------------------------------------------------------------------
      PLL1 Setup
    *----------------------------------------------------------------------------*/
      /* Power down PLL                                                           */
      LPC_CGU->PLL1_CTRL |= 1;

    #if ((PLL1_FOUT >= 180000000UL) && (CPU_CLK_SEL == CLK_SRC_PLL1))
      /* To run at full speed, CPU must first run at an intermediate speed        */
      LPC_CGU->PLL1_CTRL = (0            << 0) | /* PLL1 Enabled                  */
                           (0            << 1) | /* CCO out sent to post-dividers */
                           (0            << 6) | /* PLL output used as feedback   */
                           (1            << 7) | /* Direct on/off                 */
                           (0            << 8) | /* PSEL                          */
                           (0            << 11)| /* Autoblock Disabled            */
                           (2            << 12)| /* NSEL                          */
                           (39           << 16)| /* MSEL                          */
                           (PLL1_CLK_SEL << 24); /* Clock source                  */
      /* Wait for lock                                                            */
      while (!(LPC_CGU->PLL1_STAT & 1));

      /* CPU base clock @ 160 MHz before final clock set                          */
      LPC_CGU->BASE_M4_CLK     = (0x01 << 11) |  /* Autoblock En                  */
                                 (0x09 << 24) ;  /* Clock source: PLL1            */

      for (i = 1000; i; i--);                    /* Wait about 4000 cycles        */
    #endif
      /* Configure PLL1                                                           */
      LPC_CGU->PLL1_CTRL = (0            << 0) | /* PLL1 Enabled                  */
                           (PLL1_BYPASS  << 1) | /* CCO out sent to post-dividers */
                           (PLL1_FBSEL   << 6) | /* PLL output used as feedback   */
                           (PLL1_DIRECT  << 7) | /* Direct on/off                 */
                           (PLL1_PSEL    << 8) | /* PSEL                          */
                           (1            << 11)| /* Autoblock En                  */
                           (PLL1_NSEL    << 12)| /* NSEL                          */
                           (PLL1_MSEL    << 16)| /* MSEL                          */
                           (PLL1_CLK_SEL << 24); /* Clock source                  */

      /* Wait for lock                                                            */
      while (!(LPC_CGU->PLL1_STAT & 1));

      /* Set CPU base clock source                                                */
      LPC_CGU->BASE_M4_CLK = (0x01        << 11) |  /* Autoblock En               */
                             (CPU_CLK_SEL << 24) ;  /* Set clock source           */


    /*----------------------------------------------------------------------------
      PLL0USB Setup
    *----------------------------------------------------------------------------*/
      
      /* Power down PLL0USB                                                       */
      LPC_CGU->PLL0USB_CTRL  |= 1;

      /* M divider                                                                */
      x = 0x00004000;
      switch (PLL0USB_M) {
        case 0:  x = 0xFFFFFFFF;
          break;
        case 1:  x = 0x00018003;
          break;
        case 2:  x = 0x00010003;
          break;
        default:
          for (i = PLL0USB_M; i <= 0x8000; i++) {
            x = (((x ^ (x >> 1)) & 1) << 14) | ((x >> 1) & 0x3FFF);
          }
      }
      
      if (PLL0USB_M < 60) selp = (PLL0USB_M >> 1) + 1;
      else        selp = 31;
      
      if      (PLL0USB_M > 16384) seli = 1;
      else if (PLL0USB_M >  8192) seli = 2;
      else if (PLL0USB_M >  2048) seli = 4;
      else if (PLL0USB_M >=  501) seli = 8;
      else if (PLL0USB_M >=   60) seli = 4 * (1024 / (PLL0USB_M + 9));
      else                        seli = (PLL0USB_M & 0x3C) + 4;
      LPC_CGU->PLL0USB_MDIV   =  (selp   << 17) |
                                 (seli   << 22) |
                                 (x      <<  0);

      /* N divider                                                                */
      x = 0x80;
      switch (PLL0USB_N) {
        case 0:  x = 0xFFFFFFFF;
          break;
        case 1:  x = 0x00000302;
          break;
        case 2:  x = 0x00000202;
          break;
        default:
          for (i = PLL0USB_N; i <= 0x0100; i++) {
            x =(((x ^ (x >> 2) ^ (x >> 3) ^ (x >> 4)) & 1) << 7) | ((x >> 1) & 0x7F);
          }
      }
      LPC_CGU->PLL0USB_NP_DIV = (x << 12);
      
      /* P divider                                                                */
      x = 0x10;
      switch (PLL0USB_P) {
        case 0:  x = 0xFFFFFFFF;
          break;
        case 1:  x = 0x00000062;
          break;
        case 2:  x = 0x00000042;
          break;
        default:
          for (i = PLL0USB_P; i <= 0x200; i++) {
            x = (((x ^ (x >> 2)) & 1) << 4) | ((x >> 1) &0x0F);
          }
      }
      LPC_CGU->PLL0USB_NP_DIV |= x;
      
      LPC_CGU->PLL0USB_CTRL  = (PLL0USB_CLK_SEL   << 24) | /* Clock source sel    */                             
                               (1                 << 11) | /* Autoblock En        */
                               (1                 << 4 ) | /* PLL0USB clock en    */
                               (PLL0USB_DIRECTO   << 3 ) | /* Direct output       */
                               (PLL0USB_DIRECTI   << 2 ) | /* Direct input        */
                               (PLL0USB_BYPASS    << 1 ) | /* PLL bypass          */
                               (0                 << 0 ) ; /* PLL0USB Enabled     */
      while (!(LPC_CGU->PLL0USB_STAT & 1));


    /*----------------------------------------------------------------------------
      Integer divider Setup
    *----------------------------------------------------------------------------*/
      
      /* Configure integer dividers                                               */
      LPC_CGU->IDIVA_CTRL = (0              <<  0) |  /* Disable Power-down       */
                            (IDIVA_IDIV     <<  2) |  /* IDIV                     */
                            (1              << 11) |  /* Autoblock En             */
                            (IDIVA_CLK_SEL  << 24) ;  /* Clock source             */

      LPC_CGU->IDIVB_CTRL = (0              <<  0) |  /* Disable Power-down       */
                            (IDIVB_IDIV     <<  2) |  /* IDIV                     */
                            (1              << 11) |  /* Autoblock En             */
                            (IDIVB_CLK_SEL  << 24) ;  /* Clock source             */

      LPC_CGU->IDIVC_CTRL = (0              <<  0) |  /* Disable Power-down       */
                            (IDIVC_IDIV     <<  2) |  /* IDIV                     */
                            (1              << 11) |  /* Autoblock En             */
                            (IDIVC_CLK_SEL  << 24) ;  /* Clock source             */

      LPC_CGU->IDIVD_CTRL = (0              <<  0) |  /* Disable Power-down       */
                            (IDIVD_IDIV     <<  2) |  /* IDIV                     */
                            (1              << 11) |  /* Autoblock En             */
                            (IDIVD_CLK_SEL  << 24) ;  /* Clock source             */

      LPC_CGU->IDIVE_CTRL = (0              <<  0) |  /* Disable Power-down       */
                            (IDIVE_IDIV     <<  2) |  /* IDIV                     */
                            (1              << 11) |  /* Autoblock En             */
                            (IDIVE_CLK_SEL  << 24) ;  /* Clock source             */
    }


    /*----------------------------------------------------------------------------
      Approximate delay function (must be used after SystemCoreClockUpdate() call)
    *----------------------------------------------------------------------------*/
    #define CPU_NANOSEC(x) (((uint64_t)(x) * SystemCoreClock)/1000000000)

    static void WaitUs (uint32_t us) {
      uint32_t cyc = us * CPU_NANOSEC(1000)/4;
      while(cyc--);
    }
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    8

    帖子

    0

    新手上路

    Rank: 1

    积分
    15
    最后登录
    2021-4-30
     楼主| 发表于 2021-4-27 14:50:31 | 显示全部楼层
    这个函数是配置外部存储器控制器的:
    void SystemInit_ExtMemCtl (void) {
      uint32_t emcdivby2_buf[emcdivby2_szw];
      uint32_t div, n;
      uint16_t wtemp = wtemp;



      /* Select and enable EMC branch clock */
      LPC_CCU1->CLK_M4_EMC_CFG = (0 << 2) | (0 << 1) | 1;
      while (!(LPC_CCU1->CLK_M4_EMC_STAT & 1));

      /* Set EMC clock output delay */  
      if (SystemCoreClock < 80000000UL) {
        LPC_SCU->EMCDELAYCLK = EMC_CLK_DLY_TIM_0; /* No EMC clock out delay       */
      }
      else {
        LPC_SCU->EMCDELAYCLK = EMC_CLK_DLY_TIM_2; /* 2.0 ns EMC clock out delay   */
      }

      /* Configure EMC port pins */
      LPC_SCU->SFSP1_0  = EMC_PIN_SET | 2;  /* P1_0:  A5                          */
      LPC_SCU->SFSP1_1  = EMC_PIN_SET | 2;  /* P1_1:  A6                          */
      LPC_SCU->SFSP1_2  = EMC_PIN_SET | 2;  /* P1_2:  A7                          */
      LPC_SCU->SFSP1_3  = EMC_PIN_SET | 3;  /* P1_3:  OE                          */
      LPC_SCU->SFSP1_4  = EMC_PIN_SET | 3;  /* P1_4:  BLS0                        */
      LPC_SCU->SFSP1_5  = EMC_PIN_SET | 3;  /* P1_5:  CS0                         */
      LPC_SCU->SFSP1_6  = EMC_PIN_SET | 3;  /* P1_6:  WE                          */
      LPC_SCU->SFSP1_7  = EMC_PIN_SET | 3;  /* P1_7:  D0                          */
      LPC_SCU->SFSP1_8  = EMC_PIN_SET | 3;  /* P1_8:  D1                          */
      LPC_SCU->SFSP1_9  = EMC_PIN_SET | 3;  /* P1_9:  D2                          */
      LPC_SCU->SFSP1_10 = EMC_PIN_SET | 3;  /* P1_10: D3                          */
      LPC_SCU->SFSP1_11 = EMC_PIN_SET | 3;  /* P1_11: D4                          */
      LPC_SCU->SFSP1_12 = EMC_PIN_SET | 3;  /* P1_12: D5                          */
      LPC_SCU->SFSP1_13 = EMC_PIN_SET | 3;  /* P1_13: D6                          */
      LPC_SCU->SFSP1_14 = EMC_PIN_SET | 3;  /* P1_14: D7                          */
      
    #ifdef CPU_208PIN
      LPC_SCU->SFSP1_18 = EMC_PIN_SET | 7;  /* P1_18: D10                          */
      LPC_SCU->SFSP1_20 = EMC_PIN_SET | 7;  /* P1_20: D11                          */
    #endif

      LPC_SCU->SFSP2_0  = EMC_PIN_SET | 2;  /* P2_0:  A13                         */
      LPC_SCU->SFSP2_1  = EMC_PIN_SET | 2;  /* P2_1:  A12                         */
      LPC_SCU->SFSP2_2  = EMC_PIN_SET | 2;  /* P2_2:  A11                         */
      LPC_SCU->SFSP2_6  = EMC_PIN_SET | 2;  /* P2_6:  A10                         */
      LPC_SCU->SFSP2_7  = EMC_PIN_SET | 3;  /* P2_7:  A9                          */
      LPC_SCU->SFSP2_8  = EMC_PIN_SET | 3;  /* P2_8:  A8                          */
      LPC_SCU->SFSP2_9  = EMC_PIN_SET | 3;  /* P2_9:  A0                          */
      LPC_SCU->SFSP2_10 = EMC_PIN_SET | 3;  /* P2_10: A1                          */
      LPC_SCU->SFSP2_11 = EMC_PIN_SET | 3;  /* P2_11: A2                          */
      LPC_SCU->SFSP2_12 = EMC_PIN_SET | 3;  /* P2_12: A3                          */
      LPC_SCU->SFSP2_13 = EMC_PIN_SET | 3;  /* P2_13: A4                          */

      LPC_SCU->SFSP5_0  = EMC_PIN_SET | 2;  /* P5_0:  D12                         */
      LPC_SCU->SFSP5_1  = EMC_PIN_SET | 2;  /* P5_1:  D13                         */
      LPC_SCU->SFSP5_2  = EMC_PIN_SET | 2;  /* P5_2:  D14                         */
      LPC_SCU->SFSP5_3  = EMC_PIN_SET | 2;  /* P5_3:  D15                         */
      LPC_SCU->SFSP5_4  = EMC_PIN_SET | 2;  /* P5_4:  D8                          */
      LPC_SCU->SFSP5_5  = EMC_PIN_SET | 2;  /* P5_5:  D9                          */

    #ifdef CPU_256PIN
      LPC_SCU->SFSP5_6  = EMC_PIN_SET | 2;  /* P5_6:  D10                         */
      LPC_SCU->SFSP5_7  = EMC_PIN_SET | 2;  /* P5_7:  D11                         */
    #endif

      LPC_SCU->SFSP6_1  = EMC_PIN_SET | 1;  /* P6_1:  DYCS1                       */
      LPC_SCU->SFSP6_2  = EMC_PIN_SET | 1;  /* P6_3:  CKEOUT1                     */
      LPC_SCU->SFSP6_3  = EMC_PIN_SET | 3;  /* P6_3:  CS1                         */
      LPC_SCU->SFSP6_4  = EMC_PIN_SET | 3;  /* P6_4:  CAS                         */
      LPC_SCU->SFSP6_5  = EMC_PIN_SET | 3;  /* P6_5:  RAS                         */
      LPC_SCU->SFSP6_6  = EMC_PIN_SET | 1;  /* P6_6:  BLS1                        */
      LPC_SCU->SFSP6_7  = EMC_PIN_SET | 1;  /* P6_7:  A15                         */
      LPC_SCU->SFSP6_8  = EMC_PIN_SET | 1;  /* P6_8:  A14                         */
      LPC_SCU->SFSP6_9  = EMC_PIN_SET | 3;  /* P6_9:  DYCS0                       */
      LPC_SCU->SFSP6_10 = EMC_PIN_SET | 3;  /* P6_10: DQMOUT1                     */
      LPC_SCU->SFSP6_11 = EMC_PIN_SET | 3;  /* P6_11: CKEOUT0                     */
      LPC_SCU->SFSP6_12 = EMC_PIN_SET | 3;  /* P6_12: DQMOUT0                     */

      LPC_SCU->SFSPA_4  = EMC_PIN_SET | 3;  /* PA_4:  A23                         */

    //  LPC_SCU->SFSPD_0  = EMC_PIN_SET | 2;  /* PD_0:  DQMOUT2                     */
    //  LPC_SCU->SFSPD_1  = EMC_PIN_SET | 2;  /* PD_1:  CKEOUT2                     */
    //  LPC_SCU->SFSPD_2  = EMC_PIN_SET | 2;  /* PD_2:  D16                         */
    //  LPC_SCU->SFSPD_3  = EMC_PIN_SET | 2;  /* PD_3:  D17                         */
    //  LPC_SCU->SFSPD_4  = EMC_PIN_SET | 2;  /* PD_4:  D18                         */
    //  LPC_SCU->SFSPD_5  = EMC_PIN_SET | 2;  /* PD_5:  D19                         */
    //  LPC_SCU->SFSPD_6  = EMC_PIN_SET | 2;  /* PD_6:  D20                         */
    //  LPC_SCU->SFSPD_7  = EMC_PIN_SET | 2;  /* PD_7:  D21                         */
    //  LPC_SCU->SFSPD_8  = EMC_PIN_SET | 2;  /* PD_8:  D22                         */
    //  LPC_SCU->SFSPD_9  = EMC_PIN_SET | 2;  /* PD_9:  D23                         */
      LPC_SCU->SFSPD_10 = EMC_PIN_SET | 2;  /* PD_10: BLS3                        */
      LPC_SCU->SFSPD_11 = EMC_PIN_SET | 2;  /* PD_11: CS3                         */
      LPC_SCU->SFSPD_12 = EMC_PIN_SET | 2;  /* PD_12: CS2                         */
      LPC_SCU->SFSPD_13 = EMC_PIN_SET | 2;  /* PD_13: BLS2                        */
      LPC_SCU->SFSPD_14 = EMC_PIN_SET | 2;  /* PD_14: DYCS2                       */
      LPC_SCU->SFSPD_15 = EMC_PIN_SET | 2;  /* PD_15: A17                         */
      LPC_SCU->SFSPD_16 = EMC_PIN_SET | 2;  /* PD_16: A16                         */

      LPC_SCU->SFSPE_0  = EMC_PIN_SET | 3;  /* PE_0:  A18                         */
      LPC_SCU->SFSPE_1  = EMC_PIN_SET | 3;  /* PE_1:  A19                         */
      LPC_SCU->SFSPE_2  = EMC_PIN_SET | 3;  /* PE_2:  A20                         */
      LPC_SCU->SFSPE_3  = EMC_PIN_SET | 3;  /* PE_3:  A21                         */
      LPC_SCU->SFSPE_4  = EMC_PIN_SET | 3;  /* PE_4:  A22                         */
    //  LPC_SCU->SFSPE_5  = EMC_PIN_SET | 3;  /* PE_5:  D24                         */
    //  LPC_SCU->SFSPE_6  = EMC_PIN_SET | 3;  /* PE_6:  D25                         */
    //  LPC_SCU->SFSPE_7  = EMC_PIN_SET | 3;  /* PE_7:  D26                         */
    //  LPC_SCU->SFSPE_8  = EMC_PIN_SET | 3;  /* PE_8:  D27                         */
    //  LPC_SCU->SFSPE_9  = EMC_PIN_SET | 3;  /* PE_9:  D28                         */
    //  LPC_SCU->SFSPE_10 = EMC_PIN_SET | 3;  /* PE_10: D29                         */
    //  LPC_SCU->SFSPE_11 = EMC_PIN_SET | 3;  /* PE_11: D30                         */
    //  LPC_SCU->SFSPE_12 = EMC_PIN_SET | 3;  /* PE_12: D31                         */
    //  LPC_SCU->SFSPE_13 = EMC_PIN_SET | 3;  /* PE_13: DQMOUT3                     */
    //  LPC_SCU->SFSPE_14 = EMC_PIN_SET | 3;  /* PE_14: DYCS3                       */
    //  LPC_SCU->SFSPE_15 = EMC_PIN_SET | 3;  /* PE_15: CKEOUT3                     */

      LPC_EMC->CONTROL  = 0x00000001;       /* EMC Enable                         */
      LPC_EMC->CONFIG   = 0x00000000;       /* Little-endian, Clock Ratio 1:1     */

      div = 0;
      if (SystemCoreClock > 120000000UL) {
        /* Use EMC clock divider and EMC clock output delay */
        div = 1;
        /* Following code must be executed in RAM to ensure stable operation      */
        /* LPC_CCU1->CLK_M4_EMCDIV_CFG = (1 << 5) | (1 << 2) | (1 << 1) | 1;      */
        /* LPC_CREG->CREG6 |= (1 << 16);       // EMC_CLK_DIV divided by 2        */
        /* while (!(LPC_CCU1->CLK_M4_EMCDIV_STAT & 1));                           */

        /* This code configures EMC clock divider and is executed in RAM          */
        for (n = 0; n < emcdivby2_szw; n++) {
          emcdivby2_buf[n] =  *((uint32_t *)emcdivby2_ram + n);
          *((uint32_t *)emcdivby2_ram + n) = *((uint32_t *)emcdivby2_opc + n);
        }
        __ISB();
        ((emcdivby2 )(emcdivby2_ram+1))(&LPC_CREG->CREG6, &LPC_CCU1->CLK_M4_EMCDIV_CFG, (1 << 5) | (1 << 2) | (1 << 1) | 1);
        for (n = 0; n < emcdivby2_szw; n++) {
          *((uint32_t *)emcdivby2_ram + n) = emcdivby2_buf[n];
        }
      }

      /* Configure EMC clock-out pins                                             */
      LPC_SCU->SFSCLK_0 = EMC_PIN_SET | 0;  /* CLK0                               */
      LPC_SCU->SFSCLK_1 = EMC_PIN_SET | 0;  /* CLK1                               */
      LPC_SCU->SFSCLK_2 = EMC_PIN_SET | 0;  /* CLK2                               */
      LPC_SCU->SFSCLK_3 = EMC_PIN_SET | 0;  /* CLK3                               */
      
      /* Static memory configuration (chip select 0)                              */
    //#if (USE_EXT_STAT_MEM_CS0)
    //  LPC_EMC->STATICCONFIG0  = (1 <<  7) | /* Byte lane state: use WE signal     */
    //                            (2 <<  0) ; /* Memory width 32-bit                */
    //  LPC_EMC->STATICWAITOEN0 = (0 <<  0) ; /* Wait output enable: No delay       */
    //
    //  /* Set Static Memory Read Delay for 90ns External NOR Flash                 */
    //  LPC_EMC->STATICWAITRD0  = 1 + EMC_NANOSEC(90, SystemCoreClock, div);
    //  LPC_EMC->STATICCONFIG0 |= (1 << 19) ; /* Enable buffer                      */
    //#endif

      
    #if (USE_EXT_STAT_MEM_CS0)
      LPC_EMC->STATICCONFIG0  = (1 <<  7) | /* Byte lane state: use WE signal     */
                                (1 <<  0) ; /* Memory width 32-bit                */
      
      LPC_EMC->STATICWAITOEN0 = (0 <<  0) ; /* Wait output enable: No delay       */

      /* Set Static Memory Read Delay for 90ns External NOR Flash                 */
      LPC_EMC->STATICWAITRD0  = 1 + EMC_NANOSEC(90, SystemCoreClock, div);
      //LPC_EMC->STATICCONFIG0 |= (1 << 19) ; /* Enable buffer                      */
    #endif

    #if (USE_EXT_STAT_MEM_CS1)
      LPC_EMC->STATICCONFIG1  = (1 <<  7) | /* Byte lane state: use WE signal     */
                                (1 <<  0) ; /* Memory width 32-bit                */
      
      LPC_EMC->STATICWAITOEN1 = (0 <<  0) ; /* Wait output enable: No delay       */

      /* Set Static Memory Read Delay for 90ns External NOR Flash                 */
      LPC_EMC->STATICWAITRD1  = 1 + EMC_NANOSEC(90, SystemCoreClock, div);
      //LPC_EMC->STATICCONFIG1 |= (1 << 19) ; /* Enable buffer                      */
    #endif

    #if (USE_EXT_STAT_MEM_CS2)
      
      
      LPC_EMC->STATICCONFIG2  = (0 <<  8) | //延长等待使能
                                                              (1 <<  7) | /* Byte lane state: use WE signal     */
                                (1 <<  0) ; /* Memory width 8-bit                */
      
      LPC_EMC->STATICWAITWEN2 = 0x05;//片选到写使能的延迟
      LPC_EMC->STATICWAITWR2  = 0x12;//写延迟
      
      LPC_EMC->STATICWAITOEN2 = 0x08;//(5 <<  0) ; /* Wait output enable: No delay       */

      /* Set Static Memory Read Delay for 90ns External NOR Flash                 */
      LPC_EMC->STATICWAITRD2  = 0x0a;//1 + EMC_NANOSEC(90, SystemCoreClock, div);
      //LPC_EMC->STATICCONFIG2 |= (1 << 19) ; /* Enable buffer                      */
    #endif


    #if (USE_EXT_STAT_MEM_CS3)
      LPC_EMC->STATICCONFIG3  = (1 <<  7) | /* Byte lane state: use WE signal     */
                                (1 <<  0) ; /* Memory width 16-bit                */
      
      LPC_EMC->STATICWAITWEN3 = 0;//片选到写使能的延迟
      LPC_EMC->STATICWAITWR3  = 0x01;//写延迟
      
      LPC_EMC->STATICWAITOEN3 = 0x00 ; /* Wait output enable: No delay       */

      /* Set Static Memory Read Delay for 90ns External NOR Flash                 */
      LPC_EMC->STATICWAITRD3  =0x04;// 1 + EMC_NANOSEC(90, SystemCoreClock, div);
      //LPC_EMC->STATICCONFIG3 |= (1 << 19) ; /* Enable buffer                      */
      LPC_EMC->STATICWAITTURN3  =0x00;
    #endif
      
      /* Dynamic memory configuration (chip select 0)                             */
    #if (USE_EXT_DYN_MEM_CS0)

      /* Set Address mapping: 128Mb(4Mx32), 4 banks, row len = 12, column len = 8 */
    //  LPC_EMC->DYNAMICCONFIG0    = (1 << 14) |  /* AM[14]   = 1                   */
    //                               (0 << 12) |  /* AM[12]   = 0                   */
    //                               (2 <<  9) |  /* AM[11:9] = 2                   */
    //                               (2 <<  7) ;  /* AM[8:7]  = 2                   */
           
           
            /* Set Address mapping: 64Mb(4Mx16), 4 banks, row len = 12, column len = 8 */
        LPC_EMC->DYNAMICCONFIG0    = (0 << 14) |  /* AM[14]   = 0                   */
                                   (0 << 12) |  /* AM[12]   = 0                   */
                                   (1 <<  9) |  /* AM[11:9] = 1                   */
                                   (1 <<  7) ;  /* AM[8:7]  = 1                   */
                                  
                                  
      LPC_EMC->DYNAMICRASCAS0    = 0x00000303;  /* Latency: RAS 3, CAS 3 CCLK cyc.*/
      LPC_EMC->DYNAMICREADCONFIG = 0x00000001;  /* Command delayed by 1/2 CCLK    */

      LPC_EMC->DYNAMICRP         = EMC_NANOSEC (20, SystemCoreClock, div);
      LPC_EMC->DYNAMICRAS        = EMC_NANOSEC (42, SystemCoreClock, div);
      LPC_EMC->DYNAMICSREX       = EMC_NANOSEC (63, SystemCoreClock, div);
      LPC_EMC->DYNAMICAPR        = EMC_NANOSEC (70, SystemCoreClock, div);
      LPC_EMC->DYNAMICDAL        = EMC_NANOSEC (70, SystemCoreClock, div);
      LPC_EMC->DYNAMICWR         = EMC_NANOSEC (30, SystemCoreClock, div);
      LPC_EMC->DYNAMICRC         = EMC_NANOSEC (63, SystemCoreClock, div);
      LPC_EMC->DYNAMICRFC        = EMC_NANOSEC (63, SystemCoreClock, div);
      LPC_EMC->DYNAMICXSR        = EMC_NANOSEC (63, SystemCoreClock, div);
      LPC_EMC->DYNAMICRRD        = EMC_NANOSEC (14, SystemCoreClock, div);
      LPC_EMC->DYNAMICMRD        = EMC_NANOSEC (30, SystemCoreClock, div);
      
    //  LPC_EMC->DYNAMICRP         = 0x0f;//EMC_NANOSEC (20, SystemCoreClock, div);
    //  LPC_EMC->DYNAMICRAS        = 0x0f;//EMC_NANOSEC (42, SystemCoreClock, div);
    //  LPC_EMC->DYNAMICSREX       = 0x0f;//EMC_NANOSEC (63, SystemCoreClock, div);
    //  LPC_EMC->DYNAMICAPR        = 0x0f;//EMC_NANOSEC (70, SystemCoreClock, div);
    //  LPC_EMC->DYNAMICDAL        = 0x0f;//EMC_NANOSEC (70, SystemCoreClock, div);
    //  LPC_EMC->DYNAMICWR         = 0x0f;//EMC_NANOSEC (30, SystemCoreClock, div);
    //  LPC_EMC->DYNAMICRC         = 0x1f;//EMC_NANOSEC (63, SystemCoreClock, div);
    //  LPC_EMC->DYNAMICRFC        = 0x1f;//EMC_NANOSEC (63, SystemCoreClock, div);
    //  LPC_EMC->DYNAMICXSR        = 0x1f;//EMC_NANOSEC (63, SystemCoreClock, div);
    //  LPC_EMC->DYNAMICRRD        = 0x0f;//EMC_NANOSEC (14, SystemCoreClock, div);
    //  LPC_EMC->DYNAMICMRD        = 0x0f;//EMC_NANOSEC (30, SystemCoreClock, div);

      WaitUs (100);
      LPC_EMC->DYNAMICCONTROL    = 0x00000183;  /* Issue NOP command              */
      WaitUs (10);
      LPC_EMC->DYNAMICCONTROL    = 0x00000103;  /* Issue PALL command             */
      WaitUs (1);
      LPC_EMC->DYNAMICCONTROL    = 0x00000183;  /* Issue NOP command              */
      WaitUs (1);
      LPC_EMC->DYNAMICREFRESH    = EMC_NANOSEC(  200, SystemCoreClock, div) / 16 + 1;
      WaitUs (10);
    //  LPC_EMC->DYNAMICREFRESH    = EMC_NANOSEC(15625, SystemCoreClock, div) / 16 + 1;
      LPC_EMC->DYNAMICREFRESH    = EMC_NANOSEC(15625, SystemCoreClock, div) / 16 + 1;
      WaitUs (10);
      LPC_EMC->DYNAMICCONTROL    = 0x00000083;  /* Issue MODE command             */

      /* Mode register: Burst Length: 4, Burst Type: Sequential, CAS Latency: 3   */
      //WR_MODE(((3 << 4) | 2) << 12);
      wtemp = *((volatile uint16_t *)(SDRAM_ADDR_BASE | (0x33<<11)));

      WaitUs (10);
      LPC_EMC->DYNAMICCONTROL    = 0x00000002;  /* Issue NORMAL command           */
      LPC_EMC->DYNAMICCONFIG0   |= (1 << 19);   /* Enable buffer                  */
    #endif
    }
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-3-28 18:07 , Processed in 0.148692 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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