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

基于STM32F103ZET6使用FSMC驱动TFT的学习 (三)

[复制链接]
EEFOCUS小白 发布时间:2015-4-1 10:11
a、首先是时间参数的配置,我们在初始化的时候设置的bank4,所以这里对应的也是bank4,本函数主要使用了两种类型的结构体对FSMC进行配置,第一种* r% S, H2 q; s8 ?$ [
为 FSMC_NORSRAMInitTypeDef类型的结构体主要用于NOR FLASH的模式配置,包括存储器类型、数据宽度等。另一种的类型为FSMC_NORSRAMTimingInitTypeDef
) \) G; ?/ a' x: l6 ]
首先是这个结构体FSMC_NORSRAMTimingInitTypeDef,找到他的定义:
成员变量有

0 I) G% H; ^/ P2 t6 n6 I9 e
  • uint32_t  FSMC_AccessMode   
  • uint32_t  FSMC_AddressHoldTime   
  • uint32_t  FSMC_AddressSetupTime   
  • uint32_t  FSMC_BusTurnAroundDuration   
  • uint32_t  FSMC_CLKDivision   
  • uint32_t  FSMC_DataLatency   
  • uint32_t  FSMC_DataSetupTime   2 l" c4 l- [: _$ p, L, O3 o
uint32_t  FSMC_AccessMode uint32_t  FSMC_AddressHoldTime uint32_t  FSMC_AddressSetupTime uint32_t  FSMC_BusTurnAroundDuration uint32_t  FSMC_CLKDivision uint32_t  FSMC_DataLatency uint32_t  FSMC_DataSetupTime

: `3 u6 u7 q1 q3 z- k( p: s8 P2 z
; |* s1 p6 O1 N! ^% V1 q& c
FSMC_AccessMode:Specifies the asynchronous access mode,用于同步模式,它的取值有以下几种,参考手册上面显示:模式A —— SRAM/PSRAM(CRAM) OE翻转,所以这里我们选择的是模式A0 ]8 R  A! ~9 l  s: l7 ~9 r
#define
FSMC_AccessMode_A   ((uint32_t)0x00000000)
#define
FSMC_AccessMode_B   ((uint32_t)0x10000000)
#define
FSMC_AccessMode_C   ((uint32_t)0x20000000)
#define
FSMC_AccessMode_D   ((uint32_t)0x30000000

) R1 B; f  s# q8 t/ s
, }% D+ N# E' t  |8 U( F
FSMC_AddressHoldTime:Defines the number of HCLK cycles to configure the duration of the address hold time. This parameter can be a value between 0 and 0xF.地址保持的时钟周期!
FSMC_AddressSetupTime:Defines the number of HCLK cycles to configure the duration of the address setup time. This parameter can be a value between 0 and 0xF. 明显是地址建立飞时间周期
FSMC_BusTurnAroundDuration:Defines the number of HCLK cycles to configure the duration of the bus turnaround. This parameter can be a value between 0 and 0xF.这个应该是指总线翻转周期么,不是很了解
FSMC_CLKDivision:Defines the period of CLK clock output signal, expressed in number of HCLK cycles. This parameter can be a value between 1 and 0xF% C( V+ P, ?& j
明显是指HCLK的分频系数7 N- u7 _, O2 \( g* O; I9 h
FSMC_DataLatency:Defines the number of memory clock cycles to issue to the memory before getting the first data. The value of this parameter depends on the memory type as shown below:9 ~/ b! R7 F" }% u9 |/ g0 M

5 _9 g% E' q$ u! F% g* i3 L5 m
  • It must be set to 0 in case of a CRAM
  • It is don't care in asynchronous NOR, SRAM or ROM accesses
  • It may assume a value between 0 and 0xF in NOR Flash memories with synchronous burst mode enable 8 r( p6 l4 ~# ~6 Z7 z
:数据延迟时间注意了,这个可是有限制的,在我们控制LCD的时候倒是不用管它,应该是可以设为0的
5 V6 ~) [& M2 d6 \5 n: I9 p+ w
FSMC_DataSetupTime:这个相应的就是数据的建立时间了
  l( s, ^8 }1 B
通过对比,发现上述配置是可行的,不过大家也可以按照要求更改。理论上,在速度要求不是很高的场合,大一点是没有关系的,但是下限得注意,具体是多少,我也走不知道,等以后再说吧!
然后就是看这个结构体了FSMC_NORSRAMInitStructure,成员如下:
( _1 A2 M3 i4 i- y! p" p

  p/ t2 Q% r6 A3 `
似乎有些复杂,同时也说明了它的功能强大吧!
FSMC_AsynchronousWait:Enables or disables wait signal during asynchronous transfers, valid only with asynchronous Flash memories,明显就是使能等待同步信号否?
FSMC_Bank:这个应该是bank的选择吧,明显取值有以下几种:
2 X% n6 w8 ~7 {/ [. y
#define
FSMC_Bank1_NORSRAM1   ((uint32_t)0x00000000)
#define
FSMC_Bank1_NORSRAM2   ((uint32_t)0x00000002)
#define
FSMC_Bank1_NORSRAM3   ((uint32_t)0x00000004)
#define
FSMC_Bank1_NORSRAM4   ((uint32_t)0x00000006)
% l2 q' W( R0 \$ B1 D$ I
FSMC_BurstAccessMode:Enables or disables the burst access mode for Flash memory, valid only with synchronous burst Flash memories.这个什么呢?不懂继续看吧!
FSMC_DataAddressMux:Specifies whether the address and data values are multiplexed on the databus or not,数据地址引脚是否复用,明显这里我们不需要!!
FSMC_ExtendedMode:Enables or disables the extended mode.,外扩模式否?应该是不用的
FSMC_MemoryDataWidth:位宽,我使用的是16位的TFT,所以应该是16,看看取值: R+ h& x! m& e  O
果然:
#define
FSMC_MemoryDataWidth_16b   ((uint32_t)0x00000010)
#define
FSMC_MemoryDataWidth_8b   ((uint32_t)0x00000000)
FSMC_MemoryType:Specifies the type of external memory attached to the corresponding memory bank.意思应该是当我们外扩存储器的时候,分配哪一个bank吧,看取值。应该是0-3吧!看结果似乎有些问题,它是指外扩的存储器类型
#define
FSMC_MemoryType_NOR   ((uint32_t)0x00000008)
#define
FSMC_MemoryType_PSRAM   ((uint32_t)0x00000004)
#define
FSMC_MemoryType_SRAM   ((uint32_t)0x00000000

8 y. @8 b3 [; \/ q: T
FSMC_WaitSignal:Enables or disables the wait-state insertion via wait signal等待信号,等待状态与否
FSMC_WaitSignalPolarity:Specifies the wait signal polarity, valid only when accessing the Flash memory in burst mode,是指奇偶校验信号么?但是这个只需在flash的burst模式里面设置。
FSMC_WrapMode:Enables or disables the Wrapped burst access mode for Flash memory翻转模式?
FSMC_WriteBurst :Enables or disables the write burst operation写操作的
FSMC_WriteOperation:Enables or disables the write operation in the selected bank by the FSMC
FSMC_WriteTimingStruct! v, b+ [. S' [$ b: E0 a; r  g* {  T) t
FSMC_ReadWriteTimingStruct还有两个这样的结构体! Timing Parameters for write and read access if the ExtendedMode is not used  ,当我们没有使用外扩模式的时候需要配置,显然这里需要配置的!
4 e  Y2 i3 ?( w. c) {这两个结构体就是上面分析了的。所以我们只要执行这个语句,就能完成FSMC的配置了8 Y8 w, }! ~7 M0 a3 k% D
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  * G2 Z8 E7 ^$ e2 ~2 k, s0 x

& m! M& q' E# }至此分析完毕!5 J; S( S: S  ?1 k* z' d( Y! C
然后就是简单的初始化TFT了- V0 f- {% P* x% G; y" a
个人觉得有几点需要注意的地方,也总结一下!# k/ L! R) Z4 e- b8 J
关于使用16位宽的时候的地址的问题!5 J( ?4 h% n% l3 }% q& m; g( b
用的第17位,插16位的线) S" f; p6 v( n3 }
假如我们这样访问
*(volatile unsigned short int *)(0x60020000)=val

+ |# f( ?) z3 ~# m
这时候该地址的bit17位为1,因为我们使用16位宽模式,先看下面一张图
6 q) Z# y5 O# ~# \; c5 v) c
: ~5 u. t8 e. t4 G* o' _
赞 收藏 评论2 发布时间:2015-4-1 10:11

举报

2个回答
stary666 回答时间:2015-4-1 11:06:23
没有简化的代码吗?
为什么是EEFOCUS小白 回答时间:2015-4-3 12:15:35
没有哦   

所属标签

相似技术帖

官网相关资源

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