LCD和FSMC的那点事 和STM32F4 FSMC 34PIN 16位数据并口 TFTLCD,点亮屏幕步骤

2023-10-27

LCD和FSMC的那点事

A.先说一下几种LCD interface,包括但不限于以下三种:

1.SPI

2.FSMC,就是常说的8080(或者称80并口,都是一个意思),参考:STM32——FSMC模拟8080时序 点亮 液晶屏

点亮显示屏的几个重要步骤_液晶屏点亮的条件 

3.LTDC,就是RGB的接口

概念:

FM指帧缓存,即:GRAM

true colo ,就是RGB888

B.由于我使用的LCD接口是16位的80并口(16位代表有16条数据线),现在说一下80并口的标准信号,要驱动一个80并口的LCD包括以下7项信号(其中第8项位触摸屏接口的信号,可先不理会):

1.LCD_CS:LCD片选信号

2.LCD_WR:LCD写信号

3.LCD_RD:LCD读信号

4.DB[17:1]:16位双向数据线

5.LCD_RST:硬复位LCD信号

6.LCD_RS:命令/数据标志(0:命令,1:数据)

7.BL_CTR:背光控制信号

8.T_MISO/T_MOSI/T_PEN/T_CS/T_CLK,触摸屏接口信号

还有一个题外话,就是LCD的驱动初始化代码是由厂家提供的(初始化代码将LCD调到最佳显示效果),LCD必须硬复位后才能初始化。

C.再说一下为何FSMC可以用来驱动LCD,原因是FSMC的读写时序和LCD的读写时序很相似,于是把LCD当成一个外部存储器来用。利用FSMC在相应的地址读或写相关数值时,STM32的FSMC会在硬件上自动完成时序上的控制。所以我们只要设置好读写相关时序的寄存器后,FSMC就可以帮我们完成时序上的控制了。对于FSMC驱动LCD有一个比较难理解的地方就是当你的LCD使用16位宽度的数据传输(也就是有16条数据线,就像我上面说的我使用的是16位的80并口)的时候,HADDR和FSMC_A这个地址块的对应问题(使用8位数据则不用考虑此问题)。先开STM32中文参考手册_V10.pdf第327页,看到下图的红色下划线的文字,这个问题就是体现在这几句话上。

为什么FSMC外接16位宽度存储器(前面说了我们把LCD当成外部存储器来用)的时候和外接8位宽度存储器的时候,HADD和FSMC_A对应的地址不一样呢?下面我来说一下。

第一,我们先要明白FSMC_A是STM32的硬件的外部接口,是我们看得见摸得着的。然后HADDR是需要转换到外部存储器的内部AHB地址线(如上图所述),这个我们是看不见摸不着的,但是,我们可以用代码来控制它(理解这点很重要),我们代码直接操作着HADDR,而会间接操作到FSMC_A。所以当我们的LCD的16位(16位与8位是可选择,一般是是通过LCD的FPC上的电阻进行选择的,这点不详细讲)的80并口和STM32的FSMC接口连接好之后,要操作的就是HADDR,因为HADDR会间接操作到FSMC_A。

    第二,外部存储器不都是按字节访问的(如上图所述),也就是说当你找到某个地址之后,你可以读出一个字节的数据(8位宽度)或者两个字节的数据(16位宽度)或者更多字节的数据(其他宽度),而这,就是依靠你外部存储器的数据宽度是多少。而所谓16位数据宽度就是说一个地址对应两个字节,当然了8位的数据宽度就是一个地址对应一个字节。

    第三,从上图中,我们知道当你是8位数据宽度的时候是26根数据线HADDR[25:0],而16位数据宽度的时候是25根数据线[25:1]。前者可能大家都比较好理解,算下来就是有64M的地址空间(我们把LCD当成SRAM来用,把LCD接在了bank1上,bank1就是外接NOR/PSRAM用的,接到bank1后,再随便接到bank1的四个分区中的一个,每个bank大小512M,每个bank中的每个区64M),每个地址对一个字节空间大小,存储器储存空间大小为64M。后者算下来就是有32M的地址空间,他前面8位数据宽度时不同的是16位数据宽度每个地址对应两个字节的空间大小,这样算的话,它也是有32M*2=64M的存储空间大小(注意这里和前面的多少多少M指的是地址的数目,而不是实际对应的存储器存数空间的大小,就是说要注意区分地址空间大小和存储空间大小,因为前面说了一个地址可能对应一个字节大小的空间,也可能对应两个字节大小的空间)。

      到了这里,大家应该都知道为什么16位数据宽度时HADDR的地址线需要减少一根了,因为16位数据宽度时需要的地址的数量只是8位数据宽度时的一半。

     第四,现在假设我们的LCD的LCD_RS(命令/数据标志线)是接在STM32的外部接口FSMC_A[10]上的。由于STM32规定当使用16位数据宽度的时候HADDR[25:1]与FSMC_A[24:0]对应相连, HADDR[0]未接(如上图所述)。也就是说当使用16位数据宽度时有如下HADDR和FSMC_A有如下对应关系:

很明显,当使用16位数据宽度的时候,HADDR[0]这个地址是没用的。而因为我们的LCD的LCD_RS(命令/数据标志线)是接在STM32的外部接口FSMC_A[10]上的,所以实际上我们要操作的事HADDR[11]这根地址线。其实这就是所谓的当使用16位数据宽度的时候,HADDR自动右移一位对其的原理。

D.我的LCD的控制IC是ILI9314,讲一下我使用时遇到的一些问题。

其实我遇到的主要是横竖屏切换时问题,就是当我们从横竖屏间切换时应该要注意哪些地方,或者说白了,就是要设置哪些寄存器。

第一,先说一下,所谓的横竖屏切换指的是LCD的一个扫描方式,如下图展示了其中的三种扫描方式:

扫描方式确定好了,其实也就是确定好横屏或者竖屏了。同时该方向上的虚拟原点坐标(其实LCD的原点只有一个,就是物理的原点坐标)也确定好了,像上图中的B就是当确定好了扫描方式后的对应的虚拟原点(0,0)坐标所在的位置。

当LCD处于不是默认扫描方式时(也就是虚拟坐标和物理坐标不是一样的时候),需要做虚拟坐标到实际坐标的转换公式如下:

下面我举个例子说明一下,他们之间的转换关系:

上图中黑色的都是物理上的坐标,而红色的是改变扫描方式后的视角,红色的(10,20)是相对于横屏状态下虚拟原点坐标(0,0)来说的。当我们在横屏状态时想在(10,20)打红色的点,就必须做坐标转换,不然的话就会打到黑色的点那里去了。其实从虚拟坐标到物理坐标的转换控制IC已经帮我们做好了,我们其实不用理会。上图中的蓝色箭头指向的其实就是转换公司,它和上上图中B5,B6,B7为110时的公式是一样的。其实就是(239-y,x),其中这里的x和y都是在横屏状态下你想打的点。

第二,我总结一下横竖屏切换(扫描方式改变)时需要注意的地方。

1,x坐标的开始和结束地址,y坐标的开始和结束地址要重新设置,因为横竖屏间的切换时x,y相应也会变化,所以需要重新设置(调换即可)。

2,所谓的设置当前坐标,其实就是设置x,y的开始地址。和上面的设置方法一样,这时可以省略不设置x,y的结束地址。

3,最后说一下,所谓的显示字符是怎么回事。以及1206,1608字符是什么意思,画了个图,大家都明白。

如果有哪里我理解错了,请指正我。

STM32F4 FSMC TFTLCD

STM32F4 FSMC TFTLCD_oshan2012的博客-CSDN博客

MCU:STM32F407ZGT6

4.3寸TFTLCD

LCD驱动芯片:NT35510

34个引脚说明:

序号 名称 说明 连接MCU引脚
1 CS LCD片选信号(低电平有效) FSMC_NE4 PG12    127脚
2 RS 命令/数据控制信号(0:命令 1:数据) FSMC_A6  PF12    50
3 WR 写使能信号(低电平有效) FSMC N WE PD5    119
4 RD 读使能信号(低电平有效) FSMC_NOE  PD4    118
5 RST 复位信号(低电平有效) NRST             25
6 D0 双向数据总线 FSMC_D0   PD14   85
7 D1 双向数据总线 FSMC_D1   PD15   86
8 D2 双向数据总线 FSMC_D2   PD0    114
9 D3 双向数据总线 FSMC_D3   PD1    115
10 D4 双向数据总线 FSMC_D4   PE7    58
11 D5 双向数据总线 FSMC_D5   PE8    59
12 D6 双向数据总线 FSMC_D6   PE9    60
13 D7 双向数据总线 FSMC_D7   PE10   63
14 D8 双向数据总线 FSMC_D8   PE11   64
15 D9 双向数据总线 FSMC_D9   PE12   65
16 D10 双向数据总线 FSMC_D10  PE13   66
17 D11 双向数据总线 FSMC_D11  PE14   67
18 D12 双向数据总线 FSMC_D12  PE15   68
19 D13 双向数据总线 FSMC_D13  PD8    77
20 D14 双向数据总线 FSMC_D14  PD9    78
21 D15 双向数据总线 FSMC_D15  PD10   79
22,26,27 GND 地线
23 BL_CTR 背光控制引脚(高电平点亮,低电平关闭) PB15             76
24,25 VCC3.3 主电源供电 3.3V
28 VCC5 背光供电 5V
29 MISO 电容触摸屏没用到
30 MOSI 电容触摸屏 IIC_SDA信号,(CT_SDA) PF11             39
31 PEN 电容触摸屏中断信号 (CT_INT) PB1              47
32 BUSY 电容触摸屏 没用到
33 CS 电容触摸屏复位信号(CT_RST) PC13             7
34 CLK 电容触摸屏 IIC_SCL信号 (CT_SCL) PB0              46

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LCD和FSMC的那点事 和STM32F4 FSMC 34PIN 16位数据并口 TFTLCD,点亮屏幕步骤 的相关文章

  • 理解这部分手臂的汇编代码

    syntax unified thumb cpu cortex m4 arch armv7e m fpu fpv4 sp d16 Changes from unprivileged to privileged mode thumb func
  • ARM 9处理器的opencv交叉编译

    我需要为 ARM 9 处理器交叉编译 opencv 我有处理器的工具链 但不知道如何交叉编译 请告诉我为arm板交叉编译的过程 谢谢大家 看这个参考 http www airs com ian configure configure 5 h
  • 如何在 ARM 架构上从 RAM 运行代码

    我正在对 ARM Cortex R4 进行编程 并且有一些二进制文件 我想从 TCRAM 执行它们 只是为了看看性能的提升是否足够好 我知道我必须编写一个函数来将二进制文件复制到 RAM 这可以通过链接器脚本来完成 并且知道二进制文件的大小
  • 如何修改内核DTB文件

    Summary 我目前正在为定制板编译 Linux 内核 内核 模块和 DTB 以及一些定制驱动程序 有时 我会编译内核并意识到 DTB 文件中的兼容性字符串不是自定义驱动程序正在寻找的内容 现在 我可以解决此问题的唯一方法是修改 DTS
  • 适用于arm(cortex-m3)的位置独立可执行文件(-pie)

    我正在使用codesourcery g lite 基于gcc4 7 2版本 为stm32 Cortex m3 编程 我希望动态加载可执行文件 我知道我有两个选择 1 可重定位的elf 需要一个elf解析器 2 具有全局偏移寄存器的位置无关代
  • 使用 gnueabihf 为 ARMv6 构建

    我尝试为 ARMv6 构建应用程序 但失败了 我猜问题是工具链支持硬浮点 但 ARMv6 不支持 好吧 首先我设置 march armv6 编译失败 opt gcc linaro arm linux gnueabihf 4 8 2014 0
  • 用于 RHEL 的 gdb-multiarch

    我正在尝试寻找方法来运行gdb 多架构RHEL 中的命令 我已经安装了用于 ARM 处理的 QEMU 模拟器 我想安装GDB进行调试 我能够安装GDB 多体系结构在 Ubuntu 中运行命令成功 sudo apt get GDB multi
  • DSP 库 - RFFT - 奇怪的结果

    最近我一直在尝试在我的STM32F4 Discovery评估板上进行FFT计算 然后将其发送到PC 我已经调查了我的问题 我认为我对制造商提供的 FFT 函数做错了 我正在使用 CMSIS DSP 库 现在我一直在用代码生成样本 如果工作正
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re
  • 如何在 Android 设备上运行 VS Code [重复]

    这个问题在这里已经有答案了 我有 Galaxy Tab S6 它具有替代笔记本电脑的很酷的功能 例如连接鼠标和键盘 但不幸的是它运行 Android 操作系统 并且没有很多开发应用程序可用于 Android 所以我想是否有一个选项可以在至少
  • arm-thumb指令集的blx指令如何支持4MB范围

    读自https www keil com support man docs armasm armasm dom1361289866046 htm https www keil com support man docs armasm arma
  • 如何使用 Neon SIMD 将无符号字符转换为有符号整数

    如何转换变量的数据类型uint8 t to int32 t使用霓虹灯 我找不到执行此操作的任何内在因素 假设您想要将 16 x 8 位整数的向量转换为 4 个 4 x 32 位整数的向量 您可以通过首先解压缩为 16 位 然后再次解压缩为
  • 产生并处理软件中断

    有人可以告诉我如何在Linux下生成软件中断然后用request irq处理它吗 或者也许这是不可能的 您可以使用软中断来代替 您可以通过编辑 include linux interrupt h 来定义您的 sofirq 然后使用函数 ra
  • 在 Intel 机器上构建 Apple Silicon 二进制文件

    如何在 macOS 11 Intel 上编译 C 项目以在 Silicon 上运行 我当前的构建脚本很简单 configure make sudo make install 我尝试过使用 host and target标志与aarch64
  • Beaglebone Black 的 U-boot 无法构建 - 目标 CPU 不支持 THUMB 指令

    我正在尝试按照 Chris Simmonds 的 掌握嵌入式 Linux 编程 中的说明为 Beagle Bone Black 构建 u boot 我已经构建了交叉工具链 现在正在尝试使用该工具链构建 Das U boot 但由于不支持 T
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • 使用 NEON 优化 Cortex-A8 颜色转换

    我目前正在执行颜色转换例程 以便从 YUY2 转换为 NV12 我有一个相当快的函数 但没有我预期的那么快 主要是由于缓存未命中 void convert hd uint8 t orig uint8 t result uint32 t wi
  • gdb 不会从外部架构读取核心文件

    我正在尝试在 Linux 桌面上读取 ARM 核心文件 但似乎无法找出我的核心文件 有什么方法可以指示 gdb 我的核心文件是什么类型吗 file daemon daemon ELF 32 bit LSB executable ARM ve
  • 使用 NEON 内在函数除以浮点数

    我当时正在处理四个像素的图像 这是在armv7对于 Android 应用程序 我想分一个float32x4 t向量由另一个向量组成 但其中的数字与大约不同0 7 to 3 85 在我看来 除法的唯一方法是使用右移 但这是针对一个数字2 n
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7

随机推荐

  • 人工智能 猴子摘香蕉问题

    1 定义描述环境状态的谓词 AT x w x在w处 个体域 x monkey w a b c box HOLD x t x手中拿着t 个体域 t box banana EMPTY x x手中是空的 ON t y t在y处 个体域 y b c
  • 三角形

    1 2 3 4 5 6
  • function 与 => 的区别

    function 与 的区别主要是他们的作用域的不同 在JS中 箭头函数并不是简单的function 匿名函数的简写语法糖 实际上 箭头函数和匿名函数有个明显的区别 gt 箭头函数内部的this是词法作用域 在编写函数时就已经确定了 fun
  • CentOS8.4安装Redis6.2.6

    一 下载 官网 Redis 我们下载 Stable 稳定版 cd mydata wget https download redis io releases redis 6 2 6 tar gz 二 安装redis6 2 6 1 安装到 us
  • python编一函数s(x) 求级数和_Python 编程基础之高阶函数篇(一)

    高阶函数 能接受函数作为参数的函数 如 f abs def add x y f return f x f y 如果我们用 add 5 9 f 来调用该高阶函数 则返回结果为 14 abs是Python提供的求绝对值的函数 Python中的m
  • Django实现音乐网站 ⒅

    使用Python Django框架做一个音乐网站 本篇主要为歌单列表 歌单详情及推荐页 歌单内容改动 目录 歌单列表 设置路由 视图处理 模板渲染 歌单 单曲列表 设置路由 视图处理 模板渲染 推荐页 歌单列表 模板渲染修改 总结 歌单列表
  • C语言字节数

    bool 1字节 char 1字节 short 2字节 string 4字节 int 4字节 指针4字节 float 4字节 double 8字节 long 4或8字节 long long 8字节 long double 12字节 空类1字
  • ArcFace loss与其他改进loss对比

    ArcFace loss与其他改进loss对比 sphereFace A softmax cos ma 角度距离 cosFace AM softmax cosa m 余弦距离 ArcFace Arc softmax cos a m 角度距离
  • ICCV, ECCV, CVPR,IEEE的关系

    计算机视觉领域世界三大顶级会议分别为CVPR ICCV和ECCV CVPR CVPR 英文全称IEEE Conference on Computer Vision and Pattern Recognition 中文全称是国际计算机视觉与模
  • FeignClient中name和url属性的作用

    定义 feign是声明式的web service客户端 它让微服务之间的调用变得更简单了 类似controller调用service Spring Cloud集成了Ribbon和Eureka 可在使用Feign时提供负载均衡的http客户端
  • node-ffi ffi.Library往电脑窗口的任意光标处输入内容(user32.dll)window电脑

    node ffi ffi Library往电脑窗口的任意光标处输入内容 user32 dll window电脑 类似键盘输入法的效果 前提 遇到问题 解决问题了 补充安装库遇到的问题 类似键盘输入法的效果 我node项目和electron项
  • 语义分割评价指标mIOU的计算

    语义分割评价指标mIOU的计算 注意事项 这是针对重构了的语义分割网络 而不是之前的那个 所以不要询问原来的网络计算miou要怎么做 因为整个文件构架差距过大 建议使用新构架 学习前言 算一下语义分割的miou 做好生态链 什么是mIOU
  • 北大青鸟汉字注释机内码_北大青鸟消防主机如何编写汉字注释?

    北大青鸟消防主机汉字注释有两种 一种是利用编程调试软件进行编写文字注释 另一种是直接在消防主机上对照汉字机内码 进入系统进行编辑 下面小编跟大家介绍的是使用编程调试软件进行文字注释的方法 1 序号 项 序号 项自动生成 不需用户自己填写 2
  • 【SSO单点登录】JWT续签问题 && OAuth2.0 中的refreshToken刷新机制

    本篇速览 JWT续签问题 快过期时返回新的token refreshToken 如何判断refreshToken的有效性 扩展 OAuth2 0 中的refreshToken刷新机制 其他需要刷新token的情况 用户修改了角色权限 删除了
  • SQL优化之 not in

    not in select from dic region old a where a region code not in select b region code from dic region b PL SQL 执行 选择17 行 耗
  • 通过liquibase将PostgreSQL数据库导入到H2数据库

    1 背景 项目中使用的数据库是PostgreSQL 在做测试时 想使用H2代替 2 问题 2 1 保留字 在PostgreSQL中使用了几个H2的保留字 例如 end offset foreign 这些保留字是不能作为表的字段名 2 2 字
  • Java加解密的基础

    在Java的安全包中 包括了三部分内容 1 JCA JCE Java Cryptography Architecture JavaCryptography Extensions 2 JSSE Java Secure Sockets Exte
  • Jenkins + NACOS + GATEWAY 实现微服务不停机部署

    Nacos 版本
  • 【第11篇】MobileNetV2:倒置残差和线性瓶颈

    MobileNetV2 倒置残差和线性瓶颈 文章目录 MobileNetV2 倒置残差和线性瓶颈 摘要 1 简介 2 相关工作 3 预备 讨论和直觉 3 1 深度可分离卷积 3 2 线性瓶颈 3 3 倒置残差 3 4 信息流解读 4 模型架
  • LCD和FSMC的那点事 和STM32F4 FSMC 34PIN 16位数据并口 TFTLCD,点亮屏幕步骤

    LCD和FSMC的那点事 A 先说一下几种LCD interface 包括但不限于以下三种 1 SPI 2 FSMC 就是常说的8080 或者称80并口 都是一个意思 参考 STM32 FSMC模拟8080时序 点亮 液晶屏 点亮显示屏的几