【ThreadX全家桶】GuiX移植之FMC

【ThreadX全家桶】GuiX移植之FMC


前言

GuiX移植内容较多,打算分四篇来讲述
1)GuiX移植之FMC
2)GuiX移植之LTDC
3)GuiX移植之DMA2D
4)GuiX移植


软硬件介绍:STM32F429BIT(反客科技的一块板子,挺适合拿来学习ThreadX的);
SDRAM型号:W9812G2
ThreadX版本:6.1.3;
GuiX版本:6.1.3;
IDE:KEIL5 v5.31.0.0版本、STM32CubeMX;
ARM编译器:AC6

一、FMC配置

在这里插入图片描述

①SDRAM control中关闭写保护,使能突发读,可提高读写效率
②时序配置可参考下图,在SDRAM数据手册中查找相应的项目即可
注:“自我刷新周期” “行循环延迟”的简写发现两种命名,该项目是以tRAS和tRC为准。
在这里插入图片描述

二、SDRAM初始化

SDRMA不同于SRAM的上电即用,SDRAM上电后需要进行初始化方可使用。故需要在FMC初始化后进行SDRAM初始化。具体可参考《安富莱STM32-V6开发板_用户手册》第39章学习。

提供一个简易版的SDRAM初始化代码:

#include "main.h"
void SDRAM_delay(__IO uint32_t nCount)
{
  __IO uint32_t index = 0; 
	
  for(index = (100000 * nCount); index != 0; index--);

}


void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command)
{
  __IO uint32_t tmpmrd = 0;
  
  /* Configure a clock configuration enable command */
  Command->CommandMode 					= FMC_SDRAM_CMD_CLK_ENABLE;	// 开启SDRAM时钟 
  Command->CommandTarget 				= FMC_COMMAND_TARGET_BANK; 	// 选择要控制的区域
  Command->AutoRefreshNumber 			= 1;
  Command->ModeRegisterDefinition 	= 0;
  
  HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);	// 发送控制指令
  SDRAM_delay(1);		// 延时等待
  
  /* Configure a PALL (precharge all) command */ 
  Command->CommandMode 					= FMC_SDRAM_CMD_PALL;		// 预充电命令
  Command->CommandTarget 				= FMC_COMMAND_TARGET_BANK;	// 选择要控制的区域
  Command->AutoRefreshNumber 			= 1;
  Command->ModeRegisterDefinition 	= 0;
  
  HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);  // 发送控制指令
  
  /* Configure a Auto-Refresh command */ 
  Command->CommandMode 					= FMC_SDRAM_CMD_AUTOREFRESH_MODE;	// 使用自动刷新
  Command->CommandTarget 				= FMC_COMMAND_TARGET_BANK;          // 选择要控制的区域
  Command->AutoRefreshNumber			= 8;                                // 自动刷新次数
  Command->ModeRegisterDefinition 	= 0;
  
  HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);	// 发送控制指令
  
  /* Program the external memory mode register */
  tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_2          |
                     SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |
                     SDRAM_MODEREG_CAS_LATENCY_3           |
                     SDRAM_MODEREG_OPERATING_MODE_STANDARD |
                     SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;
  
  Command->CommandMode					= FMC_SDRAM_CMD_LOAD_MODE;	// 加载模式寄存器命令
  Command->CommandTarget 				= FMC_COMMAND_TARGET_BANK;	// 选择要控制的区域
  Command->AutoRefreshNumber 			= 1;
  Command->ModeRegisterDefinition 	= tmpmrd;
  
  HAL_SDRAM_SendCommand(hsdram, Command, SDRAM_TIMEOUT);	// 发送控制指令
  
  hsdram->Instance->SDRTR |= ((uint32_t)((1386)<< 1));	// 设置刷新计数器 
}

在main.c文件中,FMC初始化后调用SDRAM初始化函数。
在这里插入图片描述

自行测试SDRAM。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值