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

分享STM32F407如何让外挂SRAM应用

[复制链接]
STMCU-管管 发布时间:2021-5-10 17:03
硬件方面:IS62WV51216( K0 `& [" C/ ~% y7 K$ j. }5 s1 D
软件方面:MDK' O& [! N# d! E8 e
# ?; t  ^- l. a7 [# \0 D7 B* V
修改startup_xxx.s 堆栈地址并在__main函数前初始化FSMC7 E) S$ l" L4 z! u3 N% u0 f4 A! P+ D
修改.sct文件(分散加载),添加外部SRAM的使用空间及大小。
! C$ u5 W/ }, A8 u+ O* T+ U# a具体步骤如下:
5 N. `+ E" t6 n; Y; t* T
  1. //startup_stm32f407xx.s部分$ X! }8 z+ Z% X7 W. m1 L  K
  2. ; Vector Table Mapped to Address 0 at Reset. u4 z6 z$ ^, K9 s# N, q: O/ K
  3. AREA    RESET, DATA, READONLY0 k: ^8 X# v) \. Q) i( {& Z
  4.                 EXPORT  __Vectors5 v) S" }' X6 g0 `* E/ X' J
  5.                 EXPORT  __Vectors_End; Q; ?! i0 b$ f7 i6 {* g3 F
  6.                 EXPORT  __Vectors_Size
    9 V1 s, U. b3 m  U5 W
  7.                
    9 W6 p* K$ Z! k6 r& ^6 C
  8. __Vectors       DCD     0x20000100               ; Top of Stack0 D7 d0 W8 J8 M
  9.                 DCD     Reset_Handler              ; Reset Handler- j7 v2 w# G; x  L# i* p# _0 D
  10.                 DCD     NMI_Handler                ; NMI Handler
    5 T; f( A1 R0 M2 N% N  w5 j+ M& N
  11.                 ...) f. X1 z% ^" \2 z% ]% s( c
  12.                 ...& t2 W# U8 V  V) G* G5 y+ d2 ^9 F
  13.                 ...+ I* ~, D+ g  t
  14.                 IMPORT  SystemInit              
    & g! |* _2 o& D6 c+ `
  15.                 IMPORT  FSMC_SRAM_Init
    3 h: ?  [. k) a0 M# Y0 E3 v1 Q/ f! z
  16.                 IMPORT  __main& J! R7 f4 O" g
  17.                 LDR     R0, =SystemInit
    $ B4 A' j. V) T; b
  18.                 BLX     R0$ O. _1 }- |$ B3 R6 Y" G5 C! G% d
  19.                 LDR     R0, =FSMC_SRAM_Init
    ' e6 i0 }- R6 U& {
  20.                 BLX     R0                 
    ; _& s" c" z2 S. l# V$ f
  21.                 LDR     R0, =__main0 @: P* t9 ^' b% L
  22.                 BX      R0
    ) b0 d- J2 G  E/ Z. t
  23.                 ENDP2 O* j& d/ S/ B1 O/ v
复制代码
0x20000100 替换 __initial_sp
4 n! i4 G) L1 J' g" T* r/ a添加IMPORT FSMC_SRAM_Init
( r0 x" A* S" w6 m添加LDR R0, =FSMC_SRAM_Init和LX R0。敲黑板这两句必须在__main前面
/ \; H, o/ C9 i* Q. l这里的FSMC_SRAM_Init函数是使用正点原子探索者407寄存器版本的,里面所使用的变量只能是创建在内部SRAM哦,一旦用了外部SRAM就会触发HardFault,后果你懂的。所以尽量使用寄存器来初始化配置FSMC。
) c6 n' n4 G9 N) g; g& D8 t( u  [
' M* _  d6 W1 @7 S2 L* b
接下来就是第二部分,配置内存分配空间9 }% y6 A+ E4 e1 b7 c2 N
2.png
按上图配置,要注意的是default一定要勾选,不然内存是不会分配到外部SRAM的。当然了你用__atrribute__来指定分配也是可以用的,但是有一个问题就是你不能初始化赋值,管你是非零还是零赋值,通通没用,原因何在,我也不知道。希望高人指点一二
9 Y2 `7 T* A& k+ V6 Q' J* k# U8 A: }+ m0 q; i$ ?6 R) W% w- l
3 q  F5 Y: B5 Z! J  K3 F" B4 O
之后就可以愉快的使用外部SRAM啦。5 y* j6 w  `3 n, t' |
编写代码的时候使用方式与内部SRAM无异。
9 e4 U8 X1 q7 j9 n) Q8 `不过速度嘛…肯定比使用内部SRAM要慢的,毕竟FSMC操作外部SRAM的速度就那么大。0 K) ?" U5 ]6 `* ]4 |

# f# z4 v9 u8 V. ^6 u' H; @
' i' d2 l6 I0 M
最后附上我改写后的纯寄存器版本的FSMC_SRAM_Init
% ~3 [3 B% i1 w$ {( y经测试能用在STM32F407上,其他芯片请自行修改。! O/ O; p2 \1 I' V
  1. , e# o8 D+ Z4 |: R2 j+ l( T1 W
复制代码
  1. void FSMC_SRAM_Init(void)
    . x# c3 |4 s$ j7 O  @. j5 t
  2. {
    0 d- X7 t2 b; ?+ j0 F" n/ y% Y
  3.         /*-- GPIOs Configuration -----------------------------------------------------*/4 J5 l% ^' X) w1 \6 ?/ Z
  4.         /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */1 _! S) _- M- K2 W
  5.         RCC->AHB1ENR   |= 0x00000078;2 \6 b8 V& i7 a6 M
  6.        
    8 n4 @$ h* M. J6 W8 q
  7.         //PD0,1,4,5,8~15    100M AF OUT_PP UP
    0 ~9 q- b* K6 ~# L( n  E
  8.         //PE0,1,7~15        100M AF OUT_PP UP* `' t8 b% T/ y6 w/ e
  9.         //PF0~5,12~15       100M AF OUT_PP UP( z3 N% Q$ D' L+ J' q4 d
  10.         //PG0~5,10          100M AF OUT_PP UP. O% \7 l8 G, _/ ~
  11.         % {3 \3 b$ @/ a* S) R4 _7 W
  12.         /* Connect PDx pins to FMC Alternate function */! x3 q2 D* p% z
  13.         GPIOD->AFR[0]  = 0x00CC00CC;. k) _( n7 T* c6 j& @6 E
  14.         GPIOD->AFR[1]  = 0xCCCCCCCC;
    1 V) P9 T* x. i' L
  15.         /* Configure PDx pins in Alternate function mode */  # Y/ d; X6 Y6 x
  16.         GPIOD->MODER   = 0xAAAA0A0A;" @+ t  C( c: s) [, }
  17.         /* Configure PDx pins speed to 100 MHz */  
    % A2 T, F* J0 N: a; z
  18.         GPIOD->OSPEEDR = 0xFFFF0F0F;9 ^2 h7 J) g  e% ?4 m+ O5 a
  19.         /* Configure PDx pins Output type to push-pull */  
    " q' @% d$ }8 q% d* \1 `
  20.         GPIOD->OTYPER  = 0x00000000;
    " i+ _1 P. i5 d) J# Y/ n
  21.         /* pull-up for PDx pins */ & q8 v. C$ [3 G3 f9 p6 R! v6 G6 B
  22.         GPIOD->PUPDR   = 0x55550505;/ M: H# ]4 j2 Y+ ~% u
  23.        
    % U4 A: X; P( g; C1 F1 l
  24.         /* Connect PEx pins to FMC Alternate function */1 F- @; D9 E% K# H, R9 ^% x) S8 H7 \& ~
  25.         GPIOE->AFR[0]  = 0xC00000CC;7 J; S4 ?- i# f- @6 y
  26.         GPIOE->AFR[1]  = 0xCCCCCCCC;
    ; n# k6 x% z% m  t, X1 T
  27.         /* Configure PEx pins in Alternate function mode */ 8 i4 U& a! U3 U, t2 {
  28.         GPIOE->MODER   = 0xAAAA800A;& V, A$ B: v7 t2 ~
  29.         /* Configure PEx pins speed to 100 MHz */
    3 P4 \% f! j) W# u
  30.         GPIOE->OSPEEDR = 0xFFFFC00F;  `5 j+ i8 k# b
  31.         /* Configure PEx pins Output type to push-pull */  
    7 o, w' I: ^; U7 s1 |( [+ p
  32.         GPIOE->OTYPER  = 0x00000000;! U1 C- Z+ `+ K
  33.         /* pull-up for PEx pins */ 6 ^  m' c# `1 |7 w" y0 H
  34.         GPIOE->PUPDR   = 0x55554005;
    : C0 u* C( a8 C0 U
  35.         2 i# B& ?/ ~1 V3 f+ ]
  36.         /* Connect PFx pins to FMC Alternate function */
    3 k; S8 C2 W; m5 X: M8 c5 ]
  37.         GPIOF->AFR[0]  = 0x00CCCCCC;
    1 @! }6 T3 }' y8 Z* P7 ^7 M' r
  38.         GPIOF->AFR[1]  = 0xCCCC0000;# B' X7 W  L( K; |$ s2 z
  39.         /* Configure PFx pins in Alternate function mode */   
    9 S1 W; C3 Q7 R' b7 H+ w, {1 {/ S
  40.         GPIOF->MODER   = 0xAA000AAA;
    : o+ X1 t$ _4 E1 e$ h9 r/ j4 y8 w& x
  41.         /* Configure PFx pins speed to 100 MHz */ $ |4 U, d( h4 |" g; G+ i
  42.         GPIOF->OSPEEDR = 0xFF000FFF;- w+ k. h( O) u4 Z
  43.         /* Configure PFx pins Output type to push-pull */  ( g  d+ |6 i1 Q* {8 y8 G5 h5 u
  44.         GPIOF->OTYPER  = 0x00000000;
    / X! O4 K6 `# B. T
  45.         /* pull-up for PFx pins */ - x3 \( P% A3 _# R" I
  46.         GPIOF->PUPDR   = 0x55000555;
    - s, g- r% i! `# b" Q$ K, m
  47.         % F5 ~/ R* S% d' f
  48.         /* Connect PGx pins to FMC Alternate function */8 r7 e0 a& v/ ]3 G& R% k8 O, J! ]
  49.         GPIOG->AFR[0]  = 0x00CCCCCC;# D9 L4 ^( h  r0 `
  50.         GPIOG->AFR[1]  = 0x00000C00;
    : X2 U' ^1 N2 J( B& H
  51.         /* Configure PGx pins in Alternate function mode */
    7 Y- A1 @: u; X7 a
  52.         GPIOG->MODER   = 0x00200AAA;  N8 s: o1 N% j' B* O- d# h
  53.         /* Configure PGx pins speed to 100 MHz */
    ' }- f# i; h# L# l2 s: H6 N# h6 G. U
  54.         GPIOG->OSPEEDR = 0x00300FFF;
    ) V1 b7 z9 X% ?3 g! U8 a
  55.         /* Configure PGx pins Output type to push-pull */  ! b( V1 Q  ?  E. i. r' u) g& a# m
  56.         GPIOG->OTYPER  = 0x00000000;  P2 W' c4 |- w4 o7 S( V; W
  57.         /* pull-up for PGx pins */ % e) m" y+ r3 d( }3 x3 d" j. H
  58.         GPIOG->PUPDR   = 0x00100555;2 w/ Q4 }) L% _' }- W8 s
  59.        
    6 E7 }* r$ U9 M9 A7 X
  60.         /*-- FMC/FSMC Configuration --------------------------------------------------*/1 i, @8 R; f' v9 _* x) `
  61.         /* Enable the FMC/FSMC interface clock */" m' q! {7 U$ ^3 w( v$ N
  62.         RCC->AHB3ENR         |= 0x00000001;
    " O( x2 [, l. z- T
  63.        
    " {6 t; S# s7 \' g! y, T; \/ D
  64.         //寄存器清零
    0 j8 v3 h! y/ x8 d% M# T
  65.         //bank1有NE1~4,每一个有一个BCR+TCR,所以总共八个寄存器。
    8 q. m3 `& ~: _  C- [; J
  66.         //这里我们使用NE3 ,也就对应BTCR[4],[5]。        
    4 D" X! {" \6 P& \; P5 f! L1 q
  67.         FSMC_Bank1->BTCR[4]=0X00000000;$ z! R4 t, E8 I4 A! E  ^; i
  68.         FSMC_Bank1->BTCR[5]=0X00000000;
    4 ]0 H6 f: P6 C& S5 Z" l
  69.         FSMC_Bank1E->BWTR[4]=0X00000000;" i% ?/ Z0 S+ ^( d
  70.         //操作BCR寄存器 使用异步模式,模式A(读写共用一个时序寄存器)* `% O! p. f% I* B3 l
  71.         //BTCR[偶数]:BCR寄存器;BTCR[奇数]:BTR寄存器
    & x: y; W0 N) }* o5 ^% j
  72.         FSMC_Bank1->BTCR[4]|=1<<12;//存储器写使能
    5 W  ]$ t' ^" W, l
  73.         FSMC_Bank1->BTCR[4]|=1<<4; //存储器数据宽度为16bit      8 p( c$ V# Y. I  }" w+ _! X
  74.         //操作BTR寄存器   (HCLK=168M, 1个HCLK=6ns       9 `! s" p# u! n. ]! d
  75.         FSMC_Bank1->BTCR[5]|=8<<8; //数据保持时间(DATAST)为9个HCLK 6*9=54ns    6 w* r- I- q* A& q8 c
  76.         FSMC_Bank1->BTCR[5]|=0<<4; //地址保持时间(ADDHLD)未用到     5 }; b! a0 E# o1 W$ ]
  77.         FSMC_Bank1->BTCR[5]|=0<<0; //地址建立时间(ADDSET)为0个HCLK 0ns    + |* B. u" `  Y* w5 }
  78.         //闪存写时序寄存器  : X( @+ S: K& b6 d+ x6 J, ?  G
  79.         FSMC_Bank1E->BWTR[4]=0x0FFFFFFF;//默认值* d1 d+ A" K. H$ i* ]( }1 Q; w0 T
  80.         //使能BANK1区域3$ P9 Z) \, `8 \# K
  81.         FSMC_Bank1->BTCR[4]|=1<<0;
    . `. K' o3 ~1 Y* W" _6 ?) |7 f8 h
  82. }- X6 H! i4 {+ S7 @; d0 v- r; u: f+ c
  83. ————————————————
    8 j+ P! `3 `; J) v% r* |) Z
复制代码

  i% T0 w6 C! [7 v, K$ z* P4 c
收藏 1 评论0 发布时间:2021-5-10 17:03

举报

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