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

分享STM32F407如何让外挂SRAM应用

[复制链接]
STMCU-管管 发布时间:2021-5-10 17:03
硬件方面:IS62WV51216" _$ a  a9 G: ~' ?
软件方面:MDK& }& c+ \2 C" X/ z- e0 K; g

# M  ]3 O$ U% A9 y3 [修改startup_xxx.s 堆栈地址并在__main函数前初始化FSMC- ]( \! x8 D$ \
修改.sct文件(分散加载),添加外部SRAM的使用空间及大小。
7 a' K5 E5 M, m6 [具体步骤如下:0 R# P  `6 h, X0 X0 n; G
  1. //startup_stm32f407xx.s部分
    * {6 k9 l. B  L1 |! y4 z- a
  2. ; Vector Table Mapped to Address 0 at Reset
    4 h) X  k; D' [
  3. AREA    RESET, DATA, READONLY( t% e9 E. z6 p
  4.                 EXPORT  __Vectors
    " c! J  s3 m0 p8 k* Q& v' c( V
  5.                 EXPORT  __Vectors_End
    6 i( |- B1 S7 e2 X
  6.                 EXPORT  __Vectors_Size
    - g" B$ M& h  B( w6 T: Y
  7.                
    ) l7 e7 l3 Z) C/ W& i
  8. __Vectors       DCD     0x20000100               ; Top of Stack
    : _# A$ o9 M: k5 Y
  9.                 DCD     Reset_Handler              ; Reset Handler: F+ x4 U( ?0 X! ~) {! y
  10.                 DCD     NMI_Handler                ; NMI Handler
    7 E# O8 G% Q7 f3 k6 r
  11.                 ...
    9 H; i( i- r" l/ p* t8 U
  12.                 ...! B4 ?8 X- [, o% C8 k: }: a. z
  13.                 ...
    ' ]) k8 E' H4 _
  14.                 IMPORT  SystemInit              # B8 C4 G! i8 }, W
  15.                 IMPORT  FSMC_SRAM_Init
    7 e* }' R9 T2 ^3 e' t/ h( g
  16.                 IMPORT  __main
    1 Y* F2 U, j( p' ]9 _
  17.                 LDR     R0, =SystemInit8 }" I2 z) Q: }- C! ~
  18.                 BLX     R0. w0 n, R, j: G& [
  19.                 LDR     R0, =FSMC_SRAM_Init
    & {$ P! ^5 F& e, A' ]  j' e
  20.                 BLX     R0                 , q+ t5 m8 ]: ?* Z
  21.                 LDR     R0, =__main
    7 @/ R" v1 y7 G  M+ H& Y
  22.                 BX      R0- d1 V! T3 {# I1 Q8 V- l
  23.                 ENDP- n  V8 D! Y& v0 C1 F; s4 {
复制代码
0x20000100 替换 __initial_sp/ {( R4 c) [3 I5 }  V' Z
添加IMPORT FSMC_SRAM_Init
3 C7 J& }  i8 `9 b( q+ ~$ Z添加LDR R0, =FSMC_SRAM_Init和LX R0。敲黑板这两句必须在__main前面) B$ C* B* r- y
这里的FSMC_SRAM_Init函数是使用正点原子探索者407寄存器版本的,里面所使用的变量只能是创建在内部SRAM哦,一旦用了外部SRAM就会触发HardFault,后果你懂的。所以尽量使用寄存器来初始化配置FSMC。( V; }/ S2 {9 j% o6 ^: R, ?. J
- l$ t, w! n; s: y, K' E$ K. t
( Y  B* j" }. O7 R3 M( t8 {, S. z
接下来就是第二部分,配置内存分配空间
) m) Y3 @) l3 x' j
2.png
按上图配置,要注意的是default一定要勾选,不然内存是不会分配到外部SRAM的。当然了你用__atrribute__来指定分配也是可以用的,但是有一个问题就是你不能初始化赋值,管你是非零还是零赋值,通通没用,原因何在,我也不知道。希望高人指点一二
' j7 b. _2 A% i6 ]: N# W- w9 S: T2 p
- z9 v2 L) I2 i3 D" f  w
+ R# o' a# k4 d
之后就可以愉快的使用外部SRAM啦。
  g+ J/ U* b" j( v4 _. N6 o编写代码的时候使用方式与内部SRAM无异。
4 |5 j2 W. q0 r不过速度嘛…肯定比使用内部SRAM要慢的,毕竟FSMC操作外部SRAM的速度就那么大。
, Q9 O6 ^2 u1 V7 c  M9 M3 [
' Q4 i" @( K: \$ s- z+ L6 I
! {# \( h8 K" q
最后附上我改写后的纯寄存器版本的FSMC_SRAM_Init" ^3 u3 V# v$ C5 M  V
经测试能用在STM32F407上,其他芯片请自行修改。& |: Q1 i1 z! P" V

  1. 0 Z/ L1 n' D' R
复制代码
  1. void FSMC_SRAM_Init(void)
    ' g+ R7 V0 X( z8 E& k9 t
  2. {
    " v( }# K2 T1 [, i
  3.         /*-- GPIOs Configuration -----------------------------------------------------*/# h- J0 I2 R$ R5 [
  4.         /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */
    + c9 w5 X; c9 C* w5 b
  5.         RCC->AHB1ENR   |= 0x00000078;
    # f& X) d1 _# N
  6.        
    % }" u: x4 M, ~) [5 ]
  7.         //PD0,1,4,5,8~15    100M AF OUT_PP UP
    9 l6 w- z3 v9 n2 q
  8.         //PE0,1,7~15        100M AF OUT_PP UP
    ) C: h; ]7 G0 W# X. [5 `
  9.         //PF0~5,12~15       100M AF OUT_PP UP8 [9 Q% ]4 y. G4 B- {
  10.         //PG0~5,10          100M AF OUT_PP UP
    # w9 i  q" s% ^, }1 G
  11.         3 v" U3 p3 l! @$ h) C
  12.         /* Connect PDx pins to FMC Alternate function */: S0 H4 S1 o0 @
  13.         GPIOD->AFR[0]  = 0x00CC00CC;
    3 q* I7 v; b; V% z+ s* R
  14.         GPIOD->AFR[1]  = 0xCCCCCCCC;
    # Q' o/ c3 \" D$ E, D9 U) Z1 B2 K; u4 e
  15.         /* Configure PDx pins in Alternate function mode */  . X$ d& z+ \! Z, i( }, c
  16.         GPIOD->MODER   = 0xAAAA0A0A;
    + A: t- T$ O+ [' i9 |+ Y7 F
  17.         /* Configure PDx pins speed to 100 MHz */  
    $ v2 o0 J! i$ G, f% A% f
  18.         GPIOD->OSPEEDR = 0xFFFF0F0F;0 u# _; o4 J) w: ^! E
  19.         /* Configure PDx pins Output type to push-pull */  
    # U4 u1 h4 g1 q: }6 Z" B
  20.         GPIOD->OTYPER  = 0x00000000;( K) O/ \$ B# S2 H5 z' x
  21.         /* pull-up for PDx pins */ % i$ m$ T1 h* u5 b, X
  22.         GPIOD->PUPDR   = 0x55550505;
      `) V2 E, t8 Y. u" G  D
  23.        
    ) v$ z  X( l- v0 D6 w# w
  24.         /* Connect PEx pins to FMC Alternate function */
    / G1 \- {  S9 I( b) d
  25.         GPIOE->AFR[0]  = 0xC00000CC;
    , I2 o& _+ [! o: B
  26.         GPIOE->AFR[1]  = 0xCCCCCCCC;" e) ~6 J- V9 _2 _6 }# m
  27.         /* Configure PEx pins in Alternate function mode */ 9 ?4 D/ U9 w( l! i( ]1 o$ e
  28.         GPIOE->MODER   = 0xAAAA800A;1 f9 D+ l# p! G5 h6 A2 E
  29.         /* Configure PEx pins speed to 100 MHz */ " J5 ]: t; @; q
  30.         GPIOE->OSPEEDR = 0xFFFFC00F;; A2 K* `6 \7 m0 d
  31.         /* Configure PEx pins Output type to push-pull */  6 z" S1 Y# b. b  c3 ~; w/ v! G9 Y
  32.         GPIOE->OTYPER  = 0x00000000;1 _+ l4 \3 @; l1 N7 P1 ]% e
  33.         /* pull-up for PEx pins */ + Y0 n5 ]( S* d% F  R
  34.         GPIOE->PUPDR   = 0x55554005;% }+ p8 y7 v, ~& X
  35.        
    2 Y+ v; a5 [; W6 Z8 A1 x9 W) F: v1 R
  36.         /* Connect PFx pins to FMC Alternate function */
    3 N4 b' h) J$ a% z7 K
  37.         GPIOF->AFR[0]  = 0x00CCCCCC;
    ( S. A. g2 H0 W; e; k0 b
  38.         GPIOF->AFR[1]  = 0xCCCC0000;
    % n2 B+ W1 s# H9 U1 a0 K7 l# F1 W
  39.         /* Configure PFx pins in Alternate function mode */   - e$ C. S  M" {+ S
  40.         GPIOF->MODER   = 0xAA000AAA;7 Z  Z+ S, H' z& K
  41.         /* Configure PFx pins speed to 100 MHz */
    . K, `# u4 Z+ P7 H  u
  42.         GPIOF->OSPEEDR = 0xFF000FFF;) M# y2 Q1 N5 m& K7 F6 o
  43.         /* Configure PFx pins Output type to push-pull */  
    7 N' F4 |" F  e0 O  ]
  44.         GPIOF->OTYPER  = 0x00000000;; G5 z. h# [# J: `3 h+ }
  45.         /* pull-up for PFx pins */ / h# R$ N' P' V
  46.         GPIOF->PUPDR   = 0x55000555;7 E& e2 S% u: s+ C0 h# ^+ w
  47.         8 d5 D& q0 j" U
  48.         /* Connect PGx pins to FMC Alternate function */
    3 [+ n- Q2 o+ X$ a5 m! |9 H
  49.         GPIOG->AFR[0]  = 0x00CCCCCC;( ~* C2 u' F7 L+ w& N; o
  50.         GPIOG->AFR[1]  = 0x00000C00;
    ; U1 p( L: z8 X7 j+ U+ @' s
  51.         /* Configure PGx pins in Alternate function mode */ ' E$ D+ z5 U# [/ c4 p9 a1 S" O; w
  52.         GPIOG->MODER   = 0x00200AAA;9 m, s  J! u# G
  53.         /* Configure PGx pins speed to 100 MHz */
    ! W2 {' Z4 [8 T
  54.         GPIOG->OSPEEDR = 0x00300FFF;
    & Q( g) P; J. K, {' Z# `
  55.         /* Configure PGx pins Output type to push-pull */  
    0 `% ^5 `1 Y0 ~6 _; E* C4 j5 ^
  56.         GPIOG->OTYPER  = 0x00000000;0 g0 u& ^- p! a0 ^
  57.         /* pull-up for PGx pins */
    & T6 P7 r% H; e
  58.         GPIOG->PUPDR   = 0x00100555;
    % e  ~5 P# P6 b; X
  59.        
    0 C! r; [6 M% n, c+ m
  60.         /*-- FMC/FSMC Configuration --------------------------------------------------*/
    ) d+ ~$ U% p0 V! P
  61.         /* Enable the FMC/FSMC interface clock */
    0 w8 R& `- [7 O4 p5 N& C- n
  62.         RCC->AHB3ENR         |= 0x00000001;
    ; E+ ?2 u# l/ z9 {' J& q
  63.         4 }0 S! i3 o, g
  64.         //寄存器清零
    " s" T! A% i, k: }  ]
  65.         //bank1有NE1~4,每一个有一个BCR+TCR,所以总共八个寄存器。
    / E, H# z; k* i9 g. S6 a; j4 x# y) N
  66.         //这里我们使用NE3 ,也就对应BTCR[4],[5]。        
    / k+ }  }( S# f: I* |+ O+ h/ ^
  67.         FSMC_Bank1->BTCR[4]=0X00000000;* P' g' B5 w4 J; U6 f4 J# Z
  68.         FSMC_Bank1->BTCR[5]=0X00000000;
    ' X1 \: h* A. m: A; r7 L/ H
  69.         FSMC_Bank1E->BWTR[4]=0X00000000;
    % c+ V/ ?' `# d1 ~) K* c8 \  |# D
  70.         //操作BCR寄存器 使用异步模式,模式A(读写共用一个时序寄存器)' P: c( F8 B1 r
  71.         //BTCR[偶数]:BCR寄存器;BTCR[奇数]:BTR寄存器) c% [/ w; v- Q
  72.         FSMC_Bank1->BTCR[4]|=1<<12;//存储器写使能
    $ F/ k! }$ Q9 p. e+ i# a3 W" L5 i
  73.         FSMC_Bank1->BTCR[4]|=1<<4; //存储器数据宽度为16bit      & p1 h  y6 y) C! ~3 Q& C
  74.         //操作BTR寄存器   (HCLK=168M, 1个HCLK=6ns       5 ~4 B% [- F+ [. C
  75.         FSMC_Bank1->BTCR[5]|=8<<8; //数据保持时间(DATAST)为9个HCLK 6*9=54ns      ~1 }. G: q6 n- ^- o: l9 j
  76.         FSMC_Bank1->BTCR[5]|=0<<4; //地址保持时间(ADDHLD)未用到     # h" M& x# u$ I
  77.         FSMC_Bank1->BTCR[5]|=0<<0; //地址建立时间(ADDSET)为0个HCLK 0ns    7 e: ?2 Z: o% ?+ k" F. @( y
  78.         //闪存写时序寄存器  3 m' q& H+ G5 X5 b, l
  79.         FSMC_Bank1E->BWTR[4]=0x0FFFFFFF;//默认值
    ! G! f) l/ Z, L) P' ^% U
  80.         //使能BANK1区域35 P9 F( F) D! X- n' T
  81.         FSMC_Bank1->BTCR[4]|=1<<0;$ @' j3 }* [* G; L2 v$ J
  82. }& K) p; n2 A" B; }1 J1 p/ I
  83. ————————————————+ H& z  D& f- ?( V1 X/ [- D+ y) `0 Q
复制代码

7 C" C& r4 j$ y5 Y
赞 收藏 1 评论0 发布时间:2021-5-10 17:03

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版