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

STM32 FSMC驱动TFTLCD 难点解析

[复制链接]
sayuenala 发布时间:2017-8-23 23:10
本篇文章三个主题:FSMC有关配置、一串字符显示原理、汉字显示原理。。下面进入正题
9 m6 Y% U4 l9 W8 r: C一、FSMC的有关配置(博主用的是FSMC_A10):2 M9 G3 m2 t, c6 e1 n
      FSMC的介绍就不介绍了,网上一大片。我们就讨论讨论为什么用FSMC的地址线与TFTLCD的RS引脚相连?以及我们如何往LCD写数据/命令?
, ^- Q+ |0 L. u% E) k- J7 ~, ?      FSMC称为可变静态存储控制器。可变:之所以称为“可变”,是由于通过对特殊功能寄存器的设置,FSMC 能够根据不同的外部存储器类型,发出相应的数据/地址/控制信号类型以匹配信号的速度。(这点很重要,后文会提到。。), Q5 Y( o( j0 _- ^0 c
      简单说明一下吧~为什么不拿STM32的IO口直接接LCD的对应引脚?(看看我上边发的链接就清楚了),大致就是操作麻烦,效率低嘛。。好,FSMC是吧TFTLCD当成SRAM设备来用的,其操作时序和SRAM的控制完全类似,唯一不同的就是TFTLCD有RS信号,但是没有地址信号。0 q3 J1 j/ {/ \
      TFTLCD是通过RS信号来决定传送的数据是数据还是命令,本质上可以理解为一个地址信号,比如我们把RS接在A10上面(当然A0-Axx都可以)。那么LCD到底是怎么判断我们写的是命令还是数据呢?下面是重点!!!
3 o& l9 k6 H5 [* T' s6 P      以战舰的程序为例:, E8 e3 d* p' i1 i
20160513111249089.png

9 b) @* u! U! a5 c! E8 S      这里因为数据线宽度是16位时,HADDR[25:1]->FSMC[24:0],相当于右移一位。下面是战舰给出的A10偏移量:: @- {7 m2 O( M* H
3 H  `# A; w' E9 D
      0x6c000000相比大家都没有问题。按理说A10的偏移量应该是2的11次方(0-10)=2048,转换为16进制就是800,那也比7FE大两位!
0 G& f# K6 V# Q6 ]* @      (这里复习下基础知识:RS=0,写命令;RS=1,写数据。)6 f8 ~% n& v* R7 j
      为什么呢?我是这么理解的(倒推法):按我的思路推,如果我们取LCD->LCD_REG的地址0x6c000800的话,当地址右移时,第10位就不是0了,而是1。对应RS=1,那么对于LCD就不是写命令了,而变成写数据了;又因为结构体内部成员对齐规则,LCD->LCD_RAM的地址就是0x6c00802了,当地址右移时,第10位也是1,对应RS=1。还是写数据!!!!
7 @2 w9 y; a- o0 w. \2 G      推到这应该明白了。如果按正常算法来计算的话,RS就只会等与1,就不会区分写命令和写数据了。
1 z0 e  z- e* w6 ~$ e      故我们要将A10的偏移量减去两位。就得到图中战舰的0x000007FE了。LCD->LCD_REG的地址就是0x6c0007FE了。当地址右移一位时第10位是0,对应RS=0,为对于LCD就是写命令了;而因为结构体内部成员对齐规则,LCD->LCD_RAM的地址就是0x6c000800了。当地址右移一位时第10位是1,对应RS=1,为对于LCD就是写数据了。这样FSMC就能区分传送的是数据还是命令了。。大功告成!
) E% I# H/ {( a7 ]) M! ~      到这里,问题来了:我们就控制A10这一根线怎么就可以完成读写了呢?那些十多个引脚的电平又是谁在控制呢?4 ~* l& J( w$ ^: C+ x: S
      这个神秘的‘人物’就是上文我们提到的FSMC啦!先看一个战舰上的写寄存器函数:; X$ ?* E( N) J% C1 K5 e9 K* T
20160513111349679.png                 20160513111442374.png ( {$ {# P! o6 `
; B$ _2 l6 ?- d' q5 R9 `8 j2 f
      第一个图:这里的LCD->LCD_REG是一个地址(0x6c000007FE),这里的寄存器序号哦:是指LCD手册里定义的寄存器地址。只要我们往LCD->LDC_REG这个地址里写一个变量(地址)。因为LCD->LDC_REG这个地址是FSMC管辖的。所以这时候FSMC就要勇敢的站出来管了~FSMC会自己生成相应的时序,包括CS、WR、RD和IO方向都是由FSMC控制!这就大大便利了我们对LCD的控制。
( F0 q! F  K" Z. n) m7 Y$ r& T; i         第二个图:这里的LCD->LCD_RAM也是一个地址(0x6c00000800),LCD->LCD_RAM=data;是往该寄存器地址里面写入数据。, \7 |) S1 |# t% m& m# G" A; _

% z7 L, R6 [- w( f7 {二、一串字符的显示原理(战舰)1 @0 U; _7 I' ?" |: ]5 A4 F( u& I" I
      1、比如我们要显示一个字符串LCD_ShowString(x,x,x,"hello STM32");x:是一些坐标哦和字体大小参数,先不管→_→
9 ~8 \" q5 n4 g1 q' x      2、那我们就得调用字符显示函数:LCD_ShowChar();来把一个字符的点阵全部取完。+ x6 }' F0 @# E8 B: y
      3、字符是有点组成的,故在字符函数中不断调用画点函数LCD_DrawPoint();来画点(往LCD->LCD_RAM里写颜色值,这个颜色值在lcd.h里被定义为16位的地址)。! l4 A0 W/ M$ _
      4、至此,在lcd_init()中有过LCD屏的初始化(设置显示参数),就可以显示了。8 j% @* _, d/ R5 f8 ~

$ Y9 ~& i% C- L7 z8 N) _6 K& v5 {      5、简析一下叠加和非叠加的原理吧→_→# }1 s, ?$ d; \" L/ j
      叠加就是字符点阵中是‘1’就用赋画笔颜色,是‘0’就赋背景颜色(那个字符的背景颜色,与全屏背景颜色无关),没毛病!因为最后显示的时候有个覆盖的作用。就是先把全屏颜色显示出来,再在全屏颜色的基础上覆盖上你的字符。所以就显示出叠加和非叠加(只有一个画笔颜色)了。
: @# I$ y8 C. T7 q# ~5 p! N三、汉字显示原理8 u+ }, R& z2 Q& j9 }6 T. b+ N3 ~
      其实汉字显示和英文显示一个原理。很简单!显示的原理就是根据你的汉字字模字节大小来画点。
  ~+ r8 C3 y1 G" T0 U" S1 ?4 W      简单说说哈:大家都知道,字母的显示原理就是两个for循环(博主就知道这个),第一个for是控制‘行’的,第二个for是控制‘列’的。先给两个例子:比如显示一个16*08的字母,第一个for是循环16次,第二个for是循环8次;显示一个24*24的汉字,第一个for是循环72次,第二个for还是循环8次。不知道到这里大家看没看出来什么规律来→_→" w+ w- d7 T& B4 `% e$ H
      规律:第一个for是字模所占的字节数,第二个for是每次画8位(从列最高处往下描8个点),字符显示函数中间会有y-y0的字样,这是判断一列点数是否达到16或者24个了,是就x+1,换下一列。) L% k  W/ t2 M0 v( [
      总的来说,汉字的字模字节说就是比字母字模字节数大。修改的也就是第一个fo和y-y0里面的参数。
9 S' j0 S" }) E% h/ c      博主不才,大牛不喜勿喷哦~!
( L( Y5 t+ z8 p3 v" _- l0 [( i0 U
: m# c: z' C- K- ~
8 G& H8 o) v9 C! N: s
赞 收藏 1 评论2 发布时间:2017-8-23 23:10

举报

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