一、fsmc之我见
开始只是谈到别人对fsmc的理解,注意这里只讨论fsmc控制tft,也就是在fsmc的nor\psram模式控制lcd,所以我们以下的分析都是基于这种模式的。
1、我们之前通过使用gpio来模拟8080/6800时序从而达到驱动彩屏的,同样需要明白的一点就是我们也只是使用fsmc来模拟8080/6800时序,只不过这个读写速度有些快(使用了总线嘛),仅此而已!
简单一点就是:8080是通过“读使能(re)”和“写使能(we)”两条控制线进行读写操作。 6800是通过“总使能(e)”和“读写选择(w/r)”两条控制线进行
2、那么了解到fsmc的三总线如下!
数据线:这个可以分为8位的和16位,这个不难理解,就是之指一次穿上红8位还是16位数据,我的是16位的,8位的有一个懒得用。
地址线:既然我们访问的外nor flash,那么一定会有相应的地址线,那么这些地址线在哪里呢?肯定是通过gpio引脚复用的。有a0 -- a23 24根,能够控制访问16m的空间,也就是一个子bank;
控制总线:它的控制总线只有三根:读使能信号,写使能信号,片选信号。所以这里和我们8080时序相比,少了复位信号线和数据/命令控制线,怎么办?继续看!
3、了解了fsmc会有这三总线的概念,那么接下来就是如何转化为我们需要的时序了。
对比一下fsmc访问外nor flash和8080访问时序如下
差别似乎很小是吧,简单说就是在数据/指令选择和复位信号上的区别。
4、在这里我们使用的软件方法来完善fsmc转化为8080的读写时序
在参考手册上的存储系统能找到,芯片留给我们外扩的存储器(nor flash、psram这类可直接寻址的器
件)地址是从0x60000000开始的,意思就是当我们访问0x60000000的时候,那就是相当于访问外部nor flash了(我们只讨论这种情况),那么他就会自动产生fsmc的时序
在这里,我们所需要添加的就是d/c选择信号,如何实现呢?我们是通过,一根地址线来实现的,当我们把a0多对应的gpiof0(引脚默认复用)接到tft的rs端,
然后执行访问0x60000000的指令,那么rs是否就是低电平选择为数据呢?又加入我们访问的地址是0x60000001的时候,那么rs是否就是高电平,从而选择的就是指令传送呢?答案当然是肯定的!所以我们就解决了这个问题,复位信号就更好解决了,直接和开发板的复位引脚接在一起就好了,就这么简单!
二、说了这么久的理论,来个实例分析更加形象了,首先硬件连线要明白
在原理图或者开发手册上面能够确定引脚复用问题
地址引脚:
(a0-a5 :pf0 - pf5) (a6-a9: f12-f15 ) (a10-a15:pg0-pg5)
(a16-a18:pd11-pd13) (a19-a22:pe3-pe6) (a23-pe2)
片选信号(nex:pg12)因为我选择的是block4
写使能(nwr:pd5)
读使能(noe:pd4)
至此控制引脚基本完成
下面就是数据引脚:
pd14-fsmc-d0 ----lcd-db0
pd15-fsmc-d1 ----lcd-db1
pd0-fsmc-d2 ----lcd-db2
pd1-fsmc-d3 ----lcd-db3
pe7-fsmc-d4 ----lcd-db4
pe8-fsmc-d5 ----lcd-db5
pe9-fsmc-d6 ----lcd-db6
pe10-fsmc-d7 ----lcd-db7
pe11-fsmc-d8 ----lcd-db8
pe12-fsmc-d9 ----lcd-db9
pe13-fsmc-d10 ----lcd-db10
pe14-fsmc-d11 ----lcd-db11
pe15-fsmc-d12 ----lcd-db12
pd8-fsmc-d13 ----lcd-db13
pd9-fsmc-d14 ----lcd-db14
pd10-fsmc-d15 ----lcd-db15
有了这些硬件连线是没有任何问题的
三、正式分析程序
1、硬件引脚配置函数
voidlcd_ctrllinesconfig(void)
{
gpio_inittypedefgpio_initstructure;
/*enablefsmc,gpiod,gpioe,gpiof,gpiogandafioclocks*/
rcc_ahbperiphclockcmd(rcc_ahbperiph_fsmc,enable);//使能fsmc
rcc_apb2periphclockcmd(rcc_apb2periph_gpiod|rcc_apb2periph_gpioe|
rcc_apb2periph_gpiof|rcc_apb2periph_gpiog|
rcc_apb2periph_afio,enable);
//io口复用功能时钟
/*setpd.00(d2),pd.01(d3),pd.04(noe),pd.05(nwe),pd.08(d13),pd.09(d14),
pd.10(d15),pd.14(d0),pd.15(d1)asalternate
functionpushpull*/
/*d端口初始化*/
gpio_initstructure.gpio_pin=gpio_pin_0|gpio_pin_1|gpio_pin_4|gpio_pin_5|
gpio_pin_8|gpio_pin_9|gpio_pin_10|gpio_pin_14|
gpio_pin_15;
gpio_initstructure.gpio_speed=gpio_speed_50mhz;
gpio_initstructure.gpio_mode=gpio_mode_af_pp;
gpio_init(gpiod,&gpio_initstructure);
/*e端口初始化*/
/*setpe.07(d4),pe.08(d5),pe.09(d6),pe.10(d7),pe.11(d8),pe.12(d9),pe.13(d10),
pe.14(d11),pe.15(d12)asalternatefunctionpushpull*/
gpio_initstructure.gpio_pin=gpio_pin_7|gpio_pin_8|gpio_pin_9|gpio_pin_10|
gpio_pin_11|gpio_pin_12|gpio_pin_13|gpio_pin_14|
gpio_pin_15;
gpio_initstructure.gpio_speed=gpio_speed_50mhz;
gpio_initstructure.gpio_mode=gpio_mode_af_pp;
gpio_init(gpioe,&gpio_initstructure);//将配置写入gpioe管脚
/*a0地址线*/
gpio_initstructure.gpio_pin=gpio_pin_0;
gpio_initstructure.gpio_speed=gpio_speed_50mhz;
gpio_initstructure.gpio_mode=gpio_mode_af_pp;
gpio_init(gpiof,&gpio_initstructure);
/*setpg.12(ne4(lcd/cs))asalternatefunctionpushpull-ce3(lcd/cs)*/
gpio_initstructure.gpio_pin=gpio_pin_12;
gpio_initstructure.gpio_speed=gpio_speed_50mhz;
gpio_initstructure.gpio_mode=gpio_mode_af_pp;
gpio_init(gpiog,&gpio_initstructure);
EDA设计软件国产替代方面虽然有所进展,但前路依旧漫漫
差示扫描量热仪丨环氧锌粉漆中锌含量的测定
网西环光缆线路发生阻断的原因
什么是摩擦纳米发电机(TENG)?
赵明:荣耀V20需求超过预期 我们加快生产
STM32单片机的FSMC对TFT的驱动
一文介绍SPI串行总线
看海泰方圆类ChatGPT技术模型!
2020年彩电市场 迎来三大发展机遇也有不少的难题
RX产品家族介绍手册 [2] RX产品家族解决方案(下)
英航宣布将在纽约航线上试用VR技术娱乐服务
康佳集团宣布进军时下大热的半导体和环保产业
研华为同济大学主导的校园碳排放核算平台提供技术支持
锂离子电池自放电知识总结
利用激光而实现超快数据读写
看国产机器人如何扛好“中国制造”大旗
小米MIX:跨时代的产品,最保值的安卓“机皇”
小米11加快了节奏,将于今年月底之前发布
物联网32个相关术语集及英文缩写
xisem西圣Ares五大硬核科技加持,正面硬刚千元旗舰机!