关于使用STM32CubeMX配置FSMC驱动8080并口LCD

        讲解类参考正点原子或者野火或者其他UP的,已经讲解很多了,这里就说一下单纯使用HAL库怎么点屏幕。

        FSMC很好用,甚至不需要复制代码去一点点扒。这里举例子,下边是8位8080,16位的有好多案例。第一步就是设置,重点在下面的配置,这个一会说。

关于使用STM32CubeMX配置FSMC驱动8080并口LCD_第1张图片

        硬件接线就是

                        片选/CS---NE1(NE几看自己配置)

                        读使能/RD---NOE

                        写使能/WR---NWE

                        数据命令切换D/C---A24(A多少自己选的)

                        数据线对着接就行

        第一个问题。16位的需要有偏移,那个便宜就是0位不给用,寄存器0-25正常对应A0-25,现在就变成了寄存器1-25对应A0-24。这个偏移表现在地址上就是多了一个2的平方。看不懂我说啥没关系,下边公式就可以。

/* 当选择NE1 连接 LCD时, 地址范围: 0x60000000~0x63FFFFFF 
 * 当选用FSMC_A24地址线时
 * 16位数据时: 16bits => FSMC[24:0]== HADDR[25:1]
     8位数据时 : 8bits  => FSMC[25:0]== HADDR[25:0]
 * register base address: 0x60000000
 * 16位数据时RAM base address: 0x62000000 = 0x60000000 + 2^24 * 2 = 0x62000000
 * 8 位数据时RAM base address: 0x61000000 = 0x60000000 + 2^24     = 0x61000000
 * 选用不同的地址线要重新计算偏移地址
 8位并口屏,A16地址线,所以数据地址起始为0x62000000
*/
#define Bank1_LCD_DATA         ((uint32_t)0x61000000)    /* display data address */
#define Bank1_LCD_REG        ((uint32_t)0x60000000)    /* display register address */

#define SdData(value)    ((*(__IO uint8_t*)(Bank1_LCD_DATA)) = ((uint8_t)(value)))     //写数据寄存器
#define SdCmd(index)    ((*(__IO uint8_t*)(Bank1_LCD_REG)) = ((uint8_t)index))

这个我是转这个兄弟的,这个函数写的很直观,正点原子看不懂就看这个。weixin_42359585 《FMC驱动8位并口TFT》

        实际上就是你选的那个A什么就是你的数据命令切换线,对应的地址就是上边的计算出来的地址,实际上就是第几位置1。

 关于使用STM32CubeMX配置FSMC驱动8080并口LCD_第2张图片

同理,16位LCD选的A24就是

 关于使用STM32CubeMX配置FSMC驱动8080并口LCD_第3张图片

至于这个引脚置0对应的寄存器就是0x60000000。直接向上边那么写就行,这代表你的传递函数已经设置好了。

剩下的屏幕逻辑就按照你的屏幕手册就行。接下来说一下重点问题,配置时钟。

关于使用STM32CubeMX配置FSMC驱动8080并口LCD_第4张图片

 画横线这个玩意开启后就会有两个,一个是读一个是写,正常屏幕读写有快有慢,我是不读,所以就没开。开了选模式A。

剩下的就是重点,我卡了几天就是这个配置的不对。首先下边那三个东西是对SRAM的配置,这个东西跟8080的驱动IC上一个名字的东西指的不是相同的时钟。我用的逻辑分析仪看的,第一个时钟和第二个加一块管的是CS的下拉的持续时间,第二个是读写的时间。

下面这个图是设置15 3 0的,发送的是数据0xff延时100ms,发送0X11延时500ms

关于使用STM32CubeMX配置FSMC驱动8080并口LCD_第5张图片

关于使用STM32CubeMX配置FSMC驱动8080并口LCD_第6张图片

看上面这个图我们能看出来D/C上升是传数据,我们发送的0xFF,发出的条件是WR先置0再置1,数据是从WR的第一个上升沿之前第一个下降沿之后开始的,能看出来是8个1。下边的图就是00010001。现在我们的CS为0的是时间是120ns和130ns,WR是20ns。

关于使用STM32CubeMX配置FSMC驱动8080并口LCD_第7张图片

我改成1 3 0

 关于使用STM32CubeMX配置FSMC驱动8080并口LCD_第8张图片

CS变成30ns了,WR还是20ns。

关于使用STM32CubeMX配置FSMC驱动8080并口LCD_第9张图片

改成15 60 0  

关于使用STM32CubeMX配置FSMC驱动8080并口LCD_第10张图片

CS变成450ns  WR变成360ns。我用的168M 一个时钟不到6ns。(15+60)*6=450  (1+3)*6=24 (15+3)*6=108  所以这两个加一块是CS的时钟,中间那个是WR的。

关于使用STM32CubeMX配置FSMC驱动8080并口LCD_第11张图片

自己配置就看一下对应的时间,别直接用。这几个东西都对不上,不是一个概念。

你可能感兴趣的:(stm32,单片机,arm)