[开发工具] STM32CubeMX_17 | 使用硬件SPI驱动TFT-LCD(ST7789)

[复制链接]
6575|46
 楼主| programmable 发表于 2020-4-12 18:42 | 显示全部楼层 |阅读模式
本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件SPI外设与ST7789通信,驱动16bit TFT-LCD 屏幕。
 楼主| programmable 发表于 2020-4-12 18:43 | 显示全部楼层
0. 前言
我的一些个人观点:
      学习 SPI 外设驱动LCD屏幕没有必要手写驱动,学习这部分代码的目的是为了了解TFT-LCD的工作原理,每个像素点是如何显示的,不要花过多的精力在弄明白每个命令的意思,建议基于本驱动,学习一下打点,画线算法,画圆算法,画多边形算法等等,还可以学习显示英文字符,中文字符,最后还可以移植STemwin显示界面等等好玩的东西~
796415e92f0bfa30b4.png
 楼主| programmable 发表于 2020-4-12 18:43 | 显示全部楼层
 楼主| programmable 发表于 2020-4-12 18:44 | 显示全部楼层
1. 准备工作
硬件准备
开发板
首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi):
849275e92f0fd64454.png
 楼主| programmable 发表于 2020-4-12 18:45 | 显示全部楼层
LCD屏幕

小熊派开发板板载LCD屏幕大小1.3寸,分辨率240*240,色彩深度16bit,使用ST7789V2液晶控制器。
 楼主| programmable 发表于 2020-4-12 18:45 | 显示全部楼层
软件准备
     需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码;
     准备一个串口调试助手,这里我使用的是Serial Port Utility;

Keil MDK和串口助手Serial Port Utility 的安装包都可以在文末关注公众号获取,回复关键字获取相应的安装包:
352455e92f144495bc.png
 楼主| programmable 发表于 2020-4-12 18:46 | 显示全部楼层
2.生成MDK工程
选择芯片型号
打开STM32CubeMX,打开MCU选择器:
879125e92f166bf283.png
 楼主| programmable 发表于 2020-4-12 18:47 | 显示全部楼层
搜索并选中芯片STM32L431RCT6:
101715e92f19f680f8.png
 楼主| programmable 发表于 2020-4-12 18:47 | 显示全部楼层
配置时钟源
      如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC;
      如果使用默认内部时钟(HSI),这一步可以略过;

这里我都使用外部时钟:
214875e92f1cd36b89.png
 楼主| programmable 发表于 2020-4-12 18:48 | 显示全部楼层
配置LCD控制GPIO
595745e92f20b4f6f8.png
 楼主| programmable 发表于 2020-4-12 18:49 | 显示全部楼层
配置SPI2接口
查看小熊派LCD接口的原理图:
317165e92f23ddfc42.png
626055e92f24424532.png
 楼主| programmable 发表于 2020-4-12 18:50 | 显示全部楼层
引脚对应表如下:

110845e92f2810dc37.png
 楼主| programmable 发表于 2020-4-12 18:51 | 显示全部楼层
MCU只需要通过SPI向LCD控制器发送命令/数据即可,所以硬件上接 SPI2 的 SCK 和 MOSI 引脚,软件上将SPI2配置为发送主机模式,接下来开始配置SPI2接口:

参数设置如下:
926715e92f29b33c1e.png
 楼主| programmable 发表于 2020-4-12 18:52 | 显示全部楼层
SPI2默认SCK引脚是PB10,和开发板不对应,所以重新修改引脚为PB13:
154545e92f2c31a1aa.png
 楼主| programmable 发表于 2020-4-12 18:52 | 显示全部楼层
配置时钟树
STM32L4的最高主频到80M,所以配置PLL,最后使HCLK = 80Mhz即可:
682965e92f2e80b58e.png
 楼主| programmable 发表于 2020-4-12 18:53 | 显示全部楼层
生成工程设置

726175e92f308a4573.png
 楼主| programmable 发表于 2020-4-12 18:55 | 显示全部楼层
代码生成设置
最后设置生成独立的初始化文件:
487685e92f3b499655.png
 楼主| programmable 发表于 2020-4-12 18:56 | 显示全部楼层
生成代码
点击GENERATE CODE即可生成MDK-V5工程:
112295e92f3c77f823.png
 楼主| programmable 发表于 2020-4-12 18:57 | 显示全部楼层
3. 编写LCD驱动(ST7789)—— 封装宏和底层函数
3.1. 封装控制LCD控制引脚高低电平的宏
控制引脚宏定义已经包含在 main.h 中,如图:
822765e92f4055fe8d.png
 楼主| programmable 发表于 2020-4-12 18:58 | 显示全部楼层
在编写驱动的过程中需要不断的控制这些控制引脚的电平,所以首先在 lcd_spi2_drv.h 头文件中编写控制这些引脚的宏:

  1. #include "main.h"

  2. #define    LCD_PWR(n)        (n?\
  3.                         HAL_GPIO_WritePin(LCD_PWR_GPIO_Port,LCD_PWR_Pin,GPIO_PIN_SET):\
  4.                         HAL_GPIO_WritePin(LCD_PWR_GPIO_Port,LCD_PWR_Pin,GPIO_PIN_RESET))
  5. #define    LCD_WR_RS(n)    (n?\
  6.                         HAL_GPIO_WritePin(LCD_WR_RS_GPIO_Port,LCD_WR_RS_Pin,GPIO_PIN_SET):\
  7.                         HAL_GPIO_WritePin(LCD_WR_RS_GPIO_Port,LCD_WR_RS_Pin,GPIO_PIN_RESET))
  8. #define    LCD_RST(n)        (n?\
  9.                         HAL_GPIO_WritePin(LCD_RST_GPIO_Port,LCD_RST_Pin,GPIO_PIN_SET):\
  10.                         HAL_GPIO_WritePin(LCD_RST_GPIO_Port,LCD_RST_Pin,GPIO_PIN_RESET))
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

394

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部