从零构建:STM32 HAL库驱动迪文DGUS触摸屏的工程化实践
在嵌入式项目的交互界面开发中,迪文DGUS串口屏以其出色的性价比和丰富的图形化开发工具,成为了许多工程师的首选。它省去了复杂的底层GUI开发,让开发者可以专注于业务逻辑。然而,将这块屏幕与STM32微控制器稳定、高效地集成起来,却并非简单的串口数据收发。市面上不少教程停留在基础的指令发送层面,缺乏对协议封装、错误处理、驱动架构等工程化细节的深入探讨。今天,我们就抛开那些零散的代码片段,从工程实践的角度,手把手构建一个面向STM32 HAL库、具备良好封装性和可移植性的迪文屏驱动库。
1. 理解迪文DGUS屏的“变量驱动”核心
在开始写代码之前,我们必须先理解迪文屏的工作哲学。与直接操作像素的显示屏不同,DGUS屏采用变量驱动模式。你可以将其想象成一个拥有大量“变量地址”的从设备,每个地址对应屏幕上的一个控件(如文本显示、图标、进度条、按钮等)。STM32作为主设备,其核心任务就是通过串口,对这些地址进行读、写操作,从而控制屏幕显示内容和获取触摸反馈。
迪文的指令集极其精简,核心只有5条,覆盖了所有交互需求:
| 指令码 | 指令名称 | 功能描述 | 数据地址宽度 | 数据宽度 |
|---|---|---|---|---|
| 0x80 | 写寄存器 | 向屏的配置寄存器写入数据 | 1字节 (0x00-0xFF) | 1字节 |
| 0x81 | 读寄存器 | 从屏的配置寄存器读取数据 | 1字节 (0x00-0xFF) | 1-N字节 |
| 0x82 | 写变量存储器 | 向变量存储区写入数据 | 2字节 (0x0000-0xFFFF) | 2字节/字 |
| 0x83 | 读变量存储器 | 从变量存储区读取数据 | 2字节 (0x0000-0xFFFF) | 2字节/字 |
| 0x84 | 写曲线缓冲区 | 向曲线缓冲区写入数据 | 通道模式 (1字节) | 2字节/字 |
所有指令都遵循一个统一的帧结构:帧头(0x5A A5) + 数据长度 + 指令码 + 数据域 + CRC16校验(可选)。数据长度字节仅表示指令码之后的数据字节数。CRC校验范围是从指令码开始到数据域结束。
提示:寄存器主要用于配置屏幕参数(如背光、RTC时间、蜂鸣器),而变量存储器则是与用户界面控件交互的主战场。理解这两者的区别是正确驱动屏幕的关键。
2. 驱动架构设计:面向对象的思想在C语言中的实践
好的驱动不应该是一堆全局函数的堆砌。我们借鉴面向对象的思想,为迪文屏抽象出一个“对象”。这个对象封装了屏的状态和操作接口,使得驱动代码更清晰、更易复用,并且能轻松支持多屏实例。
2.1 定义驱动对象与数据类型
首先,我们创建头文件 dwin_touch.h,定义核心的数据结构和接口。
#ifndef __DWIN_TOUCH_H
#define __DWIN_TOUCH_H
#ifdef __cplusplus
extern "C" {
#endif
#include "stdint.h"
#include "stdbool.h"
/* 校验模式枚举 */
typedef enum {
DWIN_CHECK_NONE = 0, /* 不进行CRC校验 */
DWIN_CHECK_CRC /* 启用CRC-16校验 */
} Dwin_CheckMode_t;
/* 迪文屏对象结构体 */
typedef struct {
/* 属性 */
Dwin_CheckMode_t check_mode; // 当前校验模式
void (*uart_tx)(uint8_t *data, uint16_t len); // 底层串口发送

&spm=1001.2101.3001.5002&articleId=150097121&d=1&t=3&u=4841cf6f54b74a23bf1e31946b6763e7)
2841

被折叠的 条评论
为什么被折叠?



