STMCU小助手
发布时间:2022-4-10 17:06
|
当 Bank接的是 8 位宽度存储器的时候:HADDR[25:0]对应FSMC_A[25:0] 当 Bank接的是 16 位宽度存储器的时候:HADDR[25:1]对应FSMC_A[24:0], F( Z' w( u3 {, m( J/ i 搞懂这个地址对应关系前,需要先明白FSMC的概念。' N. G% O# p: f* q- D- O' M3 N; i* m FSMC是灵活的静态存储控制器,顾名思义它是用于驱动存储类器件的一种接口并且带有时序的自动控制,所以叫存储控制器。接口支持包括SRAM、NOR FLASH、NAND FLASH、PSRAM等存储器。STM32的FSMC将这些设备进行了划分分别是NOR/PSRAM、NAND、PC卡,他们共用地址线和数据线,通过片选来做区分。 n+ |3 H0 S6 I) x @- _+ o- E% k- {' X TFT-LCD之所以能够使用FSMC是因为它的接口跟SRAM很相似:0 B. D6 K* @8 }# M! \ SRAM的接口一般包括:地址线、数据线(8080并口)、片选、写信号线、读信号线,如果支持字节控制还有UB/LB线。 TFT-LCD的接口一般包括:RS(命令数据控制线,用来区分发送的是命令还是数据),数据线(8080并口)、片选、读、写 0 o7 i$ ~. z2 m2 W+ v9 H 对比两者的接口线可以发现,SRAM有地址线,而TFT-LCD没有地址线,其他线都相同。由于RS线的使用方式就类似于地址线所以就可以把RS信号线当作地址线来用,两者的区别是SRAM有多根地址线,而TFT-LCD只有这一根RS,所以当我们使用FSMC驱动TFT-LCD的时候其实我们只使用到了一根地址线。 ; Z; X- r5 U/ \$ d/ \: F* ^% h+ p 这样的话,我们就把TFT-LCD当作成了一个SRAM来用了。/ ^0 K- q1 z- g5 _2 r' d# A8 I 回到文首,一般SRAM、屏幕器件等为了访问速度快,它会使用8080并口的16根数据线进行传输数据,但是STM32的HADDR他是按照字节寻址的,所以最小访问单位是字节,TFT-LCD屏幕由于使用的是8080并口,所以它的数据访问是2字节大小,那么就引出HADDR地址与TFT-LCD地址映射关系。 , v: B; S2 w7 e8 e 回到文首,我们把HADDR和FSMC的地址对应关系抽象成访问数组的形式,方便理解: 我们把地址线的对应关系当成访问数组的索引:index STM32的HADDR是按照字节寻址,所以把HADDR当作一个数组:u8 HADDR[100]; 当FSMC所外接的器件是8位宽度存储器的时候,我们把外部器件也当成一个数组:u8 DEV[100]; 这样的话STM32通过HADDR发起访问,HADDR[index]直接能够对应上DEV[index],也就解释了HADDR[25:0]对应FSMC_A[25:0]的地址线是一对一进行对应的。# Q5 Y2 T- {' I& T8 W ; ?" {+ m7 A; y1 f1 L 当FSMC所外接的器件是16位宽度存储器的时候,例如TFT-LCD: 把外部器件当成一个数组就变成了:u16 DEV[50];% r, L, P" N+ a2 R; H/ ~" n3 X* V 如果访问起来还是一对一index对应: ) A6 q5 _' w; _, L8 A; d. { index=0的时候,HADDR[0]->DEV[0],2 y& Y( n* b' ?! P7 S+ ~8 r index=1的时候,HADDR[1]->DEV[1], …: k1 h4 R- `! x- C 由此类推… + u" g, C+ @- ~) V2 ]. T 这么访问是有问题的,由于HADDR是u8类型的,而DEV是u16类型的,当index=1的时候,HADDR本来想访问的是DEV地址1这个地方的数据那么应该返回DEV[0]的高字节,但是却返回的是DEV[1]数据,这就出错了,解决办法可以这么对应: - a" W( Q- g9 V9 l5 }) \+ u index=0和1的时候,对应DEV[0] index=2和3的时候,对应DEV[1] index=4和5的时候,对应DEV[2] …* ^3 q/ d( Y2 U0 r4 d# L 由此类推…! M" d% \8 k- y 3 a8 z( S$ U# Y2 `5 O5 B3 o' j* c 就是让HADDR的index除以2之后,在用作DEV的index,让HADDR的一个地址对应DEV的两个字节,这样就能数据就能对上了。(注:除以2就是右移了一位)。 在把这个数组的访问模型套到实际的HADDR和FSMC_A的地址访问上,那么就是: HADDR[25:1]对应FSMC_A[24:0],HADDR地址线0不使用,从地址1开始与FSMC_A地址线0开始对应,这样的话FSMC_A接收到的地址就是HADDR发过来的地址右移了一位。 这样就实现了HADDR的一个地址对应FSMC_A的两个字节,也就是书册说的Bank接16 位宽度存储器的时候,HADDR[25:1]对应FSMC_A[24:0]。$ j( L6 R" ?( F H1 D' | ————————————————5 y) ?8 ` X' S$ S. p& X 版权声明:本文为CSDN博主「雍正不秃头」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。9 l6 F7 T5 c2 o7 x! [# R 原文链接:https://blog.csdn.net/qq153471503/article/details/111603813 + N( k( h+ ]' G! [ |
【经验分享】STM32语音识别的智能蓝牙音箱(源程序+原理图+PCB+设计说明书+PPT)
想找个ST芯片
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
技术手册stm32f1xx中的一个小问题
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
微信公众号
手机版