你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

分享STM32F407如何让外挂SRAM应用

[复制链接]
STMCU-管管 发布时间:2021-5-10 17:03
硬件方面:IS62WV51216
软件方面:MDK

修改startup_xxx.s 堆栈地址并在__main函数前初始化FSMC
修改.sct文件(分散加载),添加外部SRAM的使用空间及大小。
具体步骤如下:
  1. //startup_stm32f407xx.s部分
  2. ; Vector Table Mapped to Address 0 at Reset
  3. AREA    RESET, DATA, READONLY
  4.                 EXPORT  __Vectors
  5.                 EXPORT  __Vectors_End
  6.                 EXPORT  __Vectors_Size
  7.                
  8. __Vectors       DCD     0x20000100               ; Top of Stack
  9.                 DCD     Reset_Handler              ; Reset Handler
  10.                 DCD     NMI_Handler                ; NMI Handler
  11.                 ...
  12.                 ...
  13.                 ...
  14.                 IMPORT  SystemInit              
  15.                 IMPORT  FSMC_SRAM_Init
  16.                 IMPORT  __main
  17.                 LDR     R0, =SystemInit
  18.                 BLX     R0
  19.                 LDR     R0, =FSMC_SRAM_Init
  20.                 BLX     R0                 
  21.                 LDR     R0, =__main
  22.                 BX      R0
  23.                 ENDP
复制代码
0x20000100 替换 __initial_sp
添加IMPORT FSMC_SRAM_Init
添加LDR R0, =FSMC_SRAM_Init和LX R0。敲黑板这两句必须在__main前面
这里的FSMC_SRAM_Init函数是使用正点原子探索者407寄存器版本的,里面所使用的变量只能是创建在内部SRAM哦,一旦用了外部SRAM就会触发HardFault,后果你懂的。所以尽量使用寄存器来初始化配置FSMC。


接下来就是第二部分,配置内存分配空间
2.png
按上图配置,要注意的是default一定要勾选,不然内存是不会分配到外部SRAM的。当然了你用__atrribute__来指定分配也是可以用的,但是有一个问题就是你不能初始化赋值,管你是非零还是零赋值,通通没用,原因何在,我也不知道。希望高人指点一二


之后就可以愉快的使用外部SRAM啦。
编写代码的时候使用方式与内部SRAM无异。
不过速度嘛…肯定比使用内部SRAM要慢的,毕竟FSMC操作外部SRAM的速度就那么大。


最后附上我改写后的纯寄存器版本的FSMC_SRAM_Init
经测试能用在STM32F407上,其他芯片请自行修改。

复制代码
  1. void FSMC_SRAM_Init(void)
  2. {
  3.         /*-- GPIOs Configuration -----------------------------------------------------*/
  4.         /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */
  5.         RCC->AHB1ENR   |= 0x00000078;
  6.        
  7.         //PD0,1,4,5,8~15    100M AF OUT_PP UP
  8.         //PE0,1,7~15        100M AF OUT_PP UP
  9.         //PF0~5,12~15       100M AF OUT_PP UP
  10.         //PG0~5,10          100M AF OUT_PP UP
  11.        
  12.         /* Connect PDx pins to FMC Alternate function */
  13.         GPIOD->AFR[0]  = 0x00CC00CC;
  14.         GPIOD->AFR[1]  = 0xCCCCCCCC;
  15.         /* Configure PDx pins in Alternate function mode */  
  16.         GPIOD->MODER   = 0xAAAA0A0A;
  17.         /* Configure PDx pins speed to 100 MHz */  
  18.         GPIOD->OSPEEDR = 0xFFFF0F0F;
  19.         /* Configure PDx pins Output type to push-pull */  
  20.         GPIOD->OTYPER  = 0x00000000;
  21.         /* pull-up for PDx pins */
  22.         GPIOD->PUPDR   = 0x55550505;
  23.        
  24.         /* Connect PEx pins to FMC Alternate function */
  25.         GPIOE->AFR[0]  = 0xC00000CC;
  26.         GPIOE->AFR[1]  = 0xCCCCCCCC;
  27.         /* Configure PEx pins in Alternate function mode */
  28.         GPIOE->MODER   = 0xAAAA800A;
  29.         /* Configure PEx pins speed to 100 MHz */
  30.         GPIOE->OSPEEDR = 0xFFFFC00F;
  31.         /* Configure PEx pins Output type to push-pull */  
  32.         GPIOE->OTYPER  = 0x00000000;
  33.         /* pull-up for PEx pins */
  34.         GPIOE->PUPDR   = 0x55554005;
  35.        
  36.         /* Connect PFx pins to FMC Alternate function */
  37.         GPIOF->AFR[0]  = 0x00CCCCCC;
  38.         GPIOF->AFR[1]  = 0xCCCC0000;
  39.         /* Configure PFx pins in Alternate function mode */   
  40.         GPIOF->MODER   = 0xAA000AAA;
  41.         /* Configure PFx pins speed to 100 MHz */
  42.         GPIOF->OSPEEDR = 0xFF000FFF;
  43.         /* Configure PFx pins Output type to push-pull */  
  44.         GPIOF->OTYPER  = 0x00000000;
  45.         /* pull-up for PFx pins */
  46.         GPIOF->PUPDR   = 0x55000555;
  47.        
  48.         /* Connect PGx pins to FMC Alternate function */
  49.         GPIOG->AFR[0]  = 0x00CCCCCC;
  50.         GPIOG->AFR[1]  = 0x00000C00;
  51.         /* Configure PGx pins in Alternate function mode */
  52.         GPIOG->MODER   = 0x00200AAA;
  53.         /* Configure PGx pins speed to 100 MHz */
  54.         GPIOG->OSPEEDR = 0x00300FFF;
  55.         /* Configure PGx pins Output type to push-pull */  
  56.         GPIOG->OTYPER  = 0x00000000;
  57.         /* pull-up for PGx pins */
  58.         GPIOG->PUPDR   = 0x00100555;
  59.        
  60.         /*-- FMC/FSMC Configuration --------------------------------------------------*/
  61.         /* Enable the FMC/FSMC interface clock */
  62.         RCC->AHB3ENR         |= 0x00000001;
  63.        
  64.         //寄存器清零
  65.         //bank1有NE1~4,每一个有一个BCR+TCR,所以总共八个寄存器。
  66.         //这里我们使用NE3 ,也就对应BTCR[4],[5]。        
  67.         FSMC_Bank1->BTCR[4]=0X00000000;
  68.         FSMC_Bank1->BTCR[5]=0X00000000;
  69.         FSMC_Bank1E->BWTR[4]=0X00000000;
  70.         //操作BCR寄存器 使用异步模式,模式A(读写共用一个时序寄存器)
  71.         //BTCR[偶数]:BCR寄存器;BTCR[奇数]:BTR寄存器
  72.         FSMC_Bank1->BTCR[4]|=1<<12;//存储器写使能
  73.         FSMC_Bank1->BTCR[4]|=1<<4; //存储器数据宽度为16bit      
  74.         //操作BTR寄存器   (HCLK=168M, 1个HCLK=6ns      
  75.         FSMC_Bank1->BTCR[5]|=8<<8; //数据保持时间(DATAST)为9个HCLK 6*9=54ns   
  76.         FSMC_Bank1->BTCR[5]|=0<<4; //地址保持时间(ADDHLD)未用到     
  77.         FSMC_Bank1->BTCR[5]|=0<<0; //地址建立时间(ADDSET)为0个HCLK 0ns   
  78.         //闪存写时序寄存器  
  79.         FSMC_Bank1E->BWTR[4]=0x0FFFFFFF;//默认值
  80.         //使能BANK1区域3
  81.         FSMC_Bank1->BTCR[4]|=1<<0;
  82. }
  83. ————————————————
复制代码

收藏 1 评论0 发布时间:2021-5-10 17:03

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版