环境:
/ s& L# F- f2 r# b1 c1 G7 _5 E ?主机:WIN71 F/ Z' [0 O( z$ M H3 w* k
开发环境:MDK4.72
% x: J1 U R3 Q; a' A8 oMCU:STM32F103ZE! e1 o8 A4 q7 K! r. _5 o
Q" J* N9 f( i# x; |- x
$ n/ J, x1 h4 I0 k4 V
说明:
: e# _$ ]/ s. O& U# m8 a. p6 @! D: {sram型号:IS62WV51216BLL
: n E1 p7 T' ?% h1 a连接方式:FSMC
& G7 s1 q5 K4 [6 [5 A( |: D大小:1M字节.512K * 16
& d+ S* U+ u. q" p0 D. x. c" C0 r) ?$ c$ a- u- l* q7 F
8 l' E7 D+ f' f% m源代码:
8 F8 ?2 f; @ o l4 n" winf_sram.h& K( r" Z% }* R1 h2 S
- <font face="微软雅黑" size="3">/*********************************************************************
& ^6 U5 r7 v- ?$ S- _ - * sram接口层头文件
+ p* y. O; ?7 r4 w: l - * (c)copyright 2013,jdh
" T6 v! B8 i: w$ r8 ` - * All Right Reserved* A4 n1 j. Z8 Z X3 U& S- F1 V1 b6 [3 w
- *文件名:inf_sram.h. T8 p' a" n6 p! q
- *程序员:jdh
1 j* z+ ` j8 E% A6 G! N5 T& n. X - *修改日期:2013/10/10
7 K) f0 F S$ C9 y* m: N - * 2013/10/11' h. ~$ g' d1 W; e8 M
- **********************************************************************/" n4 k& [ h6 H2 W+ I5 ?! z6 H
-
0 y9 I0 p* S) O8 g: O1 z( h( f$ Y - /*********************************************************************
! I$ O, w( }0 L+ F - * 说明
8 |0 I. ~& q/ T, V4 V1 Q - *sram型号:IS62WV51216BLL6 S" ?5 R1 `" p( | d
- *连接方式:FSMC% g5 z/ D8 j0 G: ~+ C2 L% D- e
- *大小:1M字节.512K * 16
, ^, K$ s- ?/ @ - **********************************************************************/
! y( i9 i, A; M, h' \4 ? -
" g' Q+ R8 e! ~9 d+ h4 F0 B! S - #ifndef _INF_SRAM_H_0 D5 Z$ o# d7 [
- #define _INF_SRAM_H_* ~' A- p' t/ J0 d
-
8 c/ m) N" l! t# @# E( I# s - /*********************************************************************& ^# d7 U3 t* q' a' T' U
- * 头文件
# T O* v/ X& E) {* R - **********************************************************************/& K E9 |. G/ ^1 I+ v
-
6 K" L6 [3 o: _9 r - #include "stm32f10x.h"
4 M! A9 q& e" J* S% l - #include "stm32f10x_fsmc.h"+ V5 I2 t# j: }/ u- O
-
% U$ C6 V" f: E1 n9 D$ j7 f - /*********************************************************************
" Z# B& A7 G$ C. G& z( c - * 宏定义1 F1 D" X! V1 }( }3 ]
- **********************************************************************/
' l8 {. Y& v% D - & I7 c" G: F* b% Y0 W' N3 n8 a
- /*********************************************************************$ N8 f7 x7 r: E9 M- x7 q! e- Q0 E( f
- * SRAM2的BANK1起始地址
% W; ^9 W( D! n, j- A: q5 j3 ? - **********************************************************************/
% ]' H: }# R/ p! q - 4 t6 A8 _6 M3 }. U6 L
- #define Bank1_SRAM2_ADDR ((uint32_t)0x64000000)" `/ z- f7 A, O, B; e% O, F6 f3 e
-
# r. `0 p, Z0 B0 z- P4 s - /*********************************************************************
+ }) G% S' X6 E- _4 h' N - * 函数+ K8 G8 Q8 x/ H. i3 ]4 {( s
- **********************************************************************/
5 L! h1 X b3 O$ U6 h7 \ - $ B. }( U. d- ~. R3 g
- /*********************************************************************
, p; ]& |0 Y2 R$ u6 S T - * 初始化sram, X% X# S& E G" W, e8 r) h% v! h
- **********************************************************************/
& S( V7 s. p! c# J: l3 u' B" G -
2 R2 t& u" U/ s% g( O5 Z8 G - void inf_init_sram(void);- u9 ^5 j5 Z0 d, n" `- [5 \) Y% D
- ( z6 S; p+ s8 h& @% p' F
- /*********************************************************************! e1 e8 Q# Y) X3 K* Z) U$ C1 ^9 o
- * 写入数据包
/ k0 k; A1 [( ^! u: R - *输入:pBuffer:数据指针
q) H5 ?4 X! m! ^2 s8 `6 X' j2 ^ - * WriteAddr:写入数据地址
' p) t; ^" z" z; H+ i. P- s - * NumHalfwordToWrite:数据长度
& k. X/ W* G, ?0 e8 C3 R; I. H - *返回:无& c, s3 ]7 L/ p4 w, `' b) H1 t
- **********************************************************************// J3 m- b! [! b z9 T
-
- l% j, f4 e1 W - void FSMC_SRAM_WriteBuffer(uint16_t* pBuffer,uint32_t WriteAddr,uint32_t NumHalfwordToWrite);' w: W- c! H" h4 ^
- * f5 I* K% G! V3 G0 P+ u
- /*********************************************************************/ p; p4 z2 ]' k) r: O
- * 读取数据包
' w* P: I! c7 q& l2 u! h2 L5 M9 E# v - *输入:pBuffer:存放数据的指针
6 N3 n- l4 {4 o% L# R6 P( w - * ReadAddr:读取数据地址) V) M3 X1 p% j# m0 D; z
- * NumHalfwordToRead:读取数据长度,单位半字,即2字节# x! w" f* M* p9 [* s; h) b) g6 ?/ w6 V
- *返回:无
% D# C! L+ ?$ Y' Q' x% p G - **********************************************************************/
0 @3 {* |$ n+ K8 b - ( ], _9 y9 z6 L( P
- void FSMC_SRAM_ReadBuffer(uint16_t* pBuffer, uint32_t ReadAddr, uint32_t NumHalfwordToRead);
/ V' T* x) F5 A' J/ h8 g - # x/ x+ t2 T8 T' r7 n
- /*********************************************************************' Q( L/ O7 z* \+ G w
- * 写入半字数据
* V. `) V2 G, T4 b# K0 M3 [ - *输入:WriteAddr:写入数据地址& \1 o& L: |$ C: A( Q1 `; Y+ f5 f
- * data:数据
5 v5 h5 A& W$ [* ]# ?# N( n, F R - *返回:无
" B% s1 r; T, F7 J6 e - **********************************************************************/8 V$ U/ A% @; T7 f# N& A& k
- 8 h, F4 R/ d& T; `8 P+ B5 n5 g
- void FSMC_SRAM_WriteHalfWord(uint32_t WriteAddr, uint16_t data);
6 M$ C* \& o2 e$ y5 ~. r h1 m, o - - C# _, _( a; H q
- /*********************************************************************# ]7 }0 P) |8 H1 [' E- }7 r$ g3 h
- * 读取半字数据1 j; {6 s9 X- V, R7 h, {% ^) p3 J9 [- p
- *输入:ReadAddr:读取数据地址
! x: t* r% H6 ?! L% b6 z" o, M+ B - *返回:读取的数据' l5 V/ Z& O1 g
- **********************************************************************/
) s- ^& Y. C) w) V - $ V! {3 o2 S( ~0 ?
- uint16_t FSMC_SRAM_ReadHalfWord(uint32_t ReadAddr);
4 n3 d/ m9 `/ {/ g4 a* A -
$ Q# |: a2 R+ m5 F - #endif
8 H0 W: I+ P" z. A4 j2 ] - </font>
复制代码 inf_sram.c# j/ e1 P" Z! s2 {2 G, a p
- <font face="微软雅黑" size="3">/*********************************************************************4 C" r" j( v: p1 \( k w
- * sram接口层头文件
& H* W/ m8 I8 s4 c. c5 n - * (c)copyright 2013,jdh
: X) I. B4 R% F - * All Right Reserved2 x W$ J/ q$ b/ S
- *文件名:inf_sram.c
. ]1 M* j$ b. h7 @' A - *程序员:jdh$ o) H" m) [2 q# {. ~% @
- *修改日期:2013/10/10
* M: X6 I5 r2 c% q* j/ |1 o - * 2013/10/11
% b2 F/ y) {' ~& x7 _ - **********************************************************************/
2 V$ [. C1 l5 b- W6 S - : i1 s% _1 n8 f5 F* ~( k
- /*********************************************************************1 P! _/ k% L" ], z
- * 说明4 E1 B. g. q8 x: V, e" j
- *sram型号:IS62WV51216BLL- M+ O$ h2 x3 m
- *连接方式:FSMC D( g* H- }9 X! y' ?5 S
- *大小:1M字节.512K * 165 N- K0 Z/ P0 L* H& c
- **********************************************************************/
8 Z6 T) |, ] M0 Y -
4 t; L- x1 C, R R0 d) X - /*********************************************************************" e: s8 ^5 E) \) ], y, L
- * 头文件
& K" q7 V* m' g" T - **********************************************************************/
* P n& K% P9 t! F( a B% j - ! v6 P4 M, v5 F# d- O9 l
- #include "inf_sram.h"
6 A& P- B- s' N6 ] -
' l" @ E) ?0 j1 y4 m2 v, J, n - /*********************************************************************
^. Q1 k2 {, r/ q- }, ` - * 函数
! ^: k4 t7 W0 X8 o- q6 J - **********************************************************************/9 H. E: c( e5 K
- 6 E& b" w+ E- k3 Y
- /*********************************************************************! }8 ~3 A" p% e( o! S2 N- y# a y
- * 初始化sram
( P! F" ]( e' t" f3 ^, z: q( C6 V - **********************************************************************/! r+ W/ N4 m% V. }( t
- . H+ O+ t! K. C( E* x9 F$ Q
- void inf_init_sram(void)1 e# B; x; e3 }: A! P$ d$ q
- {# A1 ^; U [5 _: L. f# U5 c9 B( w- T
- GPIO_InitTypeDef GPIO_InitStructure; G* C5 M# S' z" u! P! T
- FSMC_NORSRAMTimingInitTypeDef p;) N% s3 h- j$ q$ J# N
- FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;0 z0 C$ R4 r8 _' C0 ^) I3 E/ w
- : W$ @7 \8 @1 ?" d5 O
- //开启FSMC时钟
6 [% Q+ ~2 T# K) W - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);8 x2 m5 b# {, r1 S7 f
- //RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC | RCC_AHBPeriph_SRAM,ENABLE);
, s" d5 Q$ i$ f3 x/ Q, x+ ] f - //开启FSMC相关的IO时钟( n# H$ o* \" z3 Z6 u8 ~
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | \, u9 b+ i, P2 ]
- RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG | \
& Q; g1 V( E6 ^ - RCC_APB2Periph_AFIO, ENABLE);* Q2 q5 \0 E1 Q1 J7 w* t
- //FSMC相关的IO配置' A! f Q+ S: x* _+ k$ o
- //数据线: u0 y7 M8 h- m7 B
- //PD口3 c$ ~0 H" L/ |, S5 x* e: \
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | \
9 T7 [# H6 f4 P8 n+ h s8 U- s - GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | \
1 F) a9 h2 c- b) Q - GPIO_Pin_15;; _ n$ Y5 z$ C: s+ v6 J
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
+ V, u$ E7 Y( j7 p" Y/ d3 L: w - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ W8 K2 C4 d& S$ K - GPIO_Init(GPIOD, &GPIO_InitStructure); . e% X9 | c: o7 _
- //PE口
2 o0 R9 u8 `, P2 N- X8 p - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | \$ m+ j ~5 x7 M; G
- GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | \) Y! d1 j2 I1 e
- GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
; T0 B6 m) U" A5 H" }0 { - GPIO_Init(GPIOE, &GPIO_InitStructure);
+ ]! X( o2 U: k) G9 V" h -
( Z" X5 m6 `% ~, V - //地址线& C/ S0 {- Y2 b6 ?' n) l; P1 {
- //PF口
5 v* {7 m8 r' N5 z - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | \
v% y2 A5 G% Q9 k* w - GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | \2 w# c- s% b" V1 G# E; `
- GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | \
$ `. m, X B: X9 P ]' L) d6 x4 H - GPIO_Pin_15;" m8 Z. }; B) Z) L" a3 p
- GPIO_Init(GPIOF, &GPIO_InitStructure);
$ p6 L) c; e: |# m - //PG口# E- D6 u& Y& O5 h. D9 j+ d) K
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | \
/ {: T- C2 e4 G2 p1 y- U - GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;( }6 J" ?# s; R, A4 g
- GPIO_Init(GPIOG, &GPIO_InitStructure);
9 ~4 Z- a; ]" X* H; U+ v( Q - //PD口
- B% n0 w4 z6 c. U4 I* `# o - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
6 W! G8 g: I; X - GPIO_Init(GPIOD, &GPIO_InitStructure);* E1 n$ R4 r; A2 L% H/ m
- : j v9 E4 n6 W5 }; J
- //NOE和NWE配置
/ k' q" e, v) Z6 `. R4 P - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;* g& f" B0 o4 Q9 N% {
- GPIO_Init(GPIOD, &GPIO_InitStructure);; z. ]& O ?- E$ u6 e$ e7 [ J
- 8 L- T3 ?9 @5 V% L! R( w
- //NE2配置9 E- n; V F( K; {' Y; i
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 1 S( V+ Q' O4 [, |$ n$ ]+ I# {
- GPIO_Init(GPIOG, &GPIO_InitStructure);
, h Y) O2 b$ C- \1 } -
2 X2 d5 G& w+ m3 \. { - //NBL0, NBL1配置
3 T7 V A! i0 K( m' s% @ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; 9 u0 d# W$ ?, n J% A& C
- GPIO_Init(GPIOE, &GPIO_InitStructure); $ k; \3 T* a% ?* B
- , {) e3 | g3 O3 R! n
- //FSMC配置
1 ?4 e" F+ G: t" ^0 B; Y8 H3 ~3 _ - //地址建立时间$ z/ ]! P1 I) b7 s4 b$ R
- p.FSMC_AddressSetupTime = 0;
0 L( ` p* q+ J - //地址保持时间& T) \7 j g6 ?1 X7 ?
- p.FSMC_AddressHoldTime = 0;( [) [# ]- e% K' {1 x V
- //数据建立时间; O9 C5 [/ V$ [& T
- p.FSMC_DataSetupTime = 5;8 O: @& r7 Q4 Q `2 d3 A g
- //总线恢复时间
# ]* u0 t" D& c' k0 F - p.FSMC_BusTurnAroundDuration = 0;
9 A. b0 {- d( i - //时钟分频因子
/ Z7 U8 s- L* K' `3 L3 q- I - p.FSMC_CLKDivision = 0;
3 f! g5 N6 e0 ^* S* C) p - //数据产生时间
* }; |2 Y- s# a+ f) _" y - p.FSMC_DataLatency = 0;6 q9 _0 {9 S5 T. s
- //控制器时序3 U1 A/ b, |5 c* X+ I
- p.FSMC_AccessMode = FSMC_AccessMode_A;
: K& s% q- L8 ^0 ~* H" _: v& e - $ g8 M$ ~- }; a9 S
- //总线参数配置+ z/ s. W' v, Q+ S
- //使用FSMC的Bank1的字块2
1 z4 F# J1 S5 G" K - FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM2;2 y4 A/ l3 M, I- r& `" O1 D
- //禁止地址数据线复用
* k% K4 K c5 M4 Y& n - FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;$ h+ l" k1 G( c$ Z
- //存储类型为sram1 U6 A, G" {$ [
- FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;4 m5 N' r% j/ W0 [% A% e, j
- //存储器位宽16位
# k) Y, M4 L! `8 C w7 v - FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;8 B% t/ Q+ J) k. C
- //关闭突发模式访问
" a% a5 n6 c( C( G/ i8 M - FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
Q6 B) S" H' u9 z! U# r4 M - //使能突发访问模式后才有效,等待信号极性
7 v( I+ Y4 q+ s! p2 {; s - FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;: X5 V7 G6 \* p3 s
- //使能突发访问模式后才有效,非对齐成组模式8 @6 g8 t; y, ~
- FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
. u) A" s( {9 d- [& x1 k - //使能突发访问模式后才有效,配置等待时序
* L6 s: Z! M+ Q1 B2 n. r3 _1 } - FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
$ z1 X1 ^7 t5 D8 {. [9 `9 e - //使能写操作8 s2 M& _6 Z" _9 n( F
- FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;- I' _. f7 }5 L
- //使能突发访问模式后才有效,关闭等待信号
, ]) ?4 f* I9 {4 Q7 ?$ J7 n - FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;1 y( e% G3 T7 C; |, D' {- I" ^
- //扩展模式使能0 g4 R2 ~: a4 I* u- F5 c' M! |1 i
- FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
* o% q& @3 B" ^, M8 w" D! v; y - //成组写使能位+ V& ]5 h. W: i7 T0 m
- FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;: a& _8 j$ e' R
- //读操作时序操作
# Q& h4 |4 ^1 y4 u" j - FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;. u' g r! e* ^$ D$ f( M
- //写操作时序参数$ h( H- s) T, q- a' N
- FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
' |. S8 Q: r7 x" [3 k - //初始化FSMC总线3 l3 |7 _, S+ E3 H
- FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);. u% \& b0 {. J
- //使能FSMC Bank1_SRAM Bank
( ^& F. N8 L I3 Z0 H0 p* u - FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM2, ENABLE); 5 M) C" Y0 S$ b Z3 F+ l
- }# ?& y8 j" H0 P/ m
-
% h9 X4 n: J- u - /*********************************************************************6 ], \5 v; h2 m" |
- * 写入数据包
6 r+ ]: m% q5 p g3 g8 c - *输入:pBuffer:数据指针. F+ m1 R5 S- {: }5 o& h& E
- * WriteAddr:写入数据地址: H, n% o/ ~: m( }
- * NumHalfwordToWrite:数据长度,单位半字,即2字节
9 {: |" Y$ y# P1 i( A5 P$ c- p) G' P - *返回:无1 P6 u* ^( Q& n
- **********************************************************************/
2 ]5 f/ u+ o3 x& @" K N. d$ E - # q5 q+ _" ? H6 A! Z- P" ]( G
- void FSMC_SRAM_WriteBuffer(uint16_t* pBuffer,uint32_t WriteAddr,uint32_t NumHalfwordToWrite) x: U0 n' K/ |& L1 @8 u
- {
" F' T8 y P L( X' l& ] - for(; NumHalfwordToWrite != 0; NumHalfwordToWrite--)2 s8 V' d8 y; U ]. Z
- {, Q7 \' n4 L: `, E8 Y1 j
- *(u16 *) (Bank1_SRAM2_ADDR + WriteAddr) = *pBuffer++;5 C2 g& S4 {$ ~' x# m, ^: S8 t
- WriteAddr += 2;" t3 u) K0 I! r$ i6 B/ {# c3 q! b9 p
- } $ h. P; C3 M/ {+ ~$ ^
- }
6 i; H0 I ^. g; b -
% q8 x' I! P8 j! M5 B7 q- D; Y* W - /*********************************************************************; u& }) i: b4 s) j6 K4 _! `& x6 O6 l" S% N
- * 读取数据包% s" O* `1 Y, e3 X# i
- *输入:pBuffer:存放数据的指针
3 Y% x9 w6 w6 Q - * ReadAddr:读取数据地址* U& `( q! x5 i4 R; L
- * NumHalfwordToRead:读取数据长度,单位半字,即2字节1 L. u$ A& g% Y! l
- *返回:无# h5 D" ]5 [( p/ h R8 I" B% \2 ?# @
- **********************************************************************/
) K5 b6 W- r4 t5 {: n( W3 o$ [: j - 7 b4 l# t) P( r
- void FSMC_SRAM_ReadBuffer(uint16_t* pBuffer, uint32_t ReadAddr, uint32_t NumHalfwordToRead)# u1 A% n: v$ d" B. y
- {
, J+ p) m0 M/ M. k" I/ q4 @& K, x) [ - for(; NumHalfwordToRead != 0; NumHalfwordToRead--)
$ I9 `: ~, G, G) x9 C - {5 H- s7 p1 C! q9 m, s$ W
- *pBuffer++ = *(vu16*) (Bank1_SRAM2_ADDR + ReadAddr);
5 R3 J* j, ~1 t) C/ |% s9 V+ [ - ReadAddr += 2;' V& Z" f5 x9 D# W
- }
3 x- _ z" J5 |: P) \( d0 _ - }) O/ p- V# f- m1 ]& r# X+ k
-
8 J1 j/ ^7 o1 _" p' H$ ] - /*********************************************************************) p% v( n+ x1 Z ^2 P) r4 p
- * 写入半字数据! X8 a9 d/ H+ x0 r/ j
- *输入:WriteAddr:写入数据地址- _6 k+ I$ V, g' y
- * data:数据
8 Q% a- ` I3 R - *返回:无
" o5 t8 K3 K$ z1 S: p7 m - **********************************************************************/: w) B' j k8 v. k
- % _% E$ F- P% L7 P6 q% m
- void FSMC_SRAM_WriteHalfWord(uint32_t WriteAddr, uint16_t data)+ |: q: [# T* e; |$ C: P
- {
7 \; P- U8 r v5 K" v. b - *(u16 *)(Bank1_SRAM2_ADDR + WriteAddr) = data;
+ n7 b9 ^3 o1 t0 y- C: c - }
7 q, F$ |. P1 |9 r -
5 a8 H3 a/ L, Y - /*********************************************************************( B4 D$ }, C; E- Y
- * 读取半字数据
% w7 e5 [2 W0 x) c5 q - *输入:ReadAddr:读取数据地址
% h4 [9 L* X6 R - *返回:读取的数据
. g$ D6 d; W) y8 E ]( B - **********************************************************************/
# b& }; [$ n, p -
5 C3 }2 p$ C" r% A7 L - uint16_t FSMC_SRAM_ReadHalfWord(uint32_t ReadAddr)
# u, T' ` H" q: j, X# p) [ - {" a9 I$ A2 [% R( E. C2 u
- return (*(vu16 *)((Bank1_SRAM2_ADDR + ReadAddr)));
# R1 g; D! I8 h' h$ J/ a - }
% b# P: u: R0 o& i- B7 M$ P; G - </font>
复制代码 测试代码:
) r: K- a% [; ~0 B' K! J" V( {main.c4 X& O+ B$ C3 b: l* l* D& b' a
- <font face="微软雅黑" size="3">/*********************************************************************/ ~7 ^# P/ `2 s
- * 无线定位基站程序( |* Z4 ^7 w3 @1 O! Z
- * 主文件
2 B% q' k, @/ U5 V2 k5 u - * (c)copyright 2013,jdh; w6 P! q$ m5 Y6 g$ _- ~
- * All Right Reserved
& [0 e) s/ X: P' [ - *文件名:main.c
6 m8 r$ ?) u% w - *程序员:jdh7 y4 ]2 s9 S' w' \9 J
- **********************************************************************/ O) p& }- E; r2 f+ O
-
, Q- H; G: F' o# t% {. }3 W& `* I - /*********************************************************************
* }& \9 B2 ?$ e, u* j - * 头文件8 C2 W' R' I( a# ~; O+ G
- **********************************************************************/
) L$ B. Z7 m! }: z4 W8 s3 U -
8 ?1 l6 J" ^6 ]6 y4 ]) v1 o/ O/ n - #include "public.h"
& Z# I U8 i5 l2 \6 B" y2 r - 9 p& \, J5 ^9 Z) f
- uint8_t test_sram[100] __attribute__((at(Bank1_SRAM2_ADDR)));
8 R2 Z# {% R4 c/ Y6 T1 |# l( ], z -
0 {: P/ w1 k, F; a" d( C" B7 v - /*********************************************************************
* ]6 Z' U6 j/ e2 ~ - * 函数
: D( Q9 Z- v9 b' S+ t6 { - **********************************************************************/: J! Z$ y( q' @2 V1 ^+ ^) s
- 6 m& C) }; x( z4 h6 E
- int main(void)# S* c% @7 P/ g7 n
- {
$ x) k6 i$ `0 s( r% ]6 @ - uint8_t i = 0;5 i# ?/ v; V' ?2 b
- uint16_t buf1[3] = {1,2,3};
' a6 F7 v4 f! i- z# a3 f6 n' b! B$ ^ - uint16_t buf2[10] = {0};
$ C5 ^. f4 _! f: Y - 7 y! h! T. ~. D' T: T8 s% u r8 g# m
- //初始化设备: t) ?" O1 B( K& o
- init_device();3 c/ t# H- ^9 {( @3 Y+ c
- ; `* v- U! Q. w X5 R
- #ifndef DEBUG " t/ t; h' l e7 O1 K7 |
- //打开内部看门狗
' T& W9 E2 Z5 I8 B# v! ? - inf_enable_iwdg();" F5 |# g7 D' B$ o, j+ D
- #endif
2 s( b6 d2 T9 D& E -
& P- ^7 ^0 C$ Q: l0 U# {* S7 R - //sram测试代码/ k4 |$ }6 I _: G( S) r4 e
- //FSMC_SRAM_WriteHalfWord(0,1);+ n) E/ {7 x- ?" a
- //FSMC_SRAM_WriteHalfWord(2,2);
: ^* p) v2 i+ Y ~ - //FSMC_SRAM_WriteHalfWord(4,3);
`, f8 S9 r* ?$ } - //Test_Data = FSMC_SRAM_ReadHalfWord(2);
! f% e) E7 m- `% I4 m9 p( s( L4 d - //FSMC_SRAM_WriteBuffer(buf1,0,3);
, i$ [* ]/ i) K" f: K - //FSMC_SRAM_ReadBuffer(buf2,0,3);& C+ _2 Q. w1 o; x! W2 u
- test_sram[0] = 5;
7 G7 D9 `$ g1 W9 y0 f - test_sram[1] = 2;
/ Z2 ]# O& k" T) i' K - test_sram[2] = 3;1 B B7 l. A, N' S
- FSMC_SRAM_ReadBuffer(buf2,0,10);! Z8 z' t7 {; n' J, K! b
- __nop();
$ i5 M' G/ L7 N& j* N4 P -
- e6 m( T2 q& V( T7 c - //状态机执行
! c4 ^+ C7 Q5 A( u5 \: i - while (1)
2 R. L# i) P; w ] - {/ z3 C/ @% W0 m7 N
- for (i = 0;i < 6;i++)4 b0 m( d$ _7 g9 g
- {
9 z' m2 X3 }0 }) {( D - //inf_set_led(i + 1,LED_ON);
. |# h; r+ E. g) r - inf_delay_ms(10);9 T4 U. D& P. K3 T# ^/ P# M2 P
- //inf_set_led(i + 1,LED_OFF);$ r( J! ~4 `1 h5 \% H& T( | y
- inf_delay_ms(10);; D) V4 E/ Q7 |) u
- }
1 F4 `, q# }, @/ ~3 L9 H - }; r/ ^0 v4 }7 P6 h5 L, U3 v
- }- O# f1 ^9 i1 A7 `- I7 p2 K
- * u2 `% U' u4 U' s. X
- #ifdef USE_FULL_ASSERT! U6 y- Y* ~9 J: z; _' U
- /**
. g& `& P" B l2 g - * @brief Reports the name of the source file and the source line number4 V/ x( f. t- r) F6 }6 o6 S% l2 G
- * where the assert_param error has occurred.9 R" c5 N% M. }# p; a$ ?
- * @param file: pointer to the source file name
/ V* `4 v: U* J! \ - * @param line: assert_param error line source number# I h; ~* V7 j9 k3 o% u* ~
- * @retval None
% }) ~5 c2 x4 i6 E - */
; D. F2 ?$ g; `# e# _ - void assert_failed(uint8_t* file, uint32_t line)4 L; B) f5 u: e5 j- R
- { ; D: N4 [: ?# ?: i2 u
- /* User can add his own implementation to report the file name and line number,
2 e( C! ]$ k- `- r4 K4 I5 ` - ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */& n% y1 A7 g" ?$ f; V, |$ u( W
-
" [5 E& Q9 F7 p: R% P8 e! L - /* Infinite loop */
. `2 U2 s" i( m3 o - while (1)5 V, p" k, K+ ^8 @# u
- {3 U# }- \* _0 E$ Y0 h: e2 W
- }) @4 }4 K3 s" O
- }4 o" o' w9 ~& X; a+ h
- #endif</font>
复制代码 5 u. P) o0 p& P6 E, d7 O
N' t; s8 ?& ]/ e* q; v' ^# z" ` |