Stm32FSMC及TFTLED屏笔记(开始于2021-07-23)

Stm32FSMC及TFTLED屏笔记

截图的图片出自正点原子的参考手册和网络资料,如有侵权,请联系我删除(因为没怎么写过博客,有注明出处,但对版权的具体细节不清楚)

1.FSMC*(Flexiable Static Memory Controler)*

1)FSMC的应用:

Stm32FSMC及TFTLED屏笔记(开始于2021-07-23)
  • 从上面的框图也可以看出,因为并口信号线FSMC[15:0]是公用的,所以一次只能同时外接一个SRAM类的存储器。

Stm32FSMC及TFTLED屏笔记(开始于2021-07-23)
  • 值得注意的是在外部SRAM连接的FSMC_A在存储器位数不同时,地址线的对齐方式不同。

    因为在内部AHB的地址里(即HADDR[25:0])是以字节为单位的,即一个地址可以写8位数据;

    当外部是以半字(16位)为单位时,这时候每当在外部地址写完一次(16位数据)的过程中,内部AHB对应的地址应该是移动两位的(2*8位);所以为了使用方便,这儿有一个很巧妙(也很常用)的方法就是将HADDR[25:0]左移一位与FSMC_A对齐;

    • 举例如下:当在外设FSMC_A的第……0001*(地址为bit0 = 1处的地址,前面的0省略)写数据时,HADDR中对应是第……001 _(地址为bit1 = 1处的地址,下划线表示:因左移一位对齐而失效的HADDR [0] )*; 这样在外设写……0001;这移位时,内部HADDR 实际上走了……0010,和0011两个8位数据

    • 所以这样的对齐方式,使FSMC_A的一位会对应HADDR的两位:

      FSMC_A(16位单位外设地址) HADDR(实际内部的8位单位地址)
      000 00 0 和 00 1(下划线表示因左移而失效的HADDR[0])
      001 01 0 和 01 1
      010 10 0 和 10 1
  • 可以看出刚好是左移一位对齐,而且000 位仍有对应 000位地址,即起始地址仍一样。

(2)信号线及8080并口协议:

Stm32FSMC及TFTLED屏笔记(开始于2021-07-23)

Stm32FSMC及TFTLED屏笔记(开始于2021-07-23)

(5)库函数使用:(见如下代码及注释,参考正点原子)

关于读写时序的结构体参数如下*(即上面结构体的最后两个成员变量)*:

FSMC的使能函数如下:(较简单)

2.TFTLED屏(ILI9341驱动)

1)ILI9341驱动:

(1)接口时序:8080并口:

接口线 作用简介
CS 片选
WR 写使能
RD 读使能·
D[15:0] 16位双向数据线
RST 硬件复位线
RS/DCX 数据1*(写入9341的SRAM)/命令0(写入9341的寄存器)* 控制线

在接线上,原子用的方法比较巧妙;

  • 将RST复位接在系统的复位上;

  • 将RS线接在FSMC的任意一个地址线上(A10上)如下:

  • 利用结构体地址自增的特性:

    将LCD这个结构体定义做LCD_BASE*(A10)的地址*;***(注意:16位数据传输时,将外设地址右移一对齐位,所以实际是 HADDR[11] 位)***,这样:

    LCD_REG == 0x6C0007FE ,A10位为0(7为0111);

    LCD_RAM == 0x6C000800,A10位为1(8为1000)这里的A10均指外设的A10即FSMC_A[10].

    如此在,对地址LCD_REG = 0xyyyy*(数据)时就是,写入命令(写道9341的寄存器中)(因为此时,RS=0)*;

    同理,对地址LCD_RAM = 0xyyyy*(数据)时就是,写入数据(写到9341的SRAM上)(因为此时,RS=1)*。

2)ILI9341的部分命令:

  • 0xD3:读ID.

    Stm32FSMC及TFTLED屏笔记(开始于2021-07-23)
  • 0x2A:设置列坐标,(即x轴横坐标)

    0x2B:与2A一样,设置的是行坐标(即y轴纵坐标)

    注:以下的SC可以理解为 Start Column;EC可以理解为Ending Column.

    Stm32FSMC及TFTLED屏笔记(开始于2021-07-23)

    RGB565格式如下:

    Stm32FSMC及TFTLED屏笔记(开始于2021-07-23)

3)原子代码使用:

原子帮我们将许多底层的代码都封装好了,但在使用时有一些注意事项:

  • 使用时,需先执行LCD_Init();函数进行初始化;

  • **因为LCD_Init()函数里默认将芯片信号printf到串口1输出;所以在执行LCD_Init()初始化函数前,需先执行串口初始化uart_init();或者直接将LCD_Init()内的printf();注释掉,否则程序会卡死在printf中 **

  • 将原子的LCD.h中可以调用的函数整理在这儿,方便自己查找:

来源:点灯的棉羊

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年6月21日
下一篇 2021年6月21日

相关推荐