电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
STM32通过FSMC点亮LCD
分 享
扫描二维码分享
STM32通过FSMC点亮LCD
STM32
FSMC
LCD
gcrisis
关注
发布时间: 2021-05-07
丨
阅读: 500
FSMC是Flexible static memory controller(可变静态存储控制器)的简称,是STM32系列采用的一种新型的存储器扩展技术,支持SRAM、Nor Flash、LCD、PSRAM、NAND Flash、PC Card等。只在某些芯片上有,使用前要查看对应的手册确定。 在FSMC的角度来看,外部存储分成了4个固定的大小为256MB的bank。 ![](https://cf01.ickimg.com/bbsimages/202105/5ad93f5529037a2646a93ac68bacbcfd.png) bilibili、公众号、头条号:科G栈 Bank1分成了4个子bank,每一个64MB大小,并且每个bank都有独立的片选,用来控制Nor Flash、RAM、PSRAM。Bank2和Bank3用来控制NAND Flash。Bank4控制PC Card。 不同的Bank共享了地址、数据、读、写信号,其他信号根据bank的用途不同会有一些差别。 ![](https://cf01.ickimg.com/bbsimages/202105/4656f8f2fa248373e4e8d293834df33e.png) 下面介绍下如何通过FSMC点亮LCD。LCD可以看作是一个SRAM,通过Bank1控制。理论上支持8080接口的LCD都可以使用FSMC来点亮(不知是否有例外)。LCD有8位或16位接口的,FSMC的设置需要一致,本文以16位为例。 STM32的设置使用cubeMX很方便,下面是针对FSMC的设置,其他基础设置这里就不罗列了。 ![](https://cf01.ickimg.com/bbsimages/202105/08099df561dd576cae8c41025d5ba4b8.png) - 这里使用了bank1的第四个子bank,片选是NE4; - 内存类型是LCD接口; - LCD寄存器选择为A0,其他A1-A24都可以,这本来是存储器寻址信号,这里用来接LCD的RS信号,控制LCD是写命令(低0)还是写数据(高1); - 数据选择16位。 再往下 - 写操作使能; - 扩展模式Disabled; - 地址建立时间设置为6; - 数据建立时间设置为6; - 总线翻转时间设置为0. 上面建立时间范围如下表所示,实际要根据LCD的时序确定。 ![](https://cf01.ickimg.com/bbsimages/202105/a5e3f5c27e3d3d89daaae4ad3589b333.png) 除了上面的配置,别忘了一般LCD还有个背光控制引脚。 ![](https://cf01.ickimg.com/bbsimages/202105/50c6e954385c4b771ddf1d23221d7be2.png) 之后生成代码。(只罗列了变量和函数内容,不是真正的函数) 背光引脚代码如下: ![](https://cf01.ickimg.com/bbsimages/202105/45de4b5dd2e7d72eba4cdaf134c5cc19.png) FSMC的初始化代码如下: FSMC的引脚配置 ![](https://cf01.ickimg.com/bbsimages/202105/ad0f4acf289e6a45f0e3b72b814b083d.png) FSMC模式和时序配置: ![](https://cf01.ickimg.com/bbsimages/202105/20e8f72852af90e8bcca757cf197925c.png) 到此,FSMC的初始化就搞定了,后边就可以通过内存地址直接控制LCD了。这里有几个需要注意的点,下面来详细说说。 第一, 存储基地址 bank1的基地址是0x60000000,不同的子bank地址不同,通过HADDR[27:26]这两位的值确定。我们选择了第四个,这两位是11,所以子bank的基地址是 0x60000000+(0x3<<26) = 0x6c000000。 ![](https://cf01.ickimg.com/bbsimages/202105/86025b3d44867c716397566f8869bb22.png) 第二, 外部存储地址 HADDR[25:0]存储了外部存储器的地址,对于8位和16位略有差别。 ![](https://cf01.ickimg.com/bbsimages/202105/09ded7955f6972944165da9470fa758e.png) 8位用到了HADDR[25:0]的所有位,对映FSMC_A[25:0]。而16位只用了HADDR[25:1],没有用HADDR0,所以对于16位,HADDR[25:1]就对映了FSMC_A[24:0]。 ![](https://cf01.ickimg.com/bbsimages/202105/74567e21acaba8382b0b3f76a5905697.png) 第三, LCD的数据or命令选择 LCD没有地址,我们引出的地址线实际上接到了LCD的RS或者叫D/C引脚上。当RS为低,则通过D[15:0]的是命令,当RS为高,则通过D[15:0]的是数据。上面我们选择了A0,在16位模式下,写命令的地址就是0x6c000000(HADDR1为0),写数据的地址就是0x6c000002(HADDR1为1) (其实地址不唯一,只要保证HADDR1的0和1准确就行,其他地址位随意,但是一般选择最简单或实用的地址,后边会提到)。 ![](https://cf01.ickimg.com/bbsimages/202105/3081b6d2f3b2ba114c3cf2d368bcc260.png) 我们再假设选择A3,那么写命令的地址还是0x6c000000(HADDR4为0),写数据的地址是0x6c000010(HADDR4为1)。所以结论就是,写命令的地址可以都是0x6c000000,写数据的地址根据选择的地址线确定。这是最简单的地址。 ![](https://cf01.ickimg.com/bbsimages/202105/975161abaa0682c3b26aa90cd3c49e1b.png) 第四, 巧用结构体,只需定义一个地址 在很多参考例程中,会出现下面的实现方法: ![](https://cf01.ickimg.com/bbsimages/202105/26eeae48cbd8cc130f66e62ce209f2b9.png) 我们都知道结构体是顺序排列的,所以LCD_REG的地址是0x6c000000,变量大小是2个字节(16位),所以LCD_RAM的地址就是0x6c000002,刚好就是我们选择A0地址线(HADDR1)拉高的值。 那如果选择其他地址线,这里就需要做一点变动。比如选择A3,我们逆向操作来解决这个问题,A3写数据地址是0x6c000010,也就是LCD_RAM的地址。LCD_REG比LCD_RAM小两个字节,减2就得到了0x6c00000e,此时HADDR4为0,那这个就是我们需要的LCD基地址,因为只有这个值加2后会变成写数据的地址,这就是那个实用的地址。 ![](https://cf01.ickimg.com/bbsimages/202105/52703d2a8d6985bfc87d041f98d1856e.png) 操作框图如下图所示,FSMC初始化好后就跟透明的一样,只需要往指定的地址送命令或者数据即可。类似串口蓝牙的透传,一旦设置配对好,就可以无视蓝牙的存在。 ![](https://cf01.ickimg.com/bbsimages/202105/0b483dcd68e542b628a7075c390501f2.png) 后面的事情就跟具体的LCD有关了,比如读取ID,写初始化序列等,这里就不多介绍了。 ![](https://cf01.ickimg.com/bbsimages/202105/9ef09d9773e0b5f0b101469308ce728d.png) bilibili、公众号、头条号:科G栈
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
gcrisis
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交