硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1974|回复: 7
收起左侧

关于gui使用外部sdram的问题

[复制链接]

4

主题

8

回帖

48

积分

新手上路

积分
48
发表于 2018-8-15 19:26:15 | 显示全部楼层 |阅读模式
运行下面的程序是可以正常显示的:使用内部ram
void GUI_X_Config(void) {
  //
  // 32 bit aligned memory area
  //
  static U32 aMemory[GUI_NUMBYTES / 4] ;
  //
  // Assign memory to emWin
  //
  GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);
  //
  // Set default font
  //
  GUI_SetDefaultFont(GUI_FONT_6X8);
}
当时用外部sdram时gui_init就无法正常执行了:0xc0000000 是外部sdram地址,cpu是427zg
void GUI_X_Config(void) {
  //
  // 32 bit aligned memory area
  //
  static U32 aMemory[GUI_NUMBYTES / 4] __at(0xc0000000);
  //
  // Assign memory to emWin
  //
  GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);
  //
  // Set default font
  //
  GUI_SetDefaultFont(GUI_FONT_6X8);
}

sdram配置已经完成:通过以下程序测试是可以通过的
uint16_t test_sdram(void)
{
        uint16_t        data,*ptr;
        uint32_t         x;
       
        ptr = (uint16_t *) 0xc0010000;
        for(x=0;x<1024*64;x++)
        {
                *ptr = x;
                data = *ptr;
                if(data != x)
                        return 0;
                ptr++;
        }
        return 1;
}
请问这是什么问题?


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2018-8-16 01:55:21 | 显示全部楼层
使用我们这种方式的测试方式测试一遍看看:

  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: bsp_TestExtSDRAM
  4. *        功能说明: 扫描测试外部SRAM, 全部单元。
  5. *        形    参: 无
  6. *        返 回 值: 0 表示测试通过; 大于0表示错误单元的个数。
  7. *********************************************************************************************************
  8. */
  9. uint32_t bsp_TestExtSDRAM1(void)
  10. {
  11.         uint32_t i;
  12.         uint32_t *pSRAM;
  13.         uint8_t *pBytes;
  14.         uint32_t err;
  15.         const uint8_t ByteBuf[4] = {0x55, 0xA5, 0x5A, 0xAA};

  16.         /* 写SRAM */
  17.         pSRAM = (uint32_t *)EXT_SDRAM_ADDR;
  18.         for (i = 0; i < EXT_SDRAM_SIZE / 4; i++)
  19.         {
  20.                 *pSRAM++ = i;
  21.         }

  22.         /* 读SRAM */
  23.         err = 0;
  24.         pSRAM = (uint32_t *)EXT_SDRAM_ADDR;
  25.         for (i = 0; i < EXT_SDRAM_SIZE / 4; i++)
  26.         {
  27.                 if (*pSRAM++ != i)
  28.                 {
  29.                         err++;
  30.                 }
  31.         }

  32.         if (err >  0)
  33.         {
  34.                 return  (4 * err);
  35.         }

  36.         /* 对SRAM 的数据求反并写入 */
  37.         pSRAM = (uint32_t *)EXT_SDRAM_ADDR;
  38.         for (i = 0; i < EXT_SDRAM_SIZE / 4; i++)
  39.         {
  40.                 *pSRAM = ~*pSRAM;
  41.                 pSRAM++;
  42.         }

  43.         /* 再次比较SDRAM的数据 */
  44.         err = 0;
  45.         pSRAM = (uint32_t *)EXT_SDRAM_ADDR;
  46.         for (i = 0; i < EXT_SDRAM_SIZE / 4; i++)
  47.         {
  48.                 if (*pSRAM++ != (~i))
  49.                 {
  50.                         err++;
  51.                 }
  52.         }

  53.         if (err >  0)
  54.         {
  55.                 return (4 * err);
  56.         }

  57.         /* 测试按字节方式访问, 目的是验证 FSMC_NBL0 、 FSMC_NBL1 口线 */
  58.         pBytes = (uint8_t *)EXT_SDRAM_ADDR;
  59.         for (i = 0; i < sizeof(ByteBuf); i++)
  60.         {
  61.                 *pBytes++ = ByteBuf[i];
  62.         }

  63.         /* 比较SDRAM的数据 */
  64.         err = 0;
  65.         pBytes = (uint8_t *)EXT_SDRAM_ADDR;
  66.         for (i = 0; i < sizeof(ByteBuf); i++)
  67.         {
  68.                 if (*pBytes++ != ByteBuf[i])
  69.                 {
  70.                         err++;
  71.                 }
  72.         }
  73.         if (err >  0)
  74.         {
  75.                 return err;
  76.         }
  77.         return 0;
  78. }
复制代码


回复

使用道具 举报

4

主题

8

回帖

48

积分

新手上路

积分
48
 楼主| 发表于 2018-8-16 04:15:55 | 显示全部楼层
本帖最后由 scxingyz 于 2018-8-16 04:20 编辑

第一步就错了,直接写入读取不能通过

回复

使用道具 举报

4

主题

8

回帖

48

积分

新手上路

积分
48
 楼主| 发表于 2018-8-16 04:18:07 | 显示全部楼层
这是我的sdram初始化过程
/* SDRAM device configuration */
        {
                hsdram1.Instance = FMC_SDRAM_DEVICE;

                /* FMC Configuration -------------------------------------------------------*/
                /* FMC SDRAM Bank configuration */
                /* Timing configuration for 72 Mhz of SD clock frequency (144Mhz/2) */
                /* TMRD: 2 Clock cycles */
                SdramTiming.LoadToActiveDelay    = 2;
                /* TXSR: min=70ns (7x13.9ns) */
                SdramTiming.ExitSelfRefreshDelay = 7;
                /* TRAS: min=37ns (4x13.9ns) max=120k (ns) */
                SdramTiming.SelfRefreshTime      = 4;
                /* TRC:  min=70 (7x13.9ns) */
                SdramTiming.RowCycleDelay        = 7;
                /* TWR:  min=1+ 7ns (1+1x13.9ns) */
                SdramTiming.WriteRecoveryTime    = 2;
                /* TRP:  20ns => 2x13.9ns*/
                SdramTiming.RPDelay              = 2;
                /* TRCD: 20ns => 2x13.9ns */
                SdramTiming.RCDDelay             = 2;
               
                /* FMC SDRAM control configuration */
                hsdram1.Init.SDBank             = FMC_SDRAM_BANK1;
                /* Row addressing: [8:0] */
                hsdram1.Init.ColumnBitsNumber   = FMC_SDRAM_COLUMN_BITS_NUM_9;
                /* Column addressing: [12:0] */
                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_2;
                hsdram1.Init.WriteProtection    = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
                hsdram1.Init.SDClockPeriod      = FMC_SDRAM_CLOCK_PERIOD_2;
                hsdram1.Init.ReadBurst          = FMC_SDRAM_RBURST_DISABLE;
                hsdram1.Init.ReadPipeDelay      = FMC_SDRAM_RPIPE_DELAY_1;
                                                                                       
                /* SDRAM controller initialization */
                if(HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK)
                {
                        _Error_Handler(__FILE__, __LINE__);
                }
                /* SDRAM initialization sequence */
                BSP_SDRAM_Initialization_sequence(570);
        }


void BSP_SDRAM_Initialization_sequence(uint32_t RefreshCount)
{
  __IO uint32_t tmpmrd =0,timeout;
        FMC_SDRAM_CommandTypeDef Command;
       
        uint16_t i;


  /* Step 1:  Configure a clock configuration enable command */
  Command.CommandMode             = FMC_SDRAM_CMD_CLK_ENABLE;
  Command.CommandTarget           = FMC_SDRAM_CMD_TARGET_BANK1;
  Command.AutoRefreshNumber       = 1;
  Command.ModeRegisterDefinition  = 0;
  /* Send the command */
  HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT);

  /* Step 2: Insert 100 us minimum delay */
  /* Inserted delay is equal to 1 ms due to systick time base unit (ms) */
  HAL_Delay(100);

  /* Step 3: Configure a PALL (precharge all) command */
  Command.CommandMode             = FMC_SDRAM_CMD_PALL;
  Command.CommandTarget           = FMC_SDRAM_CMD_TARGET_BANK1;
  Command.AutoRefreshNumber       = 1;
  Command.ModeRegisterDefinition  = 0;
        timeout = SDRAM_TIMEOUT;

  /* Send the command */
  HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT);  
        HAL_Delay(100);
       
  /* Step 4: Configure an Auto Refresh command */
  Command.CommandMode             = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
  Command.CommandTarget           = FMC_SDRAM_CMD_TARGET_BANK1;
  Command.AutoRefreshNumber       = 8;
  Command.ModeRegisterDefinition  = 0;
        timeout = SDRAM_TIMEOUT;

  /* Send the command */
  HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT);
        HAL_Delay(100);
       
  /* Step 5: Program the external memory mode register */
  tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_2          |
                     SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |
                     SDRAM_MODEREG_CAS_LATENCY_2           |
                     SDRAM_MODEREG_OPERATING_MODE_STANDARD |
                     SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;
  
  Command.CommandMode             = FMC_SDRAM_CMD_LOAD_MODE;
  Command.CommandTarget           = FMC_SDRAM_CMD_TARGET_BANK1;
  Command.AutoRefreshNumber       = 1;
  Command.ModeRegisterDefinition  = tmpmrd;

  /* Send the command */
  HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT);
        HAL_Delay(100);
       
  /* Step 1:  Configure a clock configuration enable command */
  Command.CommandMode             = FMC_SDRAM_CMD_NORMAL_MODE;
  Command.CommandTarget           = FMC_SDRAM_CMD_TARGET_BANK1;
  Command.AutoRefreshNumber       = 1;
  Command.ModeRegisterDefinition  = 0;
  /* Send the command */
  HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT);
        HAL_Delay(100);


  /* Step 6: Set the refresh rate counter */
  /* Set the device refresh rate */
  HAL_SDRAM_ProgramRefreshRate(&hsdram1, RefreshCount);
}
回复

使用道具 举报

4

主题

8

回帖

48

积分

新手上路

积分
48
 楼主| 发表于 2018-8-16 04:19:49 | 显示全部楼层
我用的是IS42S16160G
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2018-8-18 11:41:49 | 显示全部楼层
非常抱歉,忘了回复你了,如果测试我们的有问题的话,从以下几点排查下:
1、先检查焊接,焊接问题几乎占了SDRAM问题一半多,看看是否有虚焊。
2、务必认真核对原理图中引脚是否有接错的。
3、检测引脚配置和复用配置,时钟配置是否都已经正常打开。
4、前三步都保证了,检查软件问题,不行就换个芯片。

另外,SDRAM涉及到引脚的GPIO速度等级可以降低看看
回复

使用道具 举报

4

主题

8

回帖

48

积分

新手上路

积分
48
 楼主| 发表于 2018-8-19 07:10:03 | 显示全部楼层
本帖最后由 scxingyz 于 2018-8-19 07:11 编辑
eric2013 发表于 2018-8-18 11:41
非常抱歉,忘了回复你了,如果测试我们的有问题的话,从以下几点排查下:
1、先检查焊接,焊接问题几乎占 ...

问题已经找到,SDRAM的A1/A2管脚之间有一个锡点儿造成短路,零点几毫米直径,很难发现。一直以为是驱动程序的问题。谢谢版主提供的测试程序和回复。驱动使用安富莱例程是没有问题的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2018-8-20 00:28:18 | 显示全部楼层
scxingyz 发表于 2018-8-19 07:10
问题已经找到,SDRAM的A1/A2管脚之间有一个锡点儿造成短路,零点几毫米直径,很难发现。一直以为是驱动程 ...


感谢告知最后的原因。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-19 12:20 , Processed in 0.171294 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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