STM32F429驱动外部SDRAM

发布者:初入茅庐最新更新时间:2020-03-14 来源: eefocus关键字:STM32F429  驱动  外部SDRAM 手机看文章 扫描二维码
随时随地手机看文章

STM32F429的一个很大优势就是可以直接驱动SDRAM,这样一下子就可以外扩可观的运存,很诱惑。

这里用到的SDRAM 为W9825G6KH, 256Mbit, 32MByte


配置CubeMX

在这里插入图片描述

这里不展开这里面的数值的具体计算过程,主要是按照手册来算的,感兴趣的可以网上寻找,有很多相关的资料。

SDRAM 初始化,SDRAM不像SRAM配置好了就可以用,他需要初始化

#include "stm32f4xx_hal.h"


extern SDRAM_HandleTypeDef hsdram1;


#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)


#define SDRAM_BANK1_BASE_ADDRESS    0XC0000000  

#define SDRAM_HALF_WORD_SIZE        0x1000000      //0x1000000 - 16M*16bit =32Mbyte

 

void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram);

void SDRAM_TEST(void);


typedef uint16_t u16;

typedef uint8_t u8;

typedef uint32_t u32;


/**

  * @brief  Perform the SDRAM exernal memory inialization sequence

  * @param  hsdram: SDRAM handle

  * @param  Command: Pointer to SDRAM command structure

  * @retval None

  SDRAM刷新周期是64ms,行数是8192行,时钟频率是180MHz/2=90MHz

    所有COUNT = (64ms/8192)/(1/90us)-20 = 64000*90/8192-20 = 683

  */

void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram)

{

    __IO uint32_t tmpmrd = 0;

    FMC_SDRAM_CommandTypeDef Command;

 

    /* 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(hsdram, &Command, 0x1000);

 

    /* Insert 10 ms delay */

    HAL_Delay(10);

 

    /* 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;

 

    /* Send the command */

    HAL_SDRAM_SendCommand(hsdram, &Command, 0x1000);

 

    /* Configure a Auto-Refresh command */

    Command.CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;

    Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;

    Command.AutoRefreshNumber = 8;

    Command.ModeRegisterDefinition = 0;

 

    /* Send the command */

    HAL_SDRAM_SendCommand(hsdram, &Command, 0x1000);

 

    /* Program the external memory mode register */

    tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_8|

             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_SDRAM_CMD_TARGET_BANK1;

    Command.AutoRefreshNumber = 1;

    Command.ModeRegisterDefinition = tmpmrd;

 

    /* Send the command */

    HAL_SDRAM_SendCommand(hsdram, &Command, 0x1000);

 

    /* Set the refresh rate counter */

    /* (7.81us x Freq) - 20 */

    /* Set the device refresh counter */

    HAL_SDRAM_ProgramRefreshRate(hsdram, 683);

}


void SDRAM_TEST(void)

{

uint32_t temp = 0;

uint16_t err=0;

for(i=0;i {

*(__IO uint16_t*)(SDRAM_BANK1_BASE_ADDRESS+2*i) = (uint16_t)i;

}

for(i=0;i {

temp = 0;

temp = *(__IO uint16_t*)(SDRAM_BANK1_BASE_ADDRESS+2*i);

if(temp!=(uint16_t)i)

{

err++;

}

}

printf("Total error =%dn",err);

}


3.MAIN函数中加入即可


SDRAM_Initialization_Sequence();

SDRAM_TEST();//optioanl

关键字:STM32F429  驱动  外部SDRAM 引用地址:STM32F429驱动外部SDRAM

上一篇:STM32F429 LTDC驱动RGB屏幕
下一篇:STM32F429 初试TouchGFX

推荐阅读最新更新时间:2024-11-17 12:46

基于AP3766的3W LED驱动电路设计
LED是低压发光器件,具有长寿命,高光效,安全环保,方便使用等优点。对于交流市电输入电源驱动,隔离输出是基于安全规范的要求。 LED驱动 电源的效率越高,则越能发挥LED高光效,节能的优势。同时高开关工作频率,高效率使得整个LED驱动电源容易安装在设计紧凑的LED灯具中。高恒流精度保证了大批量使用LED照明时的亮度和光色一致性。IEC国际电工委员会对照明灯具提出了明确的谐波要求,即IEC61000-3-2标准。同时,最新的能源之星(Energy Star)标准提出对于大于5W的LED照明产品,要求功率因数指标,即PF,必须大于0.7。 BCD半导体制造有限公司(简称BCD Semi)专注于电源管理集成电路产品的设计研发、工
[电源管理]
基于AP3766的3W LED<font color='red'>驱动</font>电路设计
安森美应用于汽车自动空调的电源、电机驱动及分立元件方案
  在当今的汽车设计中,空调已是标准的舒适性配置。从功能上讲,当今的汽车空调实际上是将加热、制冷及通风等功能一体化,成为汽车加热、通风空调(HVAC)系统(本文将简称为“汽车空调”)。从调节方式讲,汽车空调包括手动空调、半自动空调及自动空调。本文将专门围绕汽车自动空调进行探讨,介绍安森美半导体相应的电源供电、电机驱动及分立元件等方案,帮助设计人员选择适合的产品,用于汽车自动空调设计。   汽车空调系统包含加热及通风系统、空调制冷及电子控制单元(ECU)等不同子系统。在加热及通风子系统,新鲜空气从外部的管道通向车厢内部,提升乘客的舒适性及安全性。进入的空气流过小的发热芯,连接到发动机的冷却系统。空调制冷子系统则通过不断蒸发和冷凝,
[汽车电子]
安森美应用于汽车自动空调的电源、电机<font color='red'>驱动</font>及分立元件方案
STM32驱动LCD12864显示屏
我们做一个电子产品,往往需要实现人机交互的功能。那么人机交互的方式除了输出到上位机通过电脑去显示,显示器也是一个很不错的方式,可用于一些不能使用电脑的场合。LCD12864显示器中的一种,具有价格低廉,操作简单的优点。今天就为大家带来一个STM32驱动12864的例程,使用SPI串行通信,仅仅需要三根数据线就可以完成通信。废话不多说,进入正题。 接线: RS----PB15 RW----PB14 EN----PB13 PSB---GND 1.初始化IO口以及显示屏 void Lcd_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2Per
[单片机]
TI DLP®技术驱动结构光系统实现箱拣精度
在工业环境中,每天需要处理不同形状、尺寸、材料和光学特性(如反射比、吸收等)的零件。这些零件必须以特定的方向挑选和放置,然后进行加工。将这些零件随机从存放的环境(容器或其他)中自动挑选并放置的活动通常被称为箱拣。但这对机器人末端执行器(一种连接到机械臂末端的设备)提出了挑战,它需要准确地知道要抓取物体的3D位置、尺寸及其想方向。为了做到在箱子外壁和箱内其他物体周围准确导航,机器人的机器视觉系统除了需要获取2D相机信息外,还需要获取深度信息。 对于箱拣来说,捕获物体3D影像的难题可以由结构光技术解决。基于结构光技术的3D扫描仪/相机通过将一系列图案投射到被扫描的物体上而工作,并且用相机或传感器来捕获图案失真。然后三角剖分算法计算
[传感器]
TI DLP®技术<font color='red'>驱动</font>结构光系统实现箱拣精度
数码管的驱动
#include pic.h //包含单片机内部资源预定义 #include DelayMs.h __CONFIG(0x3B31); //定义常数0-9的数据表格 const unsigned char TABLE = {0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7c,0x7,0x7f,0x6f}; void Display(unsigned char num,unsigned char data) { PORTD = TABLE ; //取出数据,送D口显示 PORTC = 0x01; switch(num) { case 0: PORTA = 0x01; break
[单片机]
Allegro MicroSystems, LLC发布全新三相BLDC控制器和MOSFET驱动器IC
Allegro MicroSystems, LLC发布一款可与外部N沟道功率MOSFET器件一同使用的全新三相无刷直流(BLDC)马达控制器AMT49413,它集成了高性价比三相马达驱动系统设计所需的大部分电路,具有高达50V的最大供电电压。这款新器件主要面向需要对速度、位置或转矩控制的大电流BLDC马达应用,适用于消费和工业市场中的电池供电电动工具、草坪和园艺设备及工业自动化、泵、风扇、鼓风机和家用电器等领域。 AMT49413可在宽泛的输入电源电压范围内正常运行,其独特的升压泵稳压器在电池电压低至7V时也可提供足够的栅极驱动电压( 10V)。在电源电压低至5.5V情况下,器件可在低栅极驱动电压模式下工作。采用一个自举电容器则可
[工业控制]
Allegro MicroSystems, LLC发布全新三相BLDC控制器和MOSFET<font color='red'>驱动</font>器IC
梳理STM32F429之通信传输部分---NO.1 串口通讯
一、STM32 的 USART 简介: STM32 芯片具有多个 USART 外设用于串口通讯,它是 Universal SynchronousAsynchronous Receiver and Transmitter 的缩写,即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换。有别于 USART,它还有具有 UART 外设(UniversalAsynchronousReceiver and Transmitter),它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。 USART 满足外部设备对工业标准 NR
[单片机]
梳理<font color='red'>STM32F429</font>之通信传输部分---NO.1 串口通讯
手把手教你写Linux设备驱动---中断(三)--workqueue实现(基于友善之臂4412开发板)
上节,我们讲到如何来实现tasklet小任务机制 http://blog.csdn.NET/morixinguan/article/details/69666935 这节,我们来实现一下中断下半部的工作队列: 在写这个demo之前,我们要了解一下工作队列的相关数据结构还有API。 需要包含的头文件: #include Linux/workqueue.h 基本的数据结构: //工作队列结构 struct work_struct { atomic_long_t data; //链表处理 struct list_head entry; //工作处理函数 work_func_t
[单片机]
手把手教你写Linux设备<font color='red'>驱动</font>---中断(三)--workqueue实现(基于友善之臂4412开发板)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved