野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 26142|回复: 1

不等老板了F767_V1核心板 CubeMX 从头配置 SDRAM 成了。

[复制链接]
发表于 2021-2-16 18:43:39 | 显示全部楼层 |阅读模式
春节假期还剩两天。不等老板了。节后耽误啊。F767_V1核心板 CubeMX 从头配置 SDRAM 成了。

————————————————————————
其实这种标准化的配置文件:板子出品的时候就
应该有,这样节约用户时间、板子的销量才更好。
————————————————————————
CubeMX 从头配置 SDRAM全新的工程不含垃圾文件:
第一步:新建 CubeMX 工程 配置 FMC 如下:
步骤一.jpg
第二步:配置 FMS 参数 如下图所示(IS42D16400)
步骤二.jpg
第三步:在 Main 程序里 必须添加 如下的一段程序:
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
#define Bank1   (1)
#define Bank2   (2)
#define SDRAM_MODEREG_BURST_LENGTH_1             ((uint16_t)0x0000)
#define SDRAM_MODEREG_BURST_LENGTH_2             ((uint16_t)0x0001)
#define SDRAM_MODEREG_BURST_LENGTH_4             ((uint16_t)0x0002)
#define SDRAM_MODEREG_BURST_LENGTH_8             ((uint16_t)0x0004)
#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL      ((uint16_t)0x0000)
#define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED     ((uint16_t)0x0008)
#define SDRAM_MODEREG_CAS_LATENCY_2              ((uint16_t)0x0020)
#define SDRAM_MODEREG_CAS_LATENCY_3              ((uint16_t)0x0030)
#define SDRAM_MODEREG_OPERATING_MODE_STANDARD    ((uint16_t)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE     ((uint16_t)0x0200)


uint8_t SDRAM_SendCommand(uint32_t CommandMode, uint32_t Bank, uint32_t RefreshNum, uint32_t RegVal)
{
    uint32_t CommandTarget;
    FMC_SDRAM_CommandTypeDef Command;
   
    if(Bank == 1)
        CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
    else if(Bank == 2)
        CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2;
   
    Command.CommandMode = CommandMode;
    Command.CommandTarget = CommandTarget;
    Command.AutoRefreshNumber = RefreshNum;
    Command.ModeRegisterDefinition = RegVal;
    if(HAL_SDRAM_SendCommand(&hsdram1, &Command, 0x1000) == HAL_OK)
        return 1;
    else
        return 0;
}
// 在主函数中调用下面的 SDRAM_Init()函数后即可使用SDRAM 。
void SDRAM_Init(void)
{
    uint32_t temp;
   
    SDRAM_SendCommand(FMC_SDRAM_CMD_CLK_ENABLE,Bank2, 1, 0);        //步骤3:使能时钟信号,SDCKE0 = 1
    HAL_Delay(1);                                                   //步骤4:至少延时200us
    SDRAM_SendCommand(FMC_SDRAM_CMD_PALL,Bank2, 1, 0);              //步骤5:发送全部预充电命令
    SDRAM_SendCommand(FMC_SDRAM_CMD_AUTOREFRESH_MODE,Bank2, 8, 0);  //步骤6:设置自动刷新次数
   
    temp = SDRAM_MODEREG_BURST_LENGTH_1     |                       //设置突发长度:1
      SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |                       //设置突发类型:连续
      SDRAM_MODEREG_CAS_LATENCY_3           |                       //设置CAS值:3
      SDRAM_MODEREG_OPERATING_MODE_STANDARD |                       //设置操作模式:标准
      SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;                         //设置突发写模式:单点访问
   
    SDRAM_SendCommand(FMC_SDRAM_CMD_LOAD_MODE,Bank2, 1, temp);      //步骤7:装载模式寄存器的值
   
    //SDRAM刷新周期是64ms,行数是8192行,时钟频率是168MHz/2=84MHz
    //所有COUNT = (64ms/8192)/(1/84us)-20 = 64000*84/8192-20 = 636
    HAL_SDRAM_ProgramRefreshRate(&hsdram1,1536);                    //步骤8:设置刷新速率
}
/* USER CODE END PV */
大功告成——野火F767_V1核心板上的 SDRAM 可用了。


后记:配置这个 SDRAM 耗费了 俺三天 春节假期 ,你们作为厂商
这几乎就是小儿科的事情,板子推出就应该提供这种配置文件。。
——节约用户的时间、板子的销量才会更好。————
[url=]F767_SDRAM.rar[/url]

F767_SDRAM.rar

2.73 KB, 下载次数: 2

成功

回复

使用道具 举报

 楼主| 发表于 2021-2-17 10:48:38 | 显示全部楼层
今天 写了 一段简单的 测试 SDRAM 的程序,顺便 优化 SDRAM 的 速度。


/* USER CODE BEGIN PV */
  uint32_t ContN;
  #pragma location = 0xD0000000
  uint32_t sdram_buf[0x200000];  // 8MB  占满
/* Private variables ---------------------------------------------------------*/

  /* USER CODE BEGIN 2 */
  SDRAM_Init();         // ******** 现在可用 SDRAM ********了 。
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  for (ContN=0;ContN<0x200000;ContN++){
    sdram_buf[ContN] = 1 + ContN;
  }
  while (1)     // 目前是 亮灯的 。
  {
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_11,GPIO_PIN_SET);  // 熄灭 LED
    for (ContN=0;ContN<0x200000;ContN++){
      if (sdram_buf[ContN] != 1 + ContN){
      HAL_GPIO_WritePin(GPIOD,GPIO_PIN_11,GPIO_PIN_RESET);
      HAL_Delay(5000);   // 长亮 5秒 。内存若出错 其实一直亮 。
      }
    }
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_11,GPIO_PIN_RESET);// 点亮 LED
    for (ContN=0;ContN<0x200000;ContN++){
      if (sdram_buf[ContN] != 1 + ContN){
      HAL_GPIO_WritePin(GPIOD,GPIO_PIN_11,GPIO_PIN_RESET);
      HAL_Delay(5000);   // 长亮 5秒 。内存若出错 其实一直亮 。
      }
    }   
    // LED熄灭、点亮 的周期,可以反映内存工作速度 (用于参数优化)。

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }

回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 21:58 , Processed in 0.042091 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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