历史上的今天
返回首页

历史上的今天

今天是:2024年08月29日(星期四)

正在发生

2019年08月29日 | STM32F429 >> 22. FMC_扩展外部SDRAM(Code)

2019-08-29 来源:eefocus

本代码用型号为“IS42S16400J”的 SDRAM 芯片为 STM32 扩展内存。


它的行地址宽度为 12 位,列地址宽度为 8 位,内部含有 4 个 Bank,数据线宽度为 16 位,容量大小为8MB。


SDRAM 硬件连接图:

在这里插入图片描述

SDRAM 与 STM32 相连的引脚非常多,主要是地址线和数据线。


bsp_sdram.h

/**

  ******************************************************************************

  * @file    bsp_sdram.c

  * @author  Waao

  * @version V1.0.0

  * @date    24-Feb-2019

  * @brief   This file contains some board support package's functions for the configuration of the SysTick.

  *            

  ******************************************************************************

  * @attention

  *

  * None

*

  ******************************************************************************

  */


#ifndef __BSP_SDRAM_H_

#define __BSP_SDRAM_H_


#include

#include

#include

#include



#define IS42S16400J_SIZE                         0x800000


#define SDRAM_DEBUG_ON                           1

#define SDRAM_INFO(fmt, arg...)                  printf("<<- SDRAM-INFO ->> "fmt"n", ##arg)

#define SDRAM_ERROR(fmt, arg...)                 printf("<<- SDRAM-ERROR ->> "fmt"n", ##arg)

#define SDRAM_DEBUG(fmt, arg...)                 do{

                                                     if(SDRAM_DEBUG_ON)

                                                       printf("<<- SDRAM-DEBUG ->> [%d]"fmt"n", __LINE__, ##arg);

                                                    }

                                                 while(0)


/* Bank selection */

#define FMC_BANK_SDRAM                           FMC_Bank2_SDRAM  

#define FMC_COMMAND_TARGET_BANK                  FMC_Command_Target_bank2


/* Data BaseAddress */

#define SDRAM_BANK_ADDR                          ((uint32_t)0xD0000000)


/* Data width */

#define SDRAM_MEMORY_WIDTH                       FMC_SDMemory_Width_16b 


/* SDRAM CAS Latency */

#define SDRAM_CAS_LATENCY                        FMC_CAS_Latency_2  


#define SDCLOCK_PERIOD                           FMC_SDClock_Period_2        /* Default configuration used with LCD */


#define SDRAM_READBURST                          FMC_Read_Burst_Enable  


/* The relevant definition of FMC SDRAM mode configuring register */

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

/******************************************************************/


/* A row colunm address signal line */    

#define FMC_A0_GPIO_PORT        GPIOF

#define FMC_A0_GPIO_CLK         RCC_AHB1Periph_GPIOF

#define FMC_A0_GPIO_PIN         GPIO_Pin_0

#define FMC_A0_PINSOURCE        GPIO_PinSource0

#define FMC_A0_AF               GPIO_AF_FMC


#define FMC_A1_GPIO_PORT        GPIOF

#define FMC_A1_GPIO_CLK         RCC_AHB1Periph_GPIOF

#define FMC_A1_GPIO_PIN         GPIO_Pin_1

#define FMC_A1_PINSOURCE        GPIO_PinSource1

#define FMC_A1_AF               GPIO_AF_FMC


#define FMC_A2_GPIO_PORT        GPIOF

#define FMC_A2_GPIO_CLK         RCC_AHB1Periph_GPIOF

#define FMC_A2_GPIO_PIN         GPIO_Pin_2

#define FMC_A2_PINSOURCE        GPIO_PinSource2

#define FMC_A2_AF               GPIO_AF_FMC


#define FMC_A3_GPIO_PORT        GPIOF

#define FMC_A3_GPIO_CLK         RCC_AHB1Periph_GPIOF

#define FMC_A3_GPIO_PIN         GPIO_Pin_3

#define FMC_A3_PINSOURCE        GPIO_PinSource3

#define FMC_A3_AF               GPIO_AF_FMC


#define FMC_A4_GPIO_PORT        GPIOF

#define FMC_A4_GPIO_CLK         RCC_AHB1Periph_GPIOF

#define FMC_A4_GPIO_PIN         GPIO_Pin_4

#define FMC_A4_PINSOURCE        GPIO_PinSource4

#define FMC_A4_AF               GPIO_AF_FMC


#define FMC_A5_GPIO_PORT        GPIOF

#define FMC_A5_GPIO_CLK         RCC_AHB1Periph_GPIOF

#define FMC_A5_GPIO_PIN         GPIO_Pin_5

#define FMC_A5_PINSOURCE        GPIO_PinSource5

#define FMC_A5_AF               GPIO_AF_FMC


#define FMC_A6_GPIO_PORT        GPIOF

#define FMC_A6_GPIO_CLK         RCC_AHB1Periph_GPIOF

#define FMC_A6_GPIO_PIN         GPIO_Pin_12

#define FMC_A6_PINSOURCE        GPIO_PinSource12

#define FMC_A6_AF               GPIO_AF_FMC


#define FMC_A7_GPIO_PORT        GPIOF

#define FMC_A7_GPIO_CLK         RCC_AHB1Periph_GPIOF

#define FMC_A7_GPIO_PIN         GPIO_Pin_13

#define FMC_A7_PINSOURCE        GPIO_PinSource13

#define FMC_A7_AF               GPIO_AF_FMC


#define FMC_A8_GPIO_PORT        GPIOF

#define FMC_A8_GPIO_CLK         RCC_AHB1Periph_GPIOF

#define FMC_A8_GPIO_PIN         GPIO_Pin_14

#define FMC_A8_PINSOURCE        GPIO_PinSource14

#define FMC_A8_AF               GPIO_AF_FMC


#define FMC_A9_GPIO_PORT        GPIOF

#define FMC_A9_GPIO_CLK         RCC_AHB1Periph_GPIOF

#define FMC_A9_GPIO_PIN         GPIO_Pin_15

#define FMC_A9_PINSOURCE        GPIO_PinSource15

#define FMC_A9_AF               GPIO_AF_FMC



#define FMC_A10_GPIO_PORT        GPIOG

#define FMC_A10_GPIO_CLK         RCC_AHB1Periph_GPIOG

#define FMC_A10_GPIO_PIN         GPIO_Pin_0

#define FMC_A10_PINSOURCE        GPIO_PinSource0

#define FMC_A10_AF               GPIO_AF_FMC



#define FMC_A11_GPIO_PORT        GPIOG

#define FMC_A11_GPIO_CLK         RCC_AHB1Periph_GPIOG

#define FMC_A11_GPIO_PIN         GPIO_Pin_1

#define FMC_A11_PINSOURCE        GPIO_PinSource1

#define FMC_A11_AF               GPIO_AF_FMC


/* BA address line */

#define FMC_BA0_GPIO_PORT        GPIOG

#define FMC_BA0_GPIO_CLK         RCC_AHB1Periph_GPIOG

#define FMC_BA0_GPIO_PIN         GPIO_Pin_4

#define FMC_BA0_PINSOURCE        GPIO_PinSource4

#define FMC_BA0_AF               GPIO_AF_FMC


#define FMC_BA1_GPIO_PORT        GPIOG

#define FMC_BA1_GPIO_CLK         RCC_AHB1Periph_GPIOG

#define FMC_BA1_GPIO_PIN         GPIO_Pin_5

#define FMC_BA1_PINSOURCE        GPIO_PinSource5

#define FMC_BA1_AF               GPIO_AF_FMC


/* DQ data signal line */

#define FMC_D0_GPIO_PORT        GPIOD

#define FMC_D0_GPIO_CLK         RCC_AHB1Periph_GPIOD

#define FMC_D0_GPIO_PIN         GPIO_Pin_14

推荐阅读

史海拾趣

Block USA Inc.公司的发展小趣事

在支付与金融服务领域取得成功后,Block USA Inc.还尝试了跨界合作,推出了音乐软件TIDAL。这一举措旨在通过提供高品质的音乐体验,吸引更多年轻用户群体,并进一步扩大Block的品牌影响力。虽然音乐市场竞争激烈,但TIDAL凭借其独特的音乐资源和用户体验,逐渐在市场中占据了一席之地。

High Voltage Semiconductor Inc公司的发展小趣事

进入21世纪,美高测持续加大在技术研发上的投入,成功研发出具有自主知识产权的VLF(超低频)测试技术,并应用于变电站设备、中高压电力电缆等关键领域的测试。这项技术不仅提高了测试的准确性和效率,还降低了操作风险,迅速获得了市场的广泛认可。公司借此机会,在全球范围内建立了多个销售和服务中心,进一步巩固了其在高压半导体测试市场的领先地位。

巨盛电子(Chesen)公司的发展小趣事

巨盛电子(Chesen)自创立之初,就坚持将技术创新作为公司的核心竞争力。在电子行业迅速发展的背景下,公司投入大量资源进行研发,成功推出了一系列具有领先技术水平的电子产品。这些产品不仅满足了市场对于高品质、高性能电子产品的需求,还通过创新功能赢得了消费者的青睐。巨盛电子凭借技术创新,逐渐在电子行业中崭露头角,成为市场的领导者。

BURGESS公司的发展小趣事

进入21世纪,BURGESS继续保持其强劲的发展势头。2004年,它成为第一家在纽约拥有工作地的游艇经理公司,这标志着其在美国市场的深入拓展。此外,BURGESS还不断扩大其在全球的业务网络,目前在全球范围内拥有12家办公室和160多名员工,形成了一个庞大的游艇经纪帝国。

Cantec Electronic Co Ltd公司的发展小趣事

随着电子行业的快速发展,市场竞争日益激烈。Cantec Electronic Co Ltd意识到,传统的生产模式已经无法满足市场的需求。于是,公司决定进行转型升级,将重心转向智能电子产品的研发和生产。通过引进先进的生产设备和技术人才,公司成功开发出了一系列具有竞争力的智能电子产品,赢得了市场的广泛认可。

Eurohm Resistors公司的发展小趣事

在电子行业的早期,Eurohm Resistors公司就以其独特的技术创新能力崭露头角。公司创始人敏锐地察觉到了半导体技术在电子行业中的重要地位,于是投入大量资源研发高精度、高稳定性的电阻器。通过不断的技术迭代和创新,Eurohm Resistors成功推出了一系列性能卓越的电阻器产品,赢得了市场的广泛认可。

问答坊 | AI 解惑

关于TI 6000系列DSP优化经验(转帖)

看到网上很多网友对TI 6000系列DSP优化工作感到苦恼,在此我总结下我的优化经验,希望对大家有帮助。 一、首先考虑从系统结构上优化,比如尽量减少待处理数据的无谓搬移,考虑你DSP片内存储量和每次处理数据量对系统结构优化,这部分的优化应该最 ...…

查看全部问答>

【ATMEL技术问题】关于KEIL下AT91R40008启动代码问题

用KEIL 软件建立一个工程,自动生成一个启动代码STartup.S ; 但是问题来了,这个代码有点不知所云,编译出错哦啊,请大侠指点!下面是代码 /*****************************************************************************/;/* STARTUP.S: Start ...…

查看全部问答>

菜鸟提问:SHBrowseForForlder()不能用,怎么代替

我是个初学者,我这个平台不能使用SHBrowseForForlder()这个方法,想找另外一个方法来代替SHBrowseForFolder,达到相同的效果, 或者可以不用打开浏览文件夹着个对话框,直接可以保存文件到指定目录也可以。劳驾各位帮忙啊…

查看全部问答>

求助:蓝牙和WIFI共存的问题

关于BT与WIFI共存时的设计,小弟有些问题,实在是不太明白,请教各位高手。 1. 我在网上看到有人说如果蓝牙和WIFI的物理隔离达到30dB以上,则两者之间的相互影响可以基本忽略。请问如果才能做到物理隔离达到30dB以上呢?是否天线距离远一些就可以 ...…

查看全部问答>

关于pc104总线驱动的制作

小弟刚刚做了一块基于pc104总线的DA板卡,但是现在要与基于pc104总线的3350主板进行交互,主要是对pc104总线的数据进行读取,需要制作驱动,小弟第一次开发,有那位大侠能够给一个例子或其他的资料,多谢…

查看全部问答>

螺纹的检测技术

各位大虾,有什么方法可以检测孔内的螺纹?只要检测孔内是否有螺纹就可以了。…

查看全部问答>

向大家请教一下uc/os-II多任务的运行机制?

有一个如下的uc/os-II源代码,就是采用信号量机制使两个任务共享一个串口com1,去打印一条字符串。 [code] #include \"config.h\" #define        Task0StkLengh        64       ...…

查看全部问答>

【课后练习】LaunchPad课后练习七之定时器

课后练习七之定时器   (定时器看起来简单,却搞了好久,和之前的430定时器不太一样,看了很多次,还有很多没弄出来的地方,有几个地方还是没懂) 1.TIMER_A由以下部分组成 [1] 计数器部分 输入的时钟源具有4种选择,所选择的时钟源又可 ...…

查看全部问答>

4位半的AD达到5位半分辨率的讨论,欢迎跟进一起探讨。

5位半的数字万用表没有一千块RMB是拿不下来的,本帖想讨论能否设计一种廉价的方案实施一个5位半表呢? ICL7135是4位半AD转换器,价格低廉,才4块钱多些,如果采用过采样编程技术,是否可以做出一个5位半分辨率的万用表呢? 欢迎讨论。 如果经研 ...…

查看全部问答>