【APM32F411V Tiny Board测评】驱动 SPI LCD
本帖最后由 [鑫森淼焱垚] 于 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 效果:
https://www.bilibili.com/video/BV1az421Y7zw/?vd_source=8f2bbf56b70c541bec2ea0b9f102ebee
软件 SPI 效果:
https://www.bilibili.com/video/BV19M4m1k7Ev/
SPI通信稳定性怎样?
页:
[1]