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

分享STM32F407如何让外挂SRAM应用

[复制链接]
STMCU-管管 发布时间:2021-5-10 17:03
硬件方面:IS62WV512163 R8 e2 g# D, Y! J; Y
软件方面:MDK/ T9 R7 Z, y. H$ F5 k8 a2 U

: p0 R; d, Z% b; q修改startup_xxx.s 堆栈地址并在__main函数前初始化FSMC
, [* b% H' U9 I3 p- G1 ~. s修改.sct文件(分散加载),添加外部SRAM的使用空间及大小。1 G" U8 N7 y, i& B  Y. |
具体步骤如下:
% E' V+ D5 D# Z$ Q7 v
  1. //startup_stm32f407xx.s部分9 |5 I) B+ [2 t0 k
  2. ; Vector Table Mapped to Address 0 at Reset
    ) `! |: f2 L" f& W" S+ Z2 A
  3. AREA    RESET, DATA, READONLY
    2 Y  g* }1 ]7 t1 \- `! ?
  4.                 EXPORT  __Vectors
    + a: X; @# l( [! |
  5.                 EXPORT  __Vectors_End
    0 d* G# H- h& H+ ^! K  }7 D
  6.                 EXPORT  __Vectors_Size8 f! a+ M" k5 L7 G
  7.                
    ! P. p5 m; H; Z5 C1 W
  8. __Vectors       DCD     0x20000100               ; Top of Stack
    ( v$ E( V9 v* r! A6 Z
  9.                 DCD     Reset_Handler              ; Reset Handler
    6 S! F9 p9 g/ f3 T
  10.                 DCD     NMI_Handler                ; NMI Handler4 j& ^7 ]/ D# ^$ e+ W! \. X  }, z
  11.                 ..." @5 k0 W8 S4 F  M. v
  12.                 ...) [: G3 W- e( d/ L
  13.                 ...
    & U- m2 D, J/ p% J; f
  14.                 IMPORT  SystemInit              
    , h; T9 q6 p4 f0 F
  15.                 IMPORT  FSMC_SRAM_Init( K  Q. l0 E9 x
  16.                 IMPORT  __main! ^7 W- q  f9 J# S; }1 y) M5 \3 e
  17.                 LDR     R0, =SystemInit! S5 f( N5 H$ B- L- u: m
  18.                 BLX     R02 C/ k8 L: T" Q8 ]
  19.                 LDR     R0, =FSMC_SRAM_Init
    1 l1 O; P% H2 x! Q# ?
  20.                 BLX     R0                 7 P$ X  W( w" E  l+ S! w
  21.                 LDR     R0, =__main5 c' b- D' \$ l# J/ r
  22.                 BX      R0& n$ P5 Q+ ^' l3 |+ ]' m
  23.                 ENDP
    * J0 q4 t( b( j+ I* E
复制代码
0x20000100 替换 __initial_sp# z( g6 W" U; ]
添加IMPORT FSMC_SRAM_Init
3 {5 @- W# s' }) A/ Y! d2 Y0 x' W添加LDR R0, =FSMC_SRAM_Init和LX R0。敲黑板这两句必须在__main前面/ e  l( V0 D/ ]% K" b7 k
这里的FSMC_SRAM_Init函数是使用正点原子探索者407寄存器版本的,里面所使用的变量只能是创建在内部SRAM哦,一旦用了外部SRAM就会触发HardFault,后果你懂的。所以尽量使用寄存器来初始化配置FSMC。, ]3 d; D7 Z( c7 J
* O% D; I( c- w5 `

/ x) q  |+ f; E% |7 c2 {  f接下来就是第二部分,配置内存分配空间
* I# s; K5 G% s1 w+ `
2.png
按上图配置,要注意的是default一定要勾选,不然内存是不会分配到外部SRAM的。当然了你用__atrribute__来指定分配也是可以用的,但是有一个问题就是你不能初始化赋值,管你是非零还是零赋值,通通没用,原因何在,我也不知道。希望高人指点一二
; U  K( [) J* h0 I3 m1 N% U2 y2 |% `4 Q3 [+ Y

: M: W( g3 I" h之后就可以愉快的使用外部SRAM啦。+ \3 y3 e2 J4 B) k( Y& y( }
编写代码的时候使用方式与内部SRAM无异。
- _. c" F; O! J不过速度嘛…肯定比使用内部SRAM要慢的,毕竟FSMC操作外部SRAM的速度就那么大。
5 _, k7 F6 n. A" M' ?$ X$ r! B- ?* E

3 U5 V. W# [. Z/ [( y最后附上我改写后的纯寄存器版本的FSMC_SRAM_Init6 j  g8 h9 l  A
经测试能用在STM32F407上,其他芯片请自行修改。4 G% E  d1 x: j( ^
  1. # O5 w$ _9 V. I0 B
复制代码
  1. void FSMC_SRAM_Init(void)' o! K3 {( W" S; q$ ~/ @0 x
  2. {9 |1 I5 s, O: T7 Q
  3.         /*-- GPIOs Configuration -----------------------------------------------------*/
    $ R2 l1 O' I: R- a
  4.         /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */
    8 m4 N. }7 X5 G" {: d& d  I* X- a
  5.         RCC->AHB1ENR   |= 0x00000078;* p0 y, K3 Q- A! {
  6.         " |/ W/ D8 [$ ]+ o# r% v
  7.         //PD0,1,4,5,8~15    100M AF OUT_PP UP
    7 T* m% i" J& ]% {, k, y  b
  8.         //PE0,1,7~15        100M AF OUT_PP UP
    1 P+ f$ U) j2 Q: q/ F
  9.         //PF0~5,12~15       100M AF OUT_PP UP$ `) P0 a1 a: X
  10.         //PG0~5,10          100M AF OUT_PP UP
    7 U. v% O4 s' q4 j
  11.        
    ! P- |: L9 f" L, g: E! r( k, z8 Z$ L
  12.         /* Connect PDx pins to FMC Alternate function */. ?: L4 v* J% `, \
  13.         GPIOD->AFR[0]  = 0x00CC00CC;; l0 l( k" Y7 }5 t3 l, P; e
  14.         GPIOD->AFR[1]  = 0xCCCCCCCC;
    # L& t0 X1 v* N* O
  15.         /* Configure PDx pins in Alternate function mode */  1 W3 s. m8 u1 y; `! {4 c; U7 W
  16.         GPIOD->MODER   = 0xAAAA0A0A;0 i: Y4 v8 d5 a8 I+ I. A
  17.         /* Configure PDx pins speed to 100 MHz */  
    & F7 b" n7 C: w7 ?5 k) N8 S( m) `" {
  18.         GPIOD->OSPEEDR = 0xFFFF0F0F;
    " P8 J! a1 N* s
  19.         /* Configure PDx pins Output type to push-pull */  % g9 [0 h  B6 S( D5 U
  20.         GPIOD->OTYPER  = 0x00000000;
    4 d8 i' R% [  A( I
  21.         /* pull-up for PDx pins */
    ' s3 a3 g3 o7 u, o
  22.         GPIOD->PUPDR   = 0x55550505;) n0 g4 p7 C) y6 Z( u! E
  23.         2 E0 c$ F# i, @6 q+ ~, c) G
  24.         /* Connect PEx pins to FMC Alternate function */
    + J5 g3 s3 W( l( U' w& k
  25.         GPIOE->AFR[0]  = 0xC00000CC;
    6 E7 U# a* Q- c0 O. m" r
  26.         GPIOE->AFR[1]  = 0xCCCCCCCC;( l" q3 V+ @' e7 S) f% `3 v
  27.         /* Configure PEx pins in Alternate function mode */
    ! Y. r& c2 v. _0 ]
  28.         GPIOE->MODER   = 0xAAAA800A;
      d' |! s3 ]& y1 v
  29.         /* Configure PEx pins speed to 100 MHz */
    1 l! u7 ^* x/ d, Z
  30.         GPIOE->OSPEEDR = 0xFFFFC00F;
    1 H! [4 n# d$ q4 k' t
  31.         /* Configure PEx pins Output type to push-pull */  6 E/ q9 X# x, b4 }
  32.         GPIOE->OTYPER  = 0x00000000;
    9 e" |  `: h  A9 d! c7 q0 b2 \
  33.         /* pull-up for PEx pins */
    + M% y# n& H& n9 J1 f% l- e/ \/ l
  34.         GPIOE->PUPDR   = 0x55554005;
    : ]$ i! T+ j; @1 W0 w4 u6 W
  35.         . T4 [) m/ e+ N) p
  36.         /* Connect PFx pins to FMC Alternate function */
    3 I# d8 s+ v* L6 x, B
  37.         GPIOF->AFR[0]  = 0x00CCCCCC;6 L9 H: m$ b' r' _5 |% @8 G: d, @
  38.         GPIOF->AFR[1]  = 0xCCCC0000;) J8 V" w2 R( m) D8 Z& s0 N$ f" _( y
  39.         /* Configure PFx pins in Alternate function mode */   
    , L% G( g8 ?( b+ e+ ?! u) Z2 @" o+ p. ^. s
  40.         GPIOF->MODER   = 0xAA000AAA;. `# r% u1 ~6 Q* a
  41.         /* Configure PFx pins speed to 100 MHz */ 3 Q5 j7 _% D* k/ O# w  e
  42.         GPIOF->OSPEEDR = 0xFF000FFF;$ i8 R- ]9 p4 Y, A1 ?- d
  43.         /* Configure PFx pins Output type to push-pull */  
    / E2 u% C9 Z: n6 I4 {
  44.         GPIOF->OTYPER  = 0x00000000;/ A, M* _3 A; X3 i
  45.         /* pull-up for PFx pins */
    $ J, v; {% @% X( U# V
  46.         GPIOF->PUPDR   = 0x55000555;" V$ D8 n( A1 f! V1 \& v
  47.        
    ! c! z8 F: j: x
  48.         /* Connect PGx pins to FMC Alternate function */
    ' m. l: U0 M8 X2 D, l. d
  49.         GPIOG->AFR[0]  = 0x00CCCCCC;
    6 Q  z8 d% {, R
  50.         GPIOG->AFR[1]  = 0x00000C00;
    $ s$ G# l! N" V) \: J6 s' T
  51.         /* Configure PGx pins in Alternate function mode */
    - j5 ~: J0 H" t' K0 [, T: [& M
  52.         GPIOG->MODER   = 0x00200AAA;
    ( V+ z) k& z  P' K
  53.         /* Configure PGx pins speed to 100 MHz */
    * g7 O6 A6 ^3 V5 f, ?
  54.         GPIOG->OSPEEDR = 0x00300FFF;' V5 P" f% S- p- L, ?) N7 z* U
  55.         /* Configure PGx pins Output type to push-pull */  
    / T) q) w0 J. ]5 \+ q' d! `& V2 L
  56.         GPIOG->OTYPER  = 0x00000000;
    8 }. N  \4 T$ N' `, V9 h- N
  57.         /* pull-up for PGx pins */ . M9 y0 K7 R8 J* }- p( R+ f& I
  58.         GPIOG->PUPDR   = 0x00100555;+ C* X7 C8 P1 y0 F) r
  59.        
    # S$ _$ Y) ?9 r
  60.         /*-- FMC/FSMC Configuration --------------------------------------------------*/
    ! C7 W$ L8 ?3 T
  61.         /* Enable the FMC/FSMC interface clock */4 ?- X# p1 e! n0 F# ]5 L5 N% Y  a
  62.         RCC->AHB3ENR         |= 0x00000001;6 @! `8 Z4 ?5 \% P
  63.         2 v9 b/ Y5 V4 [- u
  64.         //寄存器清零
    5 `+ j) ?- \8 N# R- o5 w
  65.         //bank1有NE1~4,每一个有一个BCR+TCR,所以总共八个寄存器。  ?- a4 ^3 Q: t& m' C
  66.         //这里我们使用NE3 ,也就对应BTCR[4],[5]。        - c9 |; {; L2 R9 B4 _: @% i" y$ H
  67.         FSMC_Bank1->BTCR[4]=0X00000000;
    1 p# V$ b7 v$ _& \% d" Q( U
  68.         FSMC_Bank1->BTCR[5]=0X00000000;$ f" Y+ r4 p0 O4 F, i6 _, v
  69.         FSMC_Bank1E->BWTR[4]=0X00000000;
    6 H3 |' _' w5 o9 e  h) Y
  70.         //操作BCR寄存器 使用异步模式,模式A(读写共用一个时序寄存器)5 o, w- R' t5 _' L# O
  71.         //BTCR[偶数]:BCR寄存器;BTCR[奇数]:BTR寄存器/ }3 @4 {8 L- z6 k& b* L* T
  72.         FSMC_Bank1->BTCR[4]|=1<<12;//存储器写使能, m5 R8 f# X5 [" y9 S7 g& m
  73.         FSMC_Bank1->BTCR[4]|=1<<4; //存储器数据宽度为16bit        `- L0 L0 W( P3 P( v$ }* M
  74.         //操作BTR寄存器   (HCLK=168M, 1个HCLK=6ns      
    , i3 J( t3 \0 E* F
  75.         FSMC_Bank1->BTCR[5]|=8<<8; //数据保持时间(DATAST)为9个HCLK 6*9=54ns    5 P. X( r) j' c$ `  m3 R7 q' J
  76.         FSMC_Bank1->BTCR[5]|=0<<4; //地址保持时间(ADDHLD)未用到     1 a! u  q  e1 Y% P7 X1 v- n
  77.         FSMC_Bank1->BTCR[5]|=0<<0; //地址建立时间(ADDSET)为0个HCLK 0ns   
      r; }$ X. ]& B5 K7 v
  78.         //闪存写时序寄存器  
    % ?6 G3 U- g1 {: Q9 w4 X
  79.         FSMC_Bank1E->BWTR[4]=0x0FFFFFFF;//默认值4 B( U: e* m& K/ |! d
  80.         //使能BANK1区域3. U9 B; p2 ]7 c: o
  81.         FSMC_Bank1->BTCR[4]|=1<<0;, p* y/ e- X) K! H
  82. }
    + t. S+ m( Q! H2 p
  83. ————————————————
    , w( {( f& L: C* o
复制代码

) {* y) G! ^1 ^, Z$ A7 x. F' I
收藏 1 评论0 发布时间:2021-5-10 17:03

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版