[STM32F4] STM32F407 HAL库外扩SRAM作为默认RAM使用

[复制链接]
1174|16
 楼主| 9dome猫 发表于 2022-12-24 14:21 | 显示全部楼层 |阅读模式
       项目使用STM32F407ZET6开发,但自带的RAM空间不够,所以需要外扩SRAM作为默认的RAM来使用,使用的SRAM是IS62WV51216BLL,19条地址线,16条数据线,使用的库为HAL库。

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

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

评论

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/zhanlve2/article/details/122192136 ———————————————— 版权声明:本文为CSDN博主「zhanlve2」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/zhanlve2/article/details/12219  发表于 2022-12-24 14:47
 楼主| 9dome猫 发表于 2022-12-24 14:26 | 显示全部楼层
那么我们需要先将DATA_IN_ExtSRAM添加到魔术棒C/C++选项的Define中,这样SystemInit才会调用SystemInit_ExtMemCtl函数

2466763a69bae9cd56.png

评论

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/zhanlve2/article/details/122192136 ———————————————— 版权声明:本文为CSDN博主「zhanlve2」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/zhanlve2/article/details/1  发表于 2022-12-24 14:45
 楼主| 9dome猫 发表于 2022-12-24 14:37 | 显示全部楼层
    下一步就是修改寄存器的配置,SystemInit_ExtMemCtl函数407部分FSMC的配置默认是NE2的。找到407部分(有2部分,一部分为引脚配置,一部分为FSMC配置,找到有defined(STM32F407xx)字样的代码部分就是)将寄存器配置修改为以下内容
  1. #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\
  2. || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
  3. || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx)

  4. #if defined(DATA_IN_ExtSRAM)
  5. /*-- GPIOs Configuration -----------------------------------------------------*/
  6.    /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */
  7.   RCC->AHB1ENR   |= 0x00000078;
  8.   /* Delay after an RCC peripheral clock enabling */
  9.   tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);
  10.   
  11.   /* Connect PDx pins to FMC Alternate function */
  12.   GPIOD->AFR[0]  = 0x00CC00CC;
  13.   GPIOD->AFR[1]  = 0xCCCCCCCC;
  14.   /* Configure PDx pins in Alternate function mode */  
  15.   GPIOD->MODER   = 0xAAAA0A0A;
  16.   /* Configure PDx pins speed to 100 MHz */  
  17.   GPIOD->OSPEEDR = 0xFFFF0F0F;
  18.   /* Configure PDx pins Output type to push-pull */  
  19.   GPIOD->OTYPER  = 0x00000000;
  20.   /* No pull-up, pull-down for PDx pins */
  21.   GPIOD->PUPDR   = 0x00000000;

  22.   /* Connect PEx pins to FMC Alternate function */
  23.   GPIOE->AFR[0]  = 0xC00000CC;
  24.   GPIOE->AFR[1]  = 0xCCCCCCCC;
  25.   /* Configure PEx pins in Alternate function mode */
  26.   GPIOE->MODER   = 0xAAAA800A;
  27.   /* Configure PEx pins speed to 100 MHz */
  28.   GPIOE->OSPEEDR = 0xFFFFC00F;
  29.   /* Configure PEx pins Output type to push-pull */  
  30.   GPIOE->OTYPER  = 0x00000000;
  31.   /* No pull-up, pull-down for PEx pins */
  32.   GPIOE->PUPDR   = 0x00000000;

  33.   /* Connect PFx pins to FMC Alternate function */
  34.   GPIOF->AFR[0]  = 0x00CCCCCC;
  35.   GPIOF->AFR[1]  = 0xCCCC0000;
  36.   /* Configure PFx pins in Alternate function mode */   
  37.   GPIOF->MODER   = 0xAA000AAA;
  38.   /* Configure PFx pins speed to 100 MHz */
  39.   GPIOF->OSPEEDR = 0xFF000FFF;
  40.   /* Configure PFx pins Output type to push-pull */  
  41.   GPIOF->OTYPER  = 0x00000000;
  42.   /* No pull-up, pull-down for PFx pins */
  43.   GPIOF->PUPDR   = 0x00000000;

  44.   /* Connect PGx pins to FMC Alternate function */
  45.   GPIOG->AFR[0]  = 0x00CCCCCC;
  46.   GPIOG->AFR[1]  = 0x00000C00;
  47.   /* Configure PGx pins in Alternate function mode */
  48.   GPIOG->MODER   = 0x00200AAA;
  49.   /* Configure PGx pins speed to 100 MHz */
  50.   GPIOG->OSPEEDR = 0x000C03FF;
  51.   /* Configure PGx pins Output type to push-pull */  
  52.   GPIOG->OTYPER  = 0x00000000;
  53.   /* No pull-up, pull-down for PGx pins */
  54.   GPIOG->PUPDR   = 0x00000000;
  55.   
  56. /*-- FMC/FSMC Configuration --------------------------------------------------*/
  57.   /* Enable the FMC/FSMC interface clock */
  58.   RCC->AHB3ENR         |= 0x00000001;
 楼主| 9dome猫 发表于 2022-12-24 14:41 | 显示全部楼层
第二部分FSMC配置:
  1. #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)\
  2.    || defined(STM32F412Zx) || defined(STM32F412Vx)
  3.   /* Delay after an RCC peripheral clock enabling */
  4.   tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);
  5.   /* Configure and enable Bank1_SRAM2 */
  6.   FSMC_Bank1->BTCR[4]  = 0x00001011;
  7.   FSMC_Bank1->BTCR[5]  = 0x00000201;
  8.   FSMC_Bank1E->BWTR[4] = 0x0FFFFFFF;
 楼主| 9dome猫 发表于 2022-12-24 14:43 | 显示全部楼层
    需要注意的是,我是19条地址线,16条数据线,即地址为19位,数据位为16位,如果不同自己需要修改对应寄存器,包括引脚部分配置,最好能百度下这些寄存器意义,然后对照电路图设置即可。

到这步就成功了,可以写个程序验证往对应RAM地址写数据是否成功或者对应外设运行在该段RAM中是否能初始化成功,能正常使用(我自己的使用体验的话,初始化不成功,连main函数都进入不了就会跑飞)。
 楼主| 9dome猫 发表于 2022-12-24 14:44 | 显示全部楼层
隔断一下,聊一下1.使用库函数写初始化函数再在启动函数中调用的方式,还有2.在main函数中初始化FSMC 这2种方式。

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

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

至于这2种情况是为什么,个人时间和能力有限,没有去深究
huangcunxiake 发表于 2022-12-25 17:35 | 显示全部楼层
HAL库是目前最好用的了。
Bowclad 发表于 2023-1-1 17:36 | 显示全部楼层
现在还有更接近底层的LL库
MessageRing 发表于 2023-1-3 13:43 | 显示全部楼层
还是标准库好用
AdaMaYun 发表于 2023-1-4 14:41 | 显示全部楼层
HAL库就是封装的比较猛,移植性比较强,标准库就是将寄存器封装好,移植性没有HAL好。HAL库最方便的就是可以用CUBEMX自动生成代码,动态的调用资源,不会出现地城配置上的冲突
ulystronglll 发表于 2023-1-6 14:36 | 显示全部楼层
这个ram的速度怎么样?              
sesefadou 发表于 2023-1-6 16:07 | 显示全部楼层
可以换成f411的              
fengm 发表于 2023-1-12 11:36 | 显示全部楼层
FSMC的接口的访问速度很一般。
alvpeg 发表于 2023-1-16 15:14 | 显示全部楼层
sram怎么移植代码过去?              
lzbf 发表于 2023-1-19 12:24 | 显示全部楼层
STM32F407怎么直接访问呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

142

主题

1593

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部