打印
[活动]

【APM32F411V Tiny Board测评】驱动 SPI LCD

[复制链接]
175|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 [鑫森淼焱垚] 于 2024-5-22 12:41 编辑

【APM32F411V Tiny Board测评】驱动 SPI LCD

屏幕介绍
    屏幕参数
    屏幕靓照
    屏的原理图
    屏幕连线
移植LCD驱动
    新建工程
        芯片类型选择:APM32F411VE
        编译器选择:AC5
        编译选项添加宏定义: APM32F411, APM32F411_TINY
        调试器选择:CMSIS-DAP Debugger
        源文件
        头文件路径
    移植 ST7789 驱动
    前言
    管脚配置
    初始化管脚
        软件SPI初始化
        硬件SPI初始化
    发送一个字节到LCD Driver IC
    踩坑
    移植结果
        添加测试代码
        移植结果

屏幕介绍


在某宝购买的一块 TFT LCD,2.4寸液晶屏,SPI串口,带字库。其型号为 ZJY240S10Z0TG11,显示屏驱动IC为 ST7789。

屏幕参数

显示模式:TFT
分辨率:240x320
接口类型:SPI-4线
驱动IC: ST7789


屏的原理图









屏幕连线

分析了LCD屏幕的通信接口之后,找到了开发板上的SPI1管脚作为 SPI ,其他几个管脚用作控制线,如下表所示

显示屏管脚
开发板管脚
说明
GND
  电源地
VCC
  3.3V
CLK
PA5 -- SPI1 SCLK
SPI CLK
MOSI
PA7 -- SPI1 MOSI
SPI MOSI,MCU向屏幕发送数据
RES
PB5
屏幕驱动IC复位信号,低电平有效。
DC
PB6
Data/Command 控制信号:
高电平表示MCU向屏幕传输显示数据;低电平表示MCU向屏幕传输命令。
BLK
PB7
背光控制。
高电平表示打开背光;低电平表示关闭背光。
MISO
PA6 -- SPI1 MISO
SPI MISO,屏幕向MCU发送的数据。
CS1
PB8
显示屏的片选信号:
低电平有效;高电平失效。
CS2
PB9
字库芯片的片选信号:
低电平有效;高电平失效。


移植LCD驱动

新建工程


芯片类型选择:APM32F411VE




编译器选择:AC5




编译选项添加宏定义: APM32F411, APM32F411_TINY




调试器选择:CMSIS-DAP Debugger




在 Flash Download 标签页中勾选 Reset and Run,下载就自动运行程序。




源文件

添加如下几个分组:
  • Applications,添加 main.c 和 apm32f4xx_int.c 两个源文件
  • Boards/LCD,添加 LCD 驱动相关的文件,这里 lcd.c 实现画点、画线、显示字符的函数;而 lcd_init.c 才是 LCD 硬件驱动实现,移植驱动主要修改这个文件;zk.c 是字库驱动,如果不使用字库可以不添加;
  • Boards,是 APM32F4xx_SDK_V1.4 自带的 BSP 驱动,全都添加进来;
  • CMSIS,只添加 system_apm32f4xx.c 和startup_apm32f4xx.s 文件,只负责启动和时钟配置;
  • APM32_StdDriver,是 SDK 中的标准库,全都添加进来;





头文件路径

按照需要添加头文件路径,如下所示



移植 ST7789 驱动

根据前文屏幕连线设置,选用 SPI1 来驱动LCD,片选信号都是用软件片选,其他几个控制信号也都是GPIO来驱动。


前言

卖家提供的示例工程都是 GPIO 模拟 SPI 驱动。考虑到这种方式驱动屏幕比较慢,所以我一开始就上硬件SPI。没想到初始化失败了,退而求其次,用软件SPI。所以下面的管脚配置有两套代码,一套硬件SPI、一套软件SPI。


管脚配置

SPI1 的SCLK/MOSI/MISO 分别映射到 PA5/PA6/PA7 上。
这里使用宏定义,方便后期更换管脚尽可能地少修改代码。


其他5个控制信号配置如下:





初始化管脚

LCD 初始化流程如下:
LCD_Init() --> LCD_GPIO_Init() --> 下发屏的初始化命令。
在 LCD_GPIO_Init() 中初始化管脚和SPI。下面的代码已经支持硬件SPI和软件SPI,所以用宏定义区分开来。


软件SPI初始化

所有管脚都是GPIO方式,如下代码所示:




硬件SPI初始化





发送一个字节到LCD Driver IC

函数 LCD_Write_Bus() 负责发送一个字节到LCD Driver,实现如下:

软件实现很简单,移位、发送最高比特即可。
硬件实现,发送时先等待 SPI_FLAG_TXBE 置位;接收时需要先判断 SPI_FLAG_RXBNE 置位。




初始化 LCD Driver IC

在初始化 LCD 管脚之后,需要发送屏初始化命令、设置参数。这个没什么好说的,按照厂商提供的示例即可。
一般在初始化的最后一步才打开屏幕显示。例如 ST7789 命令 0x29 是 Display On 命令,所以在初始化的最后一步是 LCD_WR_REG(0x29)


踩坑

  • 管脚配错,换了几块开发板,都没能点亮屏幕。后来使用 APM32F411 Tiny Board,一个管脚一个管脚配置输入、输出模式,验证每个管脚功能正常后,才把软件SPI方式驱动ST7789跑通。最后再上硬件SPI,也顺利跑通。
  • 硬件SPI收发时,需要先等待SPI发送缓冲区为空才能发送,而且发送完必须接收一个字节,否则出错。

移植结果

添加测试代码




移植结果





硬件 SPI 效果:


软件 SPI 效果:





使用特权

评论回复
沙发
szt1993| | 2024-5-23 16:49 | 只看该作者
SPI通信稳定性怎样?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

74

帖子

0

粉丝