项目使用STM32F407ZET6开发,但自带的RAM空间不够,所以需要外扩SRAM作为默认的RAM来使用,使用的SRAM是IS62WV51216BLL,19条地址线,16条数据线,使用的库为HAL库。

外扩的SRAM使用FSMC的NE3作为硬件接口,所以外扩的重要步骤其实是NE3作为SRAM的初始化。

第一步:勾选魔术棒下面的选项,这样才能使其作为默认的RAM来分配变量

第二步就是FSMC的初始化,由于变量拷贝到RAM中初始化这个过程是在进入main函数之前完成的,所以初始化必须在启动文件LDR     R0, =__main 之前完成,这里其实有2个选择,一个是调用自己写的C函数(调用FSMC库函数),一个是通过SystemInit函数中的SystemInit_ExtMemCtl函数配置寄存器来完成,这里我们选择第二种方式。

那么我们需要先将DATA_IN_ExtSRAM添加到魔术棒C/C++选项的Define中,这样SystemInit才会调用SystemInit_ExtMemCtl函数

下一步就是修改寄存器的配置,SystemInit_ExtMemCtl函数407部分FSMC的配置默认是NE2的。找到407部分(有2部分,一部分为引脚配置,一部分为FSMC配置,找到有defined(STM32F407xx)字样的代码部分就是)将寄存器配置修改为以下内容

#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\|| defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\|| defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx)#if defined(DATA_IN_ExtSRAM)
/*-- GPIOs Configuration -----------------------------------------------------*//* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */RCC->AHB1ENR   |= 0x00000078;/* Delay after an RCC peripheral clock enabling */tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);/* Connect PDx pins to FMC Alternate function */GPIOD->AFR[0]  = 0x00CC00CC;GPIOD->AFR[1]  = 0xCCCCCCCC;/* Configure PDx pins in Alternate function mode */  GPIOD->MODER   = 0xAAAA0A0A;/* Configure PDx pins speed to 100 MHz */  GPIOD->OSPEEDR = 0xFFFF0F0F;/* Configure PDx pins Output type to push-pull */  GPIOD->OTYPER  = 0x00000000;/* No pull-up, pull-down for PDx pins */ GPIOD->PUPDR   = 0x00000000;/* Connect PEx pins to FMC Alternate function */GPIOE->AFR[0]  = 0xC00000CC;GPIOE->AFR[1]  = 0xCCCCCCCC;/* Configure PEx pins in Alternate function mode */ GPIOE->MODER   = 0xAAAA800A;/* Configure PEx pins speed to 100 MHz */ GPIOE->OSPEEDR = 0xFFFFC00F;/* Configure PEx pins Output type to push-pull */  GPIOE->OTYPER  = 0x00000000;/* No pull-up, pull-down for PEx pins */ GPIOE->PUPDR   = 0x00000000;/* Connect PFx pins to FMC Alternate function */GPIOF->AFR[0]  = 0x00CCCCCC;GPIOF->AFR[1]  = 0xCCCC0000;/* Configure PFx pins in Alternate function mode */   GPIOF->MODER   = 0xAA000AAA;/* Configure PFx pins speed to 100 MHz */ GPIOF->OSPEEDR = 0xFF000FFF;/* Configure PFx pins Output type to push-pull */  GPIOF->OTYPER  = 0x00000000;/* No pull-up, pull-down for PFx pins */ GPIOF->PUPDR   = 0x00000000;/* Connect PGx pins to FMC Alternate function */GPIOG->AFR[0]  = 0x00CCCCCC;GPIOG->AFR[1]  = 0x00000C00;/* Configure PGx pins in Alternate function mode */ GPIOG->MODER   = 0x00200AAA;/* Configure PGx pins speed to 100 MHz */ GPIOG->OSPEEDR = 0x000C03FF;/* Configure PGx pins Output type to push-pull */  GPIOG->OTYPER  = 0x00000000;/* No pull-up, pull-down for PGx pins */ GPIOG->PUPDR   = 0x00000000;/*-- FMC/FSMC Configuration --------------------------------------------------*//* Enable the FMC/FSMC interface clock */RCC->AHB3ENR         |= 0x00000001;

第二部分FSMC配置:

#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)\|| defined(STM32F412Zx) || defined(STM32F412Vx)/* Delay after an RCC peripheral clock enabling */tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);/* Configure and enable Bank1_SRAM2 */FSMC_Bank1->BTCR[4]  = 0x00001011;FSMC_Bank1->BTCR[5]  = 0x00000201;FSMC_Bank1E->BWTR[4] = 0x0FFFFFFF;

需要注意的是,我是19条地址线,16条数据线,即地址为19位,数据位为16位,如果不同自己需要修改对应寄存器,包括引脚部分配置,最好能百度下这些寄存器意义,然后对照电路图设置即可。

到这步就成功了,可以写个程序验证往对应RAM地址写数据是否成功或者对应外设运行在该段RAM中是否能初始化成功,能正常使用(我自己的使用体验的话,初始化不成功,连main函数都进入不了就会跑飞)。

--------------------------------------------------------------------------------------------------------------------------------

隔断一下,聊一下1.使用库函数写初始化函数再在启动函数中调用的方式,还有2.在main函数中初始化FSMC 这2种方式。

第一种方式,如果使用官方库而不是HAL库,是可以运行的,我使用正点原子官方库例程修改后可以运行,但是使用HAL库,直接无法进入main程序跑飞,取消勾选第一张图配置,可以正常运行,但各项外设初始化无法成功,实际上无法使用。

第二种方式,只能是不作为默认RAM使用时这样配置。

至于这2种情况是为什么,个人时间和能力有限,没有去深究

STM32F407 HAL库外扩SRAM作为默认RAM使用相关推荐

  1. 物联网ARM开发- 5协议 FSMC控制器外扩SRAM存储器

    前言:STM32F407ZGT6 自带了 192K 字节的 SRAM,对一般应用来说,已经足够了,不过在一 些对内存要求高的场合,STM32F4 自带的这些内存就不够用了.比如跑算法或者跑 GUI 等 ...

  2. 在MM32F5微控制器上使用外扩SRAM作为主内存

    在MM32F5微控制器上使用外扩SRAM作为主内存 苏勇,2022年8月 文章目录 在MM32F5微控制器上使用外扩SRAM作为主内存 引言 硬件电路 软件设计 使用bootloader初始化硬件环境 ...

  3. FSMC外设接口来外扩SRAM芯片、flash芯片

    1.STM32学习笔记-FSMC外扩SRAM_行之无边的博客-CSDN博客_stm32外扩sram STM32控制器芯片内部有一定大小的SRAM及FLASH作为内存和程序存储空间,但当程序较大,内存和 ...

  4. DSP实现外扩SRAM

    问题描述:DSP在物理上将程序空间和数据空间整合成4M*16位的空间,但是在其上实现FFT算法时,运算数据量太大,内部RAM不够,这时需要通过外扩SRAM的方法来实现. 注意: 在nonBIOS情况下 ...

  5. DSP外扩SRAM的应用测试心得体会

    原文地址:[http://www.51hei.com/bbs/dpj-32468-1.html] DSP的硬件测试说明: 平台说明: 图1-1  Code Composer Studio 6.0.0. ...

  6. 32位MCU外扩SRAM芯片VTI7064MSME

    32位单片机为用户提供了丰富的选择,可适用于工业控制.智能家电.建筑安防.医疗设备以及消费类电子产品等多方位嵌入式系统设计.MCU通常是基于SRAM和闪存的混合使用,MCU一般情况下配置有1~2MB双 ...

  7. 可作为MCU外扩SRAM芯片的型号推荐

    世界上最早的全电子化存储器是1947年诞生的,其原理是用阴极射线管在屏幕表面上留下记录数据的"点".从那时起,计算机内存开始使用磁存储技术并经历了数代演变,相关系统包括磁鼓存储器. ...

  8. STM32F407外扩SRAM国产EMI7064

    现在的电子系统应用,对SRAM要求越来越高,单片机或ARM内部的RAM越来越不够用.当电脑运行比较卡的时候,我们可以通过给电脑加装内存条来改善电脑的性能.我们可以给单片机外加和内存条效果一样的SRAM ...

  9. STM32外扩SRAM芯片IS62wv51216兼容替换

    STM32MCU一般情况下配置有1~2MB双块Flash存储器和256KB SRAM,在某些应用设计中会出现内置RAM不足的情况,需要对STM32单片机进行外扩RAM的处理,可以选择更换更高RAM容量 ...

最新文章

  1. 关于Visual C#装箱与拆箱的研究
  2. python机器学习包
  3. python2.7中文有限制么_python2.7
  4. linux怎么还原bak文件,Linux restore命令:还原dump操作备份下的文件、目录或分区...
  5. 算法——动态规划算法求解字符串的编辑距离
  6. 【性能优化】如何让APK瘦成一道闪电
  7. Python实现将一个长度为n的列表划分 ,每个子列表中包含m个元素
  8. hp服务器bios检测硬盘接口,惠普工作站UEFI BIOS如何检测硬盘
  9. 2021厦门LED照明产业展览会
  10. zf:tf7: RNN—古诗词
  11. iOS CMMotionManager之加速计、陀螺仪
  12. HarmonyOS无法添加outlook日历(报错该账户名称已被使用)
  13. 计算机命令提示符开热点,win10电脑可以使用cmd命令创建wifi热点吗
  14. npm i 命令安装失败提示:npm WARN read-shrinkwrap,解决方法
  15. NPDP第七章:产品生命周期管理
  16. 精灵随着鼠标的移动而移动
  17. 高等数学Mathematica实验题——费马素数猜想(Fn=2^(2^n)+1为素数)的证伪(Verification of Fermat's Prime Number Function)
  18. 虚拟服务器安装ibm mq,IBM MQ 客户端查看服务端消息的工具 WMQTool
  19. conda env create -f environment.yml 出现Package XX conflicts for:
  20. 开关电源计算机仿真技术pdf,求开关电源的计算机仿真技术?

热门文章

  1. 高中数学必修5_数列专题冲刺985-逆袭高考数学
  2. ModelScope--人像卡通化、人像美肤
  3. onethink后台一直提示验证码不正确,或提示用户名不存在或被禁用
  4. 如何安装和配置Zabbix以安全监控CentOS 7上的远程服务器
  5. Signal QQmlEngine::quit() emitted, but no receivers connected to handle it.
  6. 教你用手机NFC代替小区门禁卡,不用担心被锁门外了!
  7. ADN: Artifact Disentanglement Network forUnsupervised Metal Artifact Reduction--无监督的CT重建
  8. 预想《汉语考级卷子》zz
  9. python 来源介绍
  10. 程序猿的福音——猿如意使用有感