MSP432提供了对LCD屏操作的库函数,而从整个对LCD的操控来说,自下面上的分成了三层:HAL硬件抽象层,LCD屏的驱动层以及grlib上层图形库。
按照官方文档的介绍grlib库提供了一些上下文控制函数以及一系列简单的图表绘制函数:圆,位图,直线,矩形,字符串,按钮,图像按钮,单选框,多选框,以及位图数据转C格式数据工具。
HAL实现对MCU与LCD之间接口的配置,以及底层LCD控制器的串行通信,实现控制字符与数据字符的传输。 LCD驱动层利用HAL实现LCD的基本元素的绘制(点、直线等的绘制),为 grlib 提供调用接口。
以下为三层架构所对应的头文件,包含各自了所在层的函数原型,以及函数调用的方法
#include <ti/grlib/grlib.h>
#include "LcdDriver/Crystalfontz128x128_ST7735.h"
#include "LcdDriver/HAL_MSP_EXP432P401R_Crystalfontz128x128_ST7735.h"
LCD的初始化代码一般如下:
/* Graphic library context */
Graphics_Context g_sContext; //全局上下文
/* Initializes display */
Crystalfontz128x128_Init(); //驱动层的LCD初始化代码
/* Set default screen orientation */
Crystalfontz128x128_SetOrientation(0); //设置屏幕方向
/* Initializes graphics context */
Graphics_initContext(&g_sContext, &g_sCrystalfontz128x128, &g_sCrystalfontz128x128_funcs);
Graphics_setForegroundColor(&g_sContext, GRAPHICS_COLOR_BLUE);
Graphics_setBackgroundColor(&g_sContext, GRAPHICS_COLOR_WHITE);
GrContextFontSet(&g_sContext, &g_sFontFixed6x8);
可以看出初始化函数调用关系是逐层的,驱动层初始化通过调用HAL层进行硬件初始化,其中包括PortInit、SpiInit与LCD芯片初始化。 PortInit:为TI通用的端口复用配置,针对不同TI芯片电路进行端口的开启与复用,此部分代码同样为通用。
需要定制的只有HAL通信功能引脚的配置:
// Ports from MSP432 connected to LCD
#define LCD_SCK_PORT GPIO_PORT_P1
#define LCD_SCK_PIN_FUNCTION GPIO_PRIMARY_MODULE_FUNCTION
#define LCD_MOSI_PORT GPIO_PORT_P1
#define LCD_MOSI_PIN_FUNCTION GPIO_PRIMARY_MODULE_FUNCTION
#define LCD_RST_PORT GPIO_PORT_P5
#define LCD_CS_PORT GPIO_PORT_P5
#define LCD_DC_PORT GPIO_PORT_P3
// Pins from MSP432 connected to LCD
#define LCD_SCK_PIN GPIO_PIN5
#define LCD_MOSI_PIN GPIO_PIN6
#define LCD_RST_PIN GPIO_PIN7
#define LCD_CS_PIN GPIO_PIN0
#define LCD_DC_PIN GPIO_PIN7
// Definition of USCI base address to be used for SPI communication
#define LCD_EUSCI_BASE EUSCI_B0_BASE
grlib的初始化内容则是主要围绕一个g_sContext结构体进行, Graphics_Context 结构体定义如下:
typedef struct Graphics_Context
{
int32_t size; //!< The size of this structure.
const Graphics_Display *display; //!< The screen onto which drawing operations are performed.
Graphics_Rectangle clipRegion; //!< The clipping region to be used when drawing onto the screen.
uint32_t foreground; //!< The color used to draw primitives onto the screen.
uint32_t background; //!< The background color used to draw primitives onto the screen.
const Graphics_Font *font; //!< The font used to render text onto the screen.
} Graphics_Context;
Graphics_Display *display结构体包括了特定LCD的宽高信息以及驱动函数指针。由此可以看出,LCD屏与上grlib也是分离的,当硬件更换为不同的LCD时,只需修改对应LCD驱动层函数指针,甚至可以实现LCD热更换。
但三层架构的设计架构移植性较高,牺牲了一部分屏幕控制器的硬件性能。