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

吐槽一下库文件system_stm32f4xx.c

[复制链接]
qianfan 发布时间:2014-12-21 16:01
在库文件中,system_stm32f4xx.c文件里面有这么的代码:
# c; A' A: x& L" t, J5 U#ifdef DATA_IN_ExtSDRAM) K, _% c/ ]) N4 @4 ]
/**7 E6 F! c5 `. l! x+ ?" ?
  * @brief  Setup the external memory controller.
% E( K0 k5 i8 F: y; ^% H  *         Called in startup_stm32f4xx.s before jump to main.
, A- ^1 j6 ~% n) m3 N* ^0 r( s. V  *         This function configures the external SDRAM mounted on STM324x9I_EVAL board& |+ `) s, J; j8 e/ i4 F) F$ y% r6 C
  *         This SDRAM will be used as program data memory (including heap and stack)./ V! E8 b) p0 V' Y+ e9 x
  * @param  None) c2 x" \( g2 u2 ~/ O, r0 r
  * @retval None% v/ `$ F- E7 V! W! P
  */5 ^1 }/ u1 L, J7 W5 K
void SystemInit_ExtMemCtl(void)
% L4 C' i6 g$ u8 p  S{6 k( T* G" B- i" u: w
  register uint32_t tmpreg = 0, timeout = 0xFFFF;0 l& m  v6 i1 C* Z
  register uint32_t index;4 u* G- |/ t  O
( c' H* P2 U$ |! c
  /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface
7 n$ ]: u/ S# t) ~7 b+ U* _* d      clock */
. \1 i! C5 D/ {0 R  RCC->AHB1ENR |= 0x000001FC;) k5 j% y& I3 o7 D
7 K$ ~& y) v3 p4 Y% f& n7 v
  /* Connect PCx pins to FMC Alternate function */; y5 L4 a6 _' ~& {  _9 _" j
  GPIOC->AFR[0]  = 0x0000000c;
2 P/ q: G# _/ W/ r9 a/ B  GPIOC->AFR[1]  = 0x00007700;0 m! B2 T( H+ ]: S+ P1 d# E4 {
  /* Configure PCx pins in Alternate function mode */  
& V5 z3 h* s* ~2 }- a' d  GPIOC->MODER   = 0x00a00002;& r( L& n3 o/ c& B& m2 x
  /* Configure PCx pins speed to 50 MHz */  
0 @/ n) `( w. f! ^  GPIOC->OSPEEDR = 0x00a00002;
) F  u# f- R+ C% d  /* Configure PCx pins Output type to push-pull */  
0 M& t9 a) R, g& b6 a8 g  GPIOC->OTYPER  = 0x00000000;
. S, S9 [/ D2 Q) q  /* No pull-up, pull-down for PCx pins */
1 p7 P* L4 S7 W( @  GPIOC->PUPDR   = 0x00500000;
7 L* c8 y/ U$ Q' X7 h7 c5 r
" [/ U$ ^; B# x2 ^  Z5 j' A" f5 h  /* Connect PDx pins to FMC Alternate function */, q) }+ Z, e% P
  GPIOD->AFR[0]  = 0x000000CC;" `5 n9 r5 W+ b& Z4 A
  GPIOD->AFR[1]  = 0xCC000CCC;) ~' ~5 u4 _8 \1 L# N3 ?8 Y- T
  /* Configure PDx pins in Alternate function mode */  8 W. G$ L; E/ b3 p% W# {
  GPIOD->MODER   = 0xA02A000A;
1 t" Y! l  m) c7 \  /* Configure PDx pins speed to 50 MHz */  
. X7 O" V* u% d4 h# L$ v9 m  GPIOD->OSPEEDR = 0xA02A000A;0 n8 _/ U6 X8 f( o8 e/ f* V
  /* Configure PDx pins Output type to push-pull */  
7 _6 T4 B- I( ?7 i  GPIOD->OTYPER  = 0x00000000;
% r! D4 {( {: y' u3 ^  /* No pull-up, pull-down for PDx pins */ $ W% f4 \4 A8 l, }
  GPIOD->PUPDR   = 0x00000000;& n& M8 k5 H. [7 @$ I* q" E
6 N/ T. Y: ?( v" M% U/ D7 n* M; V
  /* Connect PEx pins to FMC Alternate function */
4 Z6 g, Y1 m  J# D! o* Y  GPIOE->AFR[0]  = 0xC00000CC;
( T7 s  z# h& x7 X' I( n, h  GPIOE->AFR[1]  = 0xCCCCCCCC;
1 m0 K) }7 `  ~& V) I  /* Configure PEx pins in Alternate function mode */ 2 O1 `+ w& J- L# w; \2 T( X
  GPIOE->MODER   = 0xAAAA800A;
( a, g  p$ H" X3 s7 b  /* Configure PEx pins speed to 50 MHz */ 9 B. R- K0 E) d; y( a" M" k: O6 Q: h
  GPIOE->OSPEEDR = 0xAAAA800A;* r& j1 a4 ~3 v: x
  /* Configure PEx pins Output type to push-pull */  
- I5 \: z& N  Q4 X# G: N+ H1 K8 p  F  GPIOE->OTYPER  = 0x00000000;
) `% Q+ t+ a, X/ \( q; [$ E  /* No pull-up, pull-down for PEx pins */ * E$ E  F. u$ {: H3 b+ C3 |  Y2 ^
  GPIOE->PUPDR   = 0x00000000;
% A- e/ x) E3 f  H/ [6 E2 r/ o6 ~( K& z) \* l! n- [# `2 n
  /* Connect PFx pins to FMC Alternate function */
$ ?# f; a* p$ K9 U  GPIOF->AFR[0]  = 0xcccccccc;
% x5 S- ?" V( F( t& f3 c  GPIOF->AFR[1]  = 0xcccccccc;" [9 d6 x' `. N4 t
  /* Configure PFx pins in Alternate function mode */   8 D% [- f  `1 m8 m9 D/ J
  GPIOF->MODER   = 0xAA800AAA;4 N* P+ s. t" z$ ^
  /* Configure PFx pins speed to 50 MHz */
5 W6 h* v% ^$ q) z9 g  k: ~' S, c  GPIOF->OSPEEDR = 0xAA800AAA;
, t8 E- A2 X4 J6 b& `5 H7 L" z, O  /* Configure PFx pins Output type to push-pull */  
  U, s& I8 B" \. ~9 V. s5 x& j* |/ v  GPIOF->OTYPER  = 0x00000000;
% s$ W0 C" k9 R+ y% Y# E3 @  /* No pull-up, pull-down for PFx pins */
. O3 L; {( u* i7 ?- x$ @, \  GPIOF->PUPDR   = 0x00000000;8 [; t6 a; u. Z2 v: W; `- x

6 U+ k! E& t/ P9 q  /* Connect PGx pins to FMC Alternate function */$ H) Z: f6 C4 V7 _: r
  GPIOG->AFR[0]  = 0xcccccccc;
8 O- c2 g; [; H  GPIOG->AFR[1]  = 0xcccccccc;
' l& r( P6 H. C7 b8 y0 k  /* Configure PGx pins in Alternate function mode */
7 L6 l6 s) l6 b% w8 H( h  GPIOG->MODER   = 0xaaaaaaaa;
( w. F: P) o7 W! G% a  /* Configure PGx pins speed to 50 MHz */ 7 @3 m3 Y' O$ s/ P$ y- }% h
  GPIOG->OSPEEDR = 0xaaaaaaaa;. }3 B. m, v- B* X
  /* Configure PGx pins Output type to push-pull */  : T9 z8 U5 A! d* a
  GPIOG->OTYPER  = 0x00000000;8 ^5 j1 E, _' U
  /* No pull-up, pull-down for PGx pins */ : C+ I" {+ V# W4 M6 N. f3 c) K7 M
  GPIOG->PUPDR   = 0x00000000;# k2 C7 s! D3 t( i
3 e2 k6 u; x5 p9 H
  /* Connect PHx pins to FMC Alternate function */
3 m" f$ u9 p. K; a' e: P  GPIOH->AFR[0]  = 0x00C0CC00;
# o+ G% V& T/ ^) u2 W$ P  GPIOH->AFR[1]  = 0xCCCCCCCC;
  u8 X" Y; k+ |  t3 r; q! k  /* Configure PHx pins in Alternate function mode */ ( v$ x- A( R2 x$ z( U: U- W; d
  GPIOH->MODER   = 0xAAAA08A0;$ b6 m5 P. }* [' A$ o$ s
  /* Configure PHx pins speed to 50 MHz */ 7 X: ]6 g/ x( M% q
  GPIOH->OSPEEDR = 0xAAAA08A0;
' }9 w+ m5 A# y# U7 [  /* Configure PHx pins Output type to push-pull */  * W2 S# @) X& T
  GPIOH->OTYPER  = 0x00000000;
& A- m  s  a+ F+ v* G+ [3 A  /* No pull-up, pull-down for PHx pins */
4 x- O+ n  h* x+ S" w2 ^0 y  GPIOH->PUPDR   = 0x00000000;
- N# v5 Y; x, t) `5 N- l$ I% T7 d9 R" ^8 z; R# Y6 `0 H
  /* Connect PIx pins to FMC Alternate function */8 ~  s( |5 X# v) |+ X
  GPIOI->AFR[0]  = 0xCCCCCCCC;
5 N. k7 A2 C; p/ E  GPIOI->AFR[1]  = 0x00000CC0;
  g# c) z) @$ f& ^4 i1 U3 Q8 @  /* Configure PIx pins in Alternate function mode */
4 ^3 i3 y* o6 D: X  GPIOI->MODER   = 0x0028AAAA;1 U! @5 U" _: t, O; Y: u& F) p$ p
  /* Configure PIx pins speed to 50 MHz */
! ^6 }+ P& D5 e9 m, a6 h0 {  GPIOI->OSPEEDR = 0x0028AAAA;
# x+ I! D# D5 h; h  /* Configure PIx pins Output type to push-pull */  
% ]( L- Q; g4 o( l$ N; e  GPIOI->OTYPER  = 0x00000000;$ c/ u" ~0 q6 b" I7 @0 q! M$ e
  /* No pull-up, pull-down for PIx pins */
6 }6 E- E4 x; x9 O5 p  GPIOI->PUPDR   = 0x00000000;' m! ]! b4 A# G
/ H/ D' W* i3 c, A6 u
/*-- FMC Configuration ------------------------------------------------------*/
  ]) M1 I1 Z8 R* ~' n- T% o  /* Enable the FMC interface clock */% X: I+ {' l7 O4 [2 P$ u
  RCC->AHB3ENR |= 0x00000001;
$ t" Q! d1 C( e3 d" E/ {2 B, e  j5 l* g1 e  Q8 B
  /* Configure and enable SDRAM bank1 */
. ~2 v$ z$ h+ S" E) J. f  FMC_Bank5_6->SDCR[0] = 0x000039D0;, d# ^  B7 m/ Q8 x6 d4 F
  FMC_Bank5_6->SDTR[0] = 0x01115351;      
, G8 t) \. z- ^( e$ O! E% o- _5 b# T/ [1 [) H( I6 h/ @
  /* SDRAM initialization sequence */6 B2 S, m+ A. Q1 b. F3 G
  /* Clock enable command */. g' K2 m0 G3 `1 R8 c
  FMC_Bank5_6->SDCMR = 0x00000011;
* ^7 J  @' B# Q" U7 Q  tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + {6 E* H, D; M0 O5 F2 x
  while((tmpreg != 0) & (timeout-- > 0)): x" x# C' k2 E; Z
  {
# Y1 M( T5 h) P- U3 h    tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
9 F! h& J4 |" c% @& c# g( p  }
1 ^: v& ~7 L) ^! e9 J1 e% Q: X& z9 d# {' Q5 e; s
  /* Delay */
5 N/ ~4 p+ _/ b) t/ b  x, P* Z1 S  for (index = 0; index<1000; index++);- R1 F; E; ]1 b4 z: c1 Z2 o
# S( G+ O# E; r" U/ t7 A
  /* PALL command */+ z6 V; e7 C8 r) Y- |
  FMC_Bank5_6->SDCMR = 0x00000012;           
3 k- o! H. c& l$ s* v7 W9 N' _" Q  timeout = 0xFFFF;% T% i9 h3 {3 N7 Y. R! G% p% R
  while((tmpreg != 0) & (timeout-- > 0))
) V0 P" n# H7 n  \9 ]  {
0 G* Q" D8 C6 \# M" `" T  n  tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
; e) i1 e- b. [' }  }3 a' o, h8 o) r
8 p3 c. `9 ]. o; t6 m% i3 s8 J
  /* Auto refresh command */& C8 S; K9 \# W$ f, D# S
  FMC_Bank5_6->SDCMR = 0x00000073;
0 M1 i- R- E( u  timeout = 0xFFFF;; J) \! {! e8 `
  while((tmpreg != 0) & (timeout-- > 0))/ s% E" k; Y: _& L+ U
  {
" Z& c$ r4 N# @, p  tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
' u" g/ Y. ?' W7 O. [& F  }4 a- j0 @. l: U2 g, h7 T1 ]
$ @8 {6 R8 L- B( l: g& k
  /* MRD register program */
3 }. Z- e; t& G2 ]/ r7 t# \: h0 _, U  FMC_Bank5_6->SDCMR = 0x00046014;; k! d8 W, t$ n0 u% T
  timeout = 0xFFFF;$ k- M5 W% b9 ?1 b2 t8 ?
  while((tmpreg != 0) & (timeout-- > 0))
7 z# @8 N8 H# f* o% T' q7 i  {
4 b5 z& R, D1 o# N  tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
! g  a" ]/ W8 V, A. m  }
/ i9 I* a% E1 T. Z
2 f/ N! J9 D: r  /* Set refresh count */
. G9 l4 f! z- n  tmpreg = FMC_Bank5_6->SDRTR;2 q9 }7 ]! e# B
  FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1));$ y8 |! v& j8 \9 q9 d  r
* A- G, `5 D2 c7 n7 {& k$ _
  /* Disable write protection */
" F6 _9 Y. Q' B: o- d" k  tmpreg = FMC_Bank5_6->SDCR[0]; 3 H9 V1 M9 d7 j. h
  FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF);
0 G5 x. T9 ]$ u3 K" _
% O/ z; a1 Q0 I! e) L7 `/*. u' h+ H, O" D9 s& S2 b+ o2 @4 J
  Bank1_SDRAM is configured as follow:: U1 P9 e+ C& \2 @+ w7 V8 P2 z5 l) {  w
2 {1 o! v. s+ V( M$ w7 d: f
  FMC_SDRAMTimingInitStructure.FMC_LoadToActiveDelay = 2;      * @. B: _4 A7 G& @! u6 N
  FMC_SDRAMTimingInitStructure.FMC_ExitSelfRefreshDelay = 6;  
0 x; z/ E5 Q) E: `4 R) l2 |  FMC_SDRAMTimingInitStructure.FMC_SelfRefreshTime = 4;        ! T& P0 f* F5 K4 f* y, l- u
  FMC_SDRAMTimingInitStructure.FMC_RowCycleDelay = 6;         
; M' @/ |0 X7 h. `$ P6 ?; [" [  FMC_SDRAMTimingInitStructure.FMC_WriteRecoveryTime = 2;      ( D/ d' @, X' m
  FMC_SDRAMTimingInitStructure.FMC_RPDelay = 2;               
- Y* |6 \2 J$ k% q  FMC_SDRAMTimingInitStructure.FMC_RCDDelay = 2;               
1 N' V0 w* V  N- ^# P( e
6 h8 p$ ?0 \. ?; S  FMC_SDRAMInitStructure.FMC_Bank = SDRAM_BANK;
3 n* a! w/ d6 V  FMC_SDRAMInitStructure.FMC_ColumnBitsNumber = FMC_ColumnBits_Number_8b;0 B, L7 O0 F( F5 T5 O
  FMC_SDRAMInitStructure.FMC_RowBitsNumber = FMC_RowBits_Number_11b;7 E$ s4 x. v+ e2 V  O
  FMC_SDRAMInitStructure.FMC_SDMemoryDataWidth = FMC_SDMemory_Width_16b;
/ E( l$ t, m  ^* K, p8 l4 @: \  FMC_SDRAMInitStructure.FMC_InternalBankNumber = FMC_InternalBank_Number_4;
0 h& B+ @! k" s& N' E( \; q3 a" N7 G  FMC_SDRAMInitStructure.FMC_CASLatency = FMC_CAS_Latency_3;
4 P1 _# m% u5 {2 v  FMC_SDRAMInitStructure.FMC_WriteProtection = FMC_Write_Protection_Disable;
6 S6 y9 g6 w* @# i  e& @' r  FMC_SDRAMInitStructure.FMC_SDClockPeriod = FMC_SDClock_Period_2;
; g5 g# M- m% f9 Q8 ?9 O  ]  FMC_SDRAMInitStructure.FMC_ReadBurst = FMC_Read_Burst_disable;
. K4 h$ E- A; X/ S* y( Y5 C; m  FMC_SDRAMInitStructure.FMC_ReadPipeDelay = FMC_ReadPipe_Delay_1;
% j% {2 K$ L4 X. f. y, [# N' L  FMC_SDRAMInitStructure.FMC_SDRAMTimingStruct = &FMC_SDRAMTimingInitStructure;3 L  T, x0 S& v  R" L
*/" x4 B/ v$ x& l$ F

( @+ j$ ?; K* v3 Z' X}/ k  {  O# o6 I! A1 D; p/ s
#endif /* DATA_IN_ExtSDRAM */
$ I1 V( s# ~; g( c+ A; v, m& R
0 b+ h8 a3 c9 ]/ t
# N; a$ f+ r; O$ `5 {很简单,说的就是如果你定义了这个宏,那么就给你初始化一下FMC使用的引脚。7 ~/ k& O9 n  H' O/ o
我使用了F429 Discovery,在用SDRAM的时候,直接把SDRAM_Init中初始化引脚的代码删了,定义了一个宏DATA_IN_ExtSDRAM来完成初始化引脚的代码。但是当实验的时候却发现不行。
  W6 E- k8 X, B" W4 J2 l8 C最后好好查看了下system_stm32f4xx.c中的代码,也就是上面的代码,发现竟然没有初始化PB5,PB6两个引脚,也正是SDCKE1,SDNE1两个引脚。加上这两个引脚的初始化代码之后程序正常。6 ~5 N# f1 T* d' @3 d* g
不知道为什么这里没有设置这两个引脚的模式。吐槽一下。希望用SDRAM的人不要挂在这个地方。
; ?4 r! B8 u! _4 G" b# m2 c1 A
* A$ ~  `: |# n* w: `
赞 收藏 1 评论6 发布时间:2014-12-21 16:01

举报

6个回答
小贾-370388 回答时间:2014-12-22 10:37:35
谢谢分享
wamcncn 回答时间:2014-12-22 12:57:12
帮你吐下
makc 回答时间:2014-12-27 10:25:40
官方库有时是有点锉,版本变动一下subroutine 也跟着变动,不同的库编译出来的结果完全不一样。看你需求了其实自己写底层封装也不会太难。
善良的女性 回答时间:2014-12-27 15:07:02
" c3 h3 v8 V2 ]  @. i) z
wu1169668869 回答时间:2015-7-28 13:49:13
楼主应该还在论坛1 ~! ]+ b/ m$ j) Y# v" B3 U
弱弱求个初始化代码,还有要怎么配置那个SDRAM作为数据内存?官方那个例程没跑通。。。
evil简爱 回答时间:2017-2-21 20:09:28
GPIOA GPIOB GPIOC 怎么加。。。我好像也遇到了这个问题

所属标签

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