Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
STM32F429
SDRAM
RT-Thread Studio
RT Thread Studio RGB屏幕之 SDRAM配置
发布于 2022-05-09 23:36:11 浏览:1706
订阅该版
软 件:RT Thread Studio MCU: stm32f429bit6 sdram: W9812G2 16M 32位 SDRAM 原理图: ![image.png](https://oss-club.rt-thread.org/uploads/20220509/6b972b1ef113085fb4129377105b3cd5.png.webp) ![image.png](https://oss-club.rt-thread.org/uploads/20220509/bd82d09dd22796cb106d13e47237eb0d.png.webp) 步骤1. 复制 drv_sdram.c 文件到 drivers 文件夹内 “drv_sdram.c”文件位于“D:/RT-ThreadStudio/repo/Extract/RT-Thread_Source_Code/RT-Thread/4.1.0/bsp/stm32/libraries/HAL_Drivers”文件夹中。 步骤2. 复制 sdram_port.h 文件到 drivers/include 文件夹内 “sdram_port.h”文件位于“D:/RT-ThreadStudio/repo/Extract/RT-Thread_Source_Code/RT-Thread/4.1.0/bsp/stm32/stm32f429-atk-apollo/board/ports”文件夹中 步骤3. 添加“#define BSP_USING_SDRAM” 在“board.h”中添加“#define BSP_USING_SDRAM”开启SDRAM ``` /*#define BSP_USING_ON_CHIP_FLASH*/ #define BSP_USING_SDRAM /*-------------------------- ON_CHIP_FLASH CONFIG END --------------------------*/ ``` 步骤4. 使用 cubemx 配置 FMC ![image.png](https://oss-club.rt-thread.org/uploads/20220509/9f07a70b757e846d076c4356482d6565.png.webp) ![image.png](https://oss-club.rt-thread.org/uploads/20220509/3b94256293371c89402ad2bc45e64557.png.webp) 步骤5. 复制“cubemx\Src\fmc.c”文件内的static void HAL_FMC_MspInit(void)函数及代码到"drv_sdram.c”内,按照fmc中sdram的IO口进行修改,使能IO时钟 ``` static void HAL_FMC_MspInit(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* Peripheral clock enable */ __HAL_RCC_FMC_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOI_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); /** FMC GPIO Configuration PI9 ------> FMC_D30 PI10 ------> FMC_D31 PF0 ------> FMC_A0 PF1 ------> FMC_A1 PF2 ------> FMC_A2 PF3 ------> FMC_A3 PF4 ------> FMC_A4 PF5 ------> FMC_A5 PC0 ------> FMC_SDNWE PF11 ------> FMC_SDNRAS PF12 ------> FMC_A6 PF13 ------> FMC_A7 PF14 ------> FMC_A8 PF15 ------> FMC_A9 PG0 ------> FMC_A10 PG1 ------> FMC_A11 PE7 ------> FMC_D4 PE8 ------> FMC_D5 PE9 ------> FMC_D6 PE10 ------> FMC_D7 PE11 ------> FMC_D8 PE12 ------> FMC_D9 PE13 ------> FMC_D10 PE14 ------> FMC_D11 PE15 ------> FMC_D12 PH6 ------> FMC_SDNE1 PH7 ------> FMC_SDCKE1 PH8 ------> FMC_D16 PH9 ------> FMC_D17 PH10 ------> FMC_D18 PH11 ------> FMC_D19 PH12 ------> FMC_D20 PD8 ------> FMC_D13 PD9 ------> FMC_D14 PD10 ------> FMC_D15 PD14 ------> FMC_D0 PD15 ------> FMC_D1 PG4 ------> FMC_BA0 PG5 ------> FMC_BA1 PG8 ------> FMC_SDCLK PH13 ------> FMC_D21 PH14 ------> FMC_D22 PH15 ------> FMC_D23 PI0 ------> FMC_D24 PI1 ------> FMC_D25 PI2 ------> FMC_D26 PI3 ------> FMC_D27 PD0 ------> FMC_D2 PD1 ------> FMC_D3 PG15 ------> FMC_SDNCAS PE0 ------> FMC_NBL0 PE1 ------> FMC_NBL1 PI4 ------> FMC_NBL2 PI5 ------> FMC_NBL3 PI6 ------> FMC_D28 PI7 ------> FMC_D29 */ /* GPIO_InitStruct */ GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_0|GPIO_PIN_1 |GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5 |GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF12_FMC; HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); /* GPIO_InitStruct */ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_11|GPIO_PIN_12 |GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF12_FMC; HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); /* GPIO_InitStruct */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF12_FMC; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /* GPIO_InitStruct */ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5 |GPIO_PIN_8|GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF12_FMC; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); /* GPIO_InitStruct */ GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10 |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14 |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF12_FMC; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); /* GPIO_InitStruct */ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9 |GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13 |GPIO_PIN_14|GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF12_FMC; HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); /* GPIO_InitStruct */ GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14 |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF12_FMC; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); } //将 HAL_FMC_MspInit() 函数放至到 static int SDRAM_Init(void) 函数中, //一起初始化 static int SDRAM_Init(void) { HAL_FMC_MspInit(); int result = RT_EOK; FMC_SDRAM_TimingTypeDef SDRAM_Timing; ``` 步骤6. 根据所选sdram的要求修改“sdram_port.h”文件夹中的宏定义,我的sdram是W9812G2,16M,32-bit,修改后的代码为 ``` #ifndef __SDRAM_PORT_H__ #define __SDRAM_PORT_H__ /* parameters for sdram peripheral */ /* Bank1 or Bank2 */ #define SDRAM_TARGET_BANK 2 /* stm32f4 Bank1:0XC0000000 Bank2:0XD0000000 */ #define SDRAM_BANK_ADDR ((uint32_t)0XD0000000) // FMC SDRAM 数据基地址 /* data width: 8, 16, 32 */ #define SDRAM_DATA_WIDTH 32 /* column bit numbers: 8, 9, 10, 11 */ #define SDRAM_COLUMN_BITS 8 /* row bit numbers: 11, 12, 13 */ #define SDRAM_ROW_BITS 12 /* cas latency clock number: 1, 2, 3 */ #define SDRAM_CAS_LATENCY 3 /* read pipe delay: 0, 1, 2 */ #define SDRAM_RPIPE_DELAY 1 /* clock divid: 2, 3 */ #define SDCLOCK_PERIOD 2 /* refresh rate counter */ //#define SDRAM_REFRESH_COUNT ((uint32_t)0x02AB) #define SDRAM_REFRESH_COUNT ((uint32_t)0x1000) // 超时判断时间 #define SDRAM_SIZE ((uint32_t)0x01000000) // 16M字节 /* Timing configuration for W9812G2 */ /* 90 MHz of SD clock frequency (180MHz/2) */ /* TMRD: 2 Clock cycles */ #define LOADTOACTIVEDELAY 2 /* TXSR: 7x11.90ns */ #define EXITSELFREFRESHDELAY 7 /* TRAS: 4x11.90ns */ #define SELFREFRESHTIME 4 /* TRC: 7x11.90ns */ #define ROWCYCLEDELAY 7 /* TWR: 2 Clock cycles */ #define WRITERECOVERYTIME 3 /* TRP: 2x11.90ns */ #define RPDELAY 2 /* TRCD: 2x11.90ns */ #define RCDDELAY 2 ``` 步骤7:sdram测试 ![image.png](https://oss-club.rt-thread.org/uploads/20220509/32ef011067bc8b8cb86e184595ebaad7.png.webp) enjoy it!
2
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
boluoc
这家伙很懒,什么也没写!
文章
2
回答
0
被采纳
0
关注TA
发私信
相关文章
1
rt_thread studio 啥时候能用呢
2
RT_Thread使用反馈帖子
3
RTT studio 下的 AT指令问题。
4
什么时候RTT Sdudio支持Ubuntu,Deepin和UOS操作系统
5
rt thread Studio 关于J-LINK下载问题
6
RT-Thread studio 调试设置问题
7
RTT-Studio 如何设置调试配置参数?
8
rt_thread studio 软件包配置
9
RT-Studio目前只能开发STM32的项目吗?
10
rtt studio 生成hex名字修改
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部