|
在库文件中,system_stm32f4xx.c文件里面有这么的代码: #ifdef DATA_IN_ExtSDRAM) K, _% c/ ]) N4 @4 ] /**7 E6 F! c5 `. l! x+ ?" ? * @brief Setup the external memory controller. * Called in startup_stm32f4xx.s before jump to main. * 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) {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 clock */ 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; GPIOC->AFR[1] = 0x00007700;0 m! B2 T( H+ ]: S+ P1 d# E4 { /* Configure PCx pins in Alternate function mode */ GPIOC->MODER = 0x00a00002;& r( L& n3 o/ c& B& m2 x /* Configure PCx pins speed to 50 MHz */ GPIOC->OSPEEDR = 0x00a00002; /* Configure PCx pins Output type to push-pull */ GPIOC->OTYPER = 0x00000000; /* No pull-up, pull-down for PCx pins */ GPIOC->PUPDR = 0x00500000; /* 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; /* Configure PDx pins speed to 50 MHz */ GPIOD->OSPEEDR = 0xA02A000A;0 n8 _/ U6 X8 f( o8 e/ f* V /* Configure PDx pins Output type to push-pull */ GPIOD->OTYPER = 0x00000000; /* 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 */ GPIOE->AFR[0] = 0xC00000CC; GPIOE->AFR[1] = 0xCCCCCCCC; /* Configure PEx pins in Alternate function mode */ 2 O1 `+ w& J- L# w; \2 T( X GPIOE->MODER = 0xAAAA800A; /* 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 */ GPIOE->OTYPER = 0x00000000; /* No pull-up, pull-down for PEx pins */ * E$ E F. u$ {: H3 b+ C3 | Y2 ^ GPIOE->PUPDR = 0x00000000; ( K& z) \* l! n- [# `2 n /* Connect PFx pins to FMC Alternate function */ GPIOF->AFR[0] = 0xcccccccc; 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 */ GPIOF->OSPEEDR = 0xAA800AAA; /* Configure PFx pins Output type to push-pull */ GPIOF->OTYPER = 0x00000000; /* No pull-up, pull-down for PFx pins */ GPIOF->PUPDR = 0x00000000;8 [; t6 a; u. Z2 v: W; `- x /* Connect PGx pins to FMC Alternate function */$ H) Z: f6 C4 V7 _: r GPIOG->AFR[0] = 0xcccccccc; GPIOG->AFR[1] = 0xcccccccc; /* Configure PGx pins in Alternate function mode */ GPIOG->MODER = 0xaaaaaaaa; /* 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 */ GPIOH->AFR[0] = 0x00C0CC00; GPIOH->AFR[1] = 0xCCCCCCCC; /* 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; /* Configure PHx pins Output type to push-pull */ * W2 S# @) X& T GPIOH->OTYPER = 0x00000000; /* No pull-up, pull-down for PHx pins */ GPIOH->PUPDR = 0x00000000; % 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; GPIOI->AFR[1] = 0x00000CC0; /* Configure PIx pins in Alternate function mode */ GPIOI->MODER = 0x0028AAAA;1 U! @5 U" _: t, O; Y: u& F) p$ p /* Configure PIx pins speed to 50 MHz */ GPIOI->OSPEEDR = 0x0028AAAA; /* Configure PIx pins Output type to push-pull */ GPIOI->OTYPER = 0x00000000;$ c/ u" ~0 q6 b" I7 @0 q! M$ e /* No pull-up, pull-down for PIx pins */ GPIOI->PUPDR = 0x00000000;' m! ]! b4 A# G / H/ D' W* i3 c, A6 u /*-- FMC Configuration ------------------------------------------------------*/ /* Enable the FMC interface clock */% X: I+ {' l7 O4 [2 P$ u RCC->AHB3ENR |= 0x00000001; / {2 B, e j5 l* g1 e Q8 B /* Configure and enable SDRAM bank1 */ FMC_Bank5_6->SDCR[0] = 0x000039D0;, d# ^ B7 m/ Q8 x6 d4 F FMC_Bank5_6->SDTR[0] = 0x01115351; $ 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; 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 { tmpreg = FMC_Bank5_6->SDSR & 0x00000020; } % Q: X& z9 d# {' Q5 e; s /* Delay */ 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; timeout = 0xFFFF;% T% i9 h3 {3 N7 Y. R! G% p% R while((tmpreg != 0) & (timeout-- > 0)) { tmpreg = FMC_Bank5_6->SDSR & 0x00000020; }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; timeout = 0xFFFF;; J) \! {! e8 ` while((tmpreg != 0) & (timeout-- > 0))/ s% E" k; Y: _& L+ U { tmpreg = FMC_Bank5_6->SDSR & 0x00000020; }4 a- j0 @. l: U2 g, h7 T1 ] $ @8 {6 R8 L- B( l: g& k /* MRD register program */ 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)) { tmpreg = FMC_Bank5_6->SDSR & 0x00000020; } /* Set refresh count */ 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 */ tmpreg = FMC_Bank5_6->SDCR[0]; 3 H9 V1 M9 d7 j. h FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); /*. 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; FMC_SDRAMTimingInitStructure.FMC_SelfRefreshTime = 4; ! T& P0 f* F5 K4 f* y, l- u FMC_SDRAMTimingInitStructure.FMC_RowCycleDelay = 6; FMC_SDRAMTimingInitStructure.FMC_WriteRecoveryTime = 2; ( D/ d' @, X' m FMC_SDRAMTimingInitStructure.FMC_RPDelay = 2; FMC_SDRAMTimingInitStructure.FMC_RCDDelay = 2; FMC_SDRAMInitStructure.FMC_Bank = SDRAM_BANK; 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; FMC_SDRAMInitStructure.FMC_InternalBankNumber = FMC_InternalBank_Number_4; FMC_SDRAMInitStructure.FMC_CASLatency = FMC_CAS_Latency_3; FMC_SDRAMInitStructure.FMC_WriteProtection = FMC_Write_Protection_Disable; FMC_SDRAMInitStructure.FMC_SDClockPeriod = FMC_SDClock_Period_2; FMC_SDRAMInitStructure.FMC_ReadBurst = FMC_Read_Burst_disable; FMC_SDRAMInitStructure.FMC_ReadPipeDelay = FMC_ReadPipe_Delay_1; FMC_SDRAMInitStructure.FMC_SDRAMTimingStruct = &FMC_SDRAMTimingInitStructure;3 L T, x0 S& v R" L */" x4 B/ v$ x& l$ F }/ k { O# o6 I! A1 D; p/ s #endif /* DATA_IN_ExtSDRAM */ 很简单,说的就是如果你定义了这个宏,那么就给你初始化一下FMC使用的引脚。7 ~/ k& O9 n H' O/ o 我使用了F429 Discovery,在用SDRAM的时候,直接把SDRAM_Init中初始化引脚的代码删了,定义了一个宏DATA_IN_ExtSDRAM来完成初始化引脚的代码。但是当实验的时候却发现不行。 最后好好查看了下system_stm32f4xx.c中的代码,也就是上面的代码,发现竟然没有初始化PB5,PB6两个引脚,也正是SDCKE1,SDNE1两个引脚。加上这两个引脚的初始化代码之后程序正常。6 ~5 N# f1 T* d' @3 d* g 不知道为什么这里没有设置这两个引脚的模式。吐槽一下。希望用SDRAM的人不要挂在这个地方。 |
微信公众号
手机版
弱弱求个初始化代码,还有要怎么配置那个SDRAM作为数据内存?官方那个例程没跑通。。。