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

【经验分享】STM32的FSMC地址线对应关系通俗易懂解读和和驱动TFT-LCD的原理

[复制链接]
STMCU小助手 发布时间:2022-4-10 17:06
当 Bank接的是 8 位宽度存储器的时候:HADDR[25:0]对应FSMC_A[25:0]1 u1 O6 _3 T" b; L8 i3 n4 L2 k
当 Bank接的是 16 位宽度存储器的时候:HADDR[25:1]对应FSMC_A[24:0]5 S) H- g- p2 K& C1 I2 H

4 N& J1 O! W& n搞懂这个地址对应关系前,需要先明白FSMC的概念。. Z( q4 o$ ^0 I8 ]

$ g5 M2 M' m1 Z, sFSMC是灵活的静态存储控制器,顾名思义它是用于驱动存储类器件的一种接口并且带有时序的自动控制,所以叫存储控制器。接口支持包括SRAM、NOR FLASH、NAND FLASH、PSRAM等存储器。STM32的FSMC将这些设备进行了划分分别是NOR/PSRAM、NAND、PC卡,他们共用地址线和数据线,通过片选来做区分。. S& J$ U& k; m% j  s

9 Z. Z! i+ C4 Y1 ?1 UTFT-LCD之所以能够使用FSMC是因为它的接口跟SRAM很相似:" B0 e) \" R' J+ t. g& w0 V
# P6 r4 e1 c. h8 b
SRAM的接口一般包括:地址线、数据线(8080并口)、片选、写信号线、读信号线,如果支持字节控制还有UB/LB线。$ R, E& x7 I4 q7 D1 D

) q: E  _3 x* p, z9 ]TFT-LCD的接口一般包括:RS(命令数据控制线,用来区分发送的是命令还是数据),数据线(8080并口)、片选、读、写, u" g7 E) t3 p3 }) Z

( r$ J) m; |4 ?  u对比两者的接口线可以发现,SRAM有地址线,而TFT-LCD没有地址线,其他线都相同。由于RS线的使用方式就类似于地址线所以就可以把RS信号线当作地址线来用,两者的区别是SRAM有多根地址线,而TFT-LCD只有这一根RS,所以当我们使用FSMC驱动TFT-LCD的时候其实我们只使用到了一根地址线。
" M7 V2 p- w" H0 _# G5 _8 `4 g0 `0 I& S' S) @- Z; e( m1 g  U
这样的话,我们就把TFT-LCD当作成了一个SRAM来用了。
7 T( {- f9 H' q2 a. Y6 i$ I1 I+ C3 R% o& `8 U; ]
回到文首,一般SRAM、屏幕器件等为了访问速度快,它会使用8080并口的16根数据线进行传输数据,但是STM32的HADDR他是按照字节寻址的,所以最小访问单位是字节,TFT-LCD屏幕由于使用的是8080并口,所以它的数据访问是2字节大小,那么就引出HADDR地址与TFT-LCD地址映射关系。' @, W8 I. e, [7 l
. p8 c: l3 H& S' t5 y0 e
回到文首,我们把HADDR和FSMC的地址对应关系抽象成访问数组的形式,方便理解:$ f  w6 T1 I, N
) l6 `' j5 ~  _& y! `( I
我们把地址线的对应关系当成访问数组的索引:index' J- E' \  o, b7 \$ M; e
8 @8 K; ]9 l" B! y) b0 n( z  H8 b
STM32的HADDR是按照字节寻址,所以把HADDR当作一个数组:u8 HADDR[100];7 s' B% C1 L8 X5 G

. n8 C3 _3 V% u6 A当FSMC所外接的器件是8位宽度存储器的时候,我们把外部器件也当成一个数组:u8 DEV[100];! C( [# n" h# z0 G8 Z7 `9 I
" b: f- _9 o7 c% b" S0 v2 t
这样的话STM32通过HADDR发起访问,HADDR[index]直接能够对应上DEV[index],也就解释了HADDR[25:0]对应FSMC_A[25:0]的地址线是一对一进行对应的。
2 d" a- c7 W8 W& q( M$ n/ n) P
. A$ {& [0 G1 S1 [; D; x" |; O, K当FSMC所外接的器件是16位宽度存储器的时候,例如TFT-LCD:9 d8 @% q! P. j3 I

5 {0 P' h% A, ~把外部器件当成一个数组就变成了:u16 DEV[50];
  J2 S6 q! ]! X# A' s% P( y, D; t/ j7 A
如果访问起来还是一对一index对应:) [0 \' P) e& I* D" d. D1 ~! [+ ^3 q' y

+ m9 A0 p  m9 U- u4 ^index=0的时候,HADDR[0]->DEV[0],
3 w9 w$ Y  y( l8 |) M) Yindex=1的时候,HADDR[1]->DEV[1],9 K- Z  A: n3 _# \- j7 _9 l

9 @7 J8 L& W) F! u由此类推…
8 x$ P# ~* p3 D* X# E# Y
9 O" u7 l& y& \: o& J3 _这么访问是有问题的,由于HADDR是u8类型的,而DEV是u16类型的,当index=1的时候,HADDR本来想访问的是DEV地址1这个地方的数据那么应该返回DEV[0]的高字节,但是却返回的是DEV[1]数据,这就出错了,解决办法可以这么对应:! z0 \) K+ Q/ f; j% u
; Q. o7 y( [3 @1 @
index=0和1的时候,对应DEV[0]& f7 z9 t8 D6 g- |+ i* k& q: U
index=2和3的时候,对应DEV[1]
/ {3 O3 r2 N, r1 h1 I8 K$ {% Rindex=4和5的时候,对应DEV[2]9 K/ `4 k; C+ m4 J6 h  X

# Z, E' j6 E' T+ p0 D/ m由此类推…
8 h9 d  {+ H6 S! D4 Z  d* z5 X% h! w2 G* o; n0 y
就是让HADDR的index除以2之后,在用作DEV的index,让HADDR的一个地址对应DEV的两个字节,这样就能数据就能对上了。(注:除以2就是右移了一位)。
! v. \1 P0 l' h% T* v( @3 ~0 w1 X( M; d6 T1 N! g& f1 @+ Y' h
在把这个数组的访问模型套到实际的HADDR和FSMC_A的地址访问上,那么就是:# \! o# [9 i: c$ O
/ g9 N) {/ H4 V: \8 m
HADDR[25:1]对应FSMC_A[24:0],HADDR地址线0不使用,从地址1开始与FSMC_A地址线0开始对应,这样的话FSMC_A接收到的地址就是HADDR发过来的地址右移了一位。
* E3 E: E) ~# o- X, j+ C) j. x/ n$ l" J5 J' ~- h) B
这样就实现了HADDR的一个地址对应FSMC_A的两个字节,也就是书册说的Bank接16 位宽度存储器的时候,HADDR[25:1]对应FSMC_A[24:0]。
0 f" E! v" A3 N————————————————* M1 l1 W5 }9 R4 {* H5 {
版权声明:本文为CSDN博主「雍正不秃头」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* h9 o1 o9 }, B* r; J- {: y
原文链接:https://blog.csdn.net/qq153471503/article/details/111603813
9 _+ R! ]1 k. x8 l8 ]; g* F: N
7 R0 X* Q4 j2 m) O
收藏 评论0 发布时间:2022-4-10 17:06

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版