搜索
bottom↓
回复: 87

FSMC讲解,初学者福利。

  [复制链接]

出0入0汤圆

发表于 2012-7-19 22:32:53 | 显示全部楼层 |阅读模式
初学FSMC,找到很多都是程序,很多资料都更官方文档差不多,看不出所以然,反而越看越晕。
我想大多数初学者需要的是一个浅显易懂的教程,
下面转载一个讲解,我觉得挺不错的,大家可以看看。

转载地址:http://blog.sina.com.cn/s/blog_70a7b80201016zf5.html

/************************************************************************/
stm32 fsmc 功能讲解(转)读多几次能大概了解fsmc功能

LCD有如下控制线:
CS:Chip Select 片选,低电平有效
RS:Register Select 寄存器选择
WR:Write 写信号,低电平有效
RD:Read 读信号,低电平有效
RESET:重启信号,低电平有效
DB0-DB15:数据线
假如这些线,全部用普通IO口控制。根据LCD控制芯片手册(大部分控制芯片时序差不多):
如果情况如下:
DB0-DB15的IO全部为1(表示数据0xff),也可以为其他任意值,这里以0xff为例。
CS为0(表示选上芯片,CS拉低时,芯片对传入的数据才会有效)
RS为1(表示DB0-15上传递的是要被写到寄存器的值),如果为0,表示传递的是数据。
WR为0,RD为1(表示是写动作),反过来就是读动作。
RESET一直为高,如果RESET为低,会导致芯片重启。
这种情况,会导致一个值0xff被传入芯片,被LCD控制芯片当作写寄存器值去解析。LCD控制芯片收到DB0-15上的值之后,根据其他控制线的情况,它得出结论,这个0xff是用来设置寄存器的。一般情况下,LCD控制芯片会把传入的寄存器值的高8位当做寄存器地址(因为芯片内部肯定不止一个寄存器),低8位当做真正的要赋给对应寄存器值。这样,就完成了一个写LCD控制芯片内部寄存器的时序。
如果上述情况不变,只将RS置低,那么得到的情况如下:LCD控制芯片会把DB0-15上的数据当做单纯的数据值来处理。那么假如LCD处在画图状态,这个传入的值0xff,就会被显示到对应的点上,0xffff就表示白色,那么对应的点就是白色。在这个数据值传递过来之前,程序肯定会通过设置寄存器值,告诉LCD控制芯片要写的点的位置在哪里。
如果上述两种情况都不变,分别把WR和RD的信号反过来(WR=1,RD=0),那么写信号就会被变成读信号。读信号下,主控芯片需要去读DB0-15的值,而LCD控制芯片就会去设置DB0-15的值,从而完成读数据的时序。
读寄存器的时序麻烦一点。第一步,先要将WR和RD都置低,主控芯片通过DB0-15传入寄存器地址。第二步就和前面读数据一样,将WR置高,RD置低,读出DB0-15的值即可。在这整个的过程中,RS一直为低。
好了,上面就是IO直接控制LCD的方法。假如放到STM32里面,用IO直接控制显得效率很低。STM32有FSMC(其实其他芯片基本都有类似的总线功能),FSMC的好处就是你一旦设置好之后,WR、RD、DB0-DB15这些控制线和数据线,都是FSMC自动控制的。打个比方,当你在程序中写到:
*(volatile unsigned short int *)(0x60000000)=val;
那么FSMC就会自动执行一个写的操作,其对应的主控芯片的WE、RD这些脚,就会呈现出写的时序出来(即WE=0,RD=1),数据val的值也会通过DB0-15自动呈现出来(即FSMC-D0:FSMC-D15=val)。地址0x60000000会被呈现在数据线上(即A0-A25=0,地址线的对应最麻烦,要根据具体情况来,好好看看FSMC手册)。
那么在硬件上面,我们需要做的,仅仅是MCU和LCD控制芯片的连接关系:
WE-WR,均为低电平有效
RD-RD,均为低电平有效
FSMC-D0-15接LCD DB0-15
连接好之后,读写时序都会被FSMC自动完成。但是还有一个很关键的问题,就是RS没有接,CS没有接。因为在FSMC里面,根本就没有对应RS和CS的脚。怎么办呢?这个时候,有一个好方法,就是用某一根地址线来接RS。比如我们选择了A16这根地址线来接,那么当我们要写寄存器的时候,我们需要RS,也就是A16置高。软件中怎么做呢?也就是将FSMC要写的地址改成0x60020000,如下:
*(volatile unsigned short int *)(0x60020000)=val;
这个时候,A16在执行其他FSMC的同时会被拉高,因为A0-A18要呈现出地址0x60020000。0x60020000里面的Bit17=1,就会导致A16为1。
当要读数据时,地址由0x60020000改为了0x60000000,这个时候A16就为0了。
那么有朋友就会有疑问,第一,为什么地址是0x6xxxxxxx而不是0x0xxxxxxx;第二,CS怎么接;第三,为什么Bit17对应A16?
先来看前两个问题,大家找到STM32的FSMC手册,在FSMC手册里面,我们很容易找到,FSMC将0x60000000-0x6fffffff的地址用作NOR/PRAM(共256M地址范围)。而这个存储块,又被分成了四部分,每部分64M地址范围。当对其中某个存储块进行读写时,对应的NEx就会置低。这里,就解决了我们两个问题,第一,LCD的操作时序,和NOR/PRAM是一样的(为什么一样自己找找NOR/PRAM的时序看看),所以我们选择0x6xxxxxxx这个地址范围(选择这个地址范围,操作这个地址时,FSMC就会呈现出NOR/PRAM的时序)。第二,我们可以将NEx连接到LCD的CS,只要我们操作的地址是第一个存储块内即可(即0-0x3ffffff地址范围)。
第三个问题再来看一看FSMC手册关于存储器字宽的描述,我们发现,当外部存储器是16位时,硬件管脚A0-A24表示的是地址线A1-A25的值,所以我们要位移一下,Bit17的值,实际会被反应到A16这根IO来。关于数据宽度及位移的问题,初学的朋友可能会比较疑惑,当你接触了多NOR/PRAM这样的器件后,你会发现,很多芯片的总线,都是这样设计的,为的是节省地址线。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-7-19 22:59:06 | 显示全部楼层
已看。对FSMC不了解,看了一下,还是了解了一点。

出0入0汤圆

发表于 2012-7-19 23:02:54 | 显示全部楼层
http://www.cnblogs.com/hduxyc/archive/2011/05/17/2048099.html这个耶不错

出0入0汤圆

发表于 2012-7-19 23:09:57 | 显示全部楼层
了解了下,谢谢

出0入0汤圆

发表于 2012-7-19 23:49:20 | 显示全部楼层
学习了,谢谢

出0入0汤圆

发表于 2012-7-20 14:08:34 | 显示全部楼层
受教了

出0入0汤圆

发表于 2012-7-20 15:03:00 | 显示全部楼层
学习了,谢谢。

出0入0汤圆

发表于 2012-7-20 16:03:20 | 显示全部楼层
好长啊.......

出0入0汤圆

发表于 2012-7-20 17:25:21 | 显示全部楼层
除了用FSMC来控制LCD,还有其他的嘛???

出0入0汤圆

发表于 2012-11-2 21:36:19 | 显示全部楼层
            学习了

出0入0汤圆

发表于 2012-11-2 21:58:39 | 显示全部楼层
xuexile                              

出0入0汤圆

发表于 2012-11-2 22:54:07 | 显示全部楼层
多谢分享,,,,,,,,,,,

出0入0汤圆

发表于 2012-11-2 23:06:19 | 显示全部楼层
mark一击

出0入0汤圆

发表于 2012-11-15 16:33:07 | 显示全部楼层
多谢分享,,,,,,,,,,,

出0入0汤圆

发表于 2012-11-15 21:17:07 | 显示全部楼层
“  *(volatile unsigned short int *)(0x60020000)=val;
这个时候,A16在执行其他FSMC的同时会被拉高,因为A0-A18要呈现出地址0x60020000。0x60020000里面的Bit17=1,就会导致A16为1。
……
第三个问题再来看一看FSMC手册关于存储器字宽的描述,我们发现,当外部存储器是16位时,硬件管脚A0-A24表示的是地址线A1-A25的值,所以我们要位移一下  ”

初学STM32,有个疑问:当操作  *(volatile unsigned short int *)(0x60020000)=val 的时候,A16会为1,那么其余的A[0,15],A[17,24]是否会为0?如果是的话,那么这些“其余”地址线就不能用于控制其他设备了,感觉会浪费很多IO引脚,而且它们在芯片上的排列还不是有次序的,万一本身是想使用FSMC功能的,但由于“其余”地址线被不小心的连接了其他外围,功亏一篑。


出0入0汤圆

发表于 2013-4-22 00:35:49 | 显示全部楼层
Semiconductor 发表于 2012-11-15 21:17
“  *(volatile unsigned short int *)(0x60020000)=val;
这个时候,A16在执行其他FSMC的同时会被拉高,因 ...

前提是:对应的引脚设置为FSMC功能,才有可能变化,否则还是IO或者其他的功能

出0入0汤圆

发表于 2013-4-22 17:13:05 | 显示全部楼层
有了一个大概的了解,不知道楼主有木有些具体的啊~~?

出0入0汤圆

发表于 2013-4-22 18:00:20 | 显示全部楼层
谢谢楼主分享。

出0入0汤圆

发表于 2013-4-23 01:30:04 | 显示全部楼层
咋一看 FSMC我还以为是有限状态机C实现的教程呢 0 0

出0入24汤圆

发表于 2013-4-23 07:07:56 | 显示全部楼层
学习一下~

出0入0汤圆

发表于 2013-6-13 13:18:35 | 显示全部楼层
学习一下。

出20入70汤圆

发表于 2013-6-13 14:24:12 | 显示全部楼层
讲解的还不错,有加深了对FSMC的了解!

出0入0汤圆

发表于 2013-6-13 15:12:23 | 显示全部楼层
楼主辛苦了

出0入0汤圆

发表于 2013-6-13 15:39:10 来自手机 | 显示全部楼层
不用库,直接操作寄存器的时候,一直不知道FSMC各寄存器真正的地址,究竟是什么??

驱动SSD1963的时候,按照手册里写的起始地址,针对寄存器进行地址偏移

起初把FSMC_BTR1地址设为0x6000 0000+0xA00 0000+0x04,根本没有反应

后来把FSMC_BTR1地址又设为0x6000 0000+0x04,这时七寸屏倒是有了反应,显示出了图形,就是速度比蜗牛还慢!!

后来逼急了,只能忍受慢吞吞的编译过程,用上了库,结果速度就恢复了,能正常快速显示图形了,那个烂手册坑人不浅!
到现在我也不知道把FSMC_BTR1地址设为什么值,才能在不用库的情况下得到正常的刷屏速度??

出0入0汤圆

发表于 2013-9-11 00:27:11 | 显示全部楼层
在搞FSMC

出0入0汤圆

发表于 2013-9-13 09:23:02 | 显示全部楼层
学习了

出0入0汤圆

发表于 2013-10-29 15:59:02 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2013-10-29 17:32:05 | 显示全部楼层
收藏先!不知楼主有没有搞过STM32+UCOS+ADC+DMA,我遇到问题了,一直没有解决!

出0入0汤圆

发表于 2013-10-29 17:42:21 | 显示全部楼层
学习了

出0入0汤圆

发表于 2013-10-30 09:31:36 | 显示全部楼层
mark~!感谢分享

出0入0汤圆

发表于 2013-10-30 12:54:39 | 显示全部楼层
谢谢分享~

出0入0汤圆

发表于 2013-10-30 13:02:52 来自手机 | 显示全部楼层
如果是搞数字IC这方面就很懂了.

出0入0汤圆

发表于 2013-10-30 13:07:03 | 显示全部楼层
先标记下吧。

出0入0汤圆

发表于 2014-2-12 11:57:05 | 显示全部楼层
学习学习,正要用到

出0入0汤圆

发表于 2014-2-12 13:34:38 | 显示全部楼层
谢谢。不错

出0入0汤圆

发表于 2014-2-12 14:03:01 | 显示全部楼层
学习了解

出0入0汤圆

发表于 2014-2-14 20:50:47 | 显示全部楼层
Mark之 很详细!

出0入0汤圆

发表于 2014-7-23 11:59:48 | 显示全部楼层
看了三四遍了  刚刚略懂

出0入0汤圆

发表于 2014-7-23 14:28:31 | 显示全部楼层
学习下,mark

出0入0汤圆

发表于 2014-7-27 23:20:15 | 显示全部楼层
mark啊。。。。。。。。这个需要看看

出0入0汤圆

发表于 2014-9-15 07:46:29 | 显示全部楼层
谢谢讲解,学习

出0入0汤圆

发表于 2014-9-15 08:41:50 | 显示全部楼层
mark    mark

makrk

出0入0汤圆

发表于 2014-9-15 10:17:18 | 显示全部楼层
很不错,值得看一下,直接用IO来读写效率确实会低些

出0入0汤圆

发表于 2014-9-15 10:19:06 | 显示全部楼层
mark一下,这一块还没怎么用过

出0入0汤圆

发表于 2014-9-17 16:14:41 | 显示全部楼层
多谢了啊,楼主还不错的资料啊!

出0入0汤圆

发表于 2014-9-18 00:45:38 来自手机 | 显示全部楼层
有一点理解了谢谢

出0入0汤圆

发表于 2014-9-18 08:57:22 | 显示全部楼层

出0入0汤圆

发表于 2014-9-18 09:25:37 | 显示全部楼层
谢谢,学习了。。

出0入0汤圆

发表于 2014-9-18 09:44:57 | 显示全部楼层
学习了,谢谢

出0入0汤圆

发表于 2014-9-18 10:40:25 | 显示全部楼层
Semiconductor 发表于 2012-11-15 21:17
“  *(volatile unsigned short int *)(0x60020000)=val;
这个时候,A16在执行其他FSMC的同时会被拉高,因 ...

可以用与非操作,不用直接赋值。保证其余的管脚状态不变

出0入0汤圆

发表于 2014-9-18 10:52:27 | 显示全部楼层
学习了,谢谢分享

出0入0汤圆

发表于 2014-9-18 14:07:07 | 显示全部楼层
学习了,谢谢

出0入0汤圆

发表于 2014-9-19 13:56:43 | 显示全部楼层
浅显易懂~~~~

出0入0汤圆

发表于 2014-9-19 14:21:48 | 显示全部楼层
MARK                       

出0入0汤圆

发表于 2014-9-19 14:45:39 | 显示全部楼层
学习了,谢谢。

出0入0汤圆

发表于 2014-9-19 19:09:48 | 显示全部楼层
楼主总结得不错啊

出0入0汤圆

发表于 2014-9-20 09:20:46 来自手机 | 显示全部楼层
写的不错,受教了。。。

出0入0汤圆

发表于 2014-9-22 17:29:38 | 显示全部楼层
LZ辛苦了,,呵呵,,多谢。。

出0入0汤圆

发表于 2014-10-1 15:59:12 | 显示全部楼层
顶一下~

出0入0汤圆

发表于 2014-10-1 16:03:02 | 显示全部楼层
学习了,多谢。

出0入0汤圆

发表于 2014-10-8 10:16:16 | 显示全部楼层
当要读数据时,地址由0x60020000改为了0x60000000,这个时候A16就为0了////////  这一句这里是不是写错了,应是写数据吧

出0入0汤圆

发表于 2014-10-8 10:37:05 | 显示全部楼层
mark之                                      

出0入0汤圆

发表于 2014-10-8 11:41:58 | 显示全部楼层
学习啊!不懂。。。

出0入0汤圆

发表于 2014-10-9 14:28:15 | 显示全部楼层
不懂,来围观一下

出0入0汤圆

发表于 2014-10-9 14:29:57 | 显示全部楼层
顶楼主,多分享

出0入0汤圆

发表于 2014-10-9 15:50:54 | 显示全部楼层
学习一下

出0入4汤圆

发表于 2014-10-9 16:21:02 | 显示全部楼层
受教了,对fsmc又了解了一点了

出0入0汤圆

发表于 2014-10-11 10:01:33 | 显示全部楼层
学习了,谢谢。

出0入0汤圆

发表于 2014-10-11 14:45:05 | 显示全部楼层
关于模式和时序,及建立时间还是不理解啊。还有16位的数据宽度与8位的数据宽度,地址对应方法不同。。。这个16位与8位是相对于字是多少位的概念吗。
   地址永远是以字节为单位的,我感觉16位数据宽度在总线传输的过程,一次传两个,所以地址haddr左移1位。导致了25-1对应24-0
        

出0入0汤圆

发表于 2014-10-12 10:08:00 | 显示全部楼层
mark一下,改天看下。

出0入0汤圆

发表于 2014-10-12 10:14:01 | 显示全部楼层
学习了谢谢

出0入0汤圆

发表于 2014-10-12 10:46:44 | 显示全部楼层
不懂啊,还是mark一下,以后慢慢看!顶!

出0入0汤圆

发表于 2014-11-27 16:31:33 | 显示全部楼层
又来看了一次~~~~~~~~~~~

出0入0汤圆

发表于 2014-11-27 19:31:28 | 显示全部楼层
正在调显示屏。。果断学习了。

出0入0汤圆

发表于 2014-11-27 19:44:53 | 显示全部楼层
mark            

出0入0汤圆

发表于 2014-11-27 21:09:26 | 显示全部楼层
看了一次又一次,慢慢理解

出0入0汤圆

发表于 2014-11-27 21:38:57 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2015-1-10 19:45:47 | 显示全部楼层
感谢分享!

出0入17汤圆

发表于 2015-1-10 20:23:18 | 显示全部楼层
好东东,顶了

出0入0汤圆

发表于 2015-3-17 15:41:49 | 显示全部楼层
楼主说的很好,明白了许多,谢谢楼主的分享!

出0入0汤圆

发表于 2016-1-6 11:40:37 | 显示全部楼层
正在调试207驱动LCD,可以参考下咯~

出0入0汤圆

发表于 2016-1-6 11:46:57 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2017-3-3 14:45:07 | 显示全部楼层
看完了,回想到老师讲的一些知识

出0入0汤圆

发表于 2017-3-3 16:52:57 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2017-3-3 16:57:59 | 显示全部楼层
不漏点,算什么福利?

出0入0汤圆

发表于 2017-3-4 21:53:10 | 显示全部楼层
这个确实不错

出0入0汤圆

发表于 2017-6-9 16:18:56 | 显示全部楼层
新项目可能准备用FSMC,先学习了,不过纠结成本问题,可能后面直接IO口控制TFT/2.4寸,不知道这样刷屏快不?

出0入0汤圆

发表于 2017-6-14 08:52:44 | 显示全部楼层
学习了,谢谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 20:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表