【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。。。