使用STM32的迪文屏控制使用参考方式

一、迪文屏通信协议封装

// 帧头定义

#define DWIN_HEAD1 0x5A

#define DWIN_HEAD2 0xA5

// 发送数据到指定地址(写变量存储器)

void DWIN_WriteData(uint16_t addr, uint8_t *data, uint8_t len)

{

uint8_t tx_buf256;

uint8_t pos = 0;

tx_bufpos++ = DWIN_HEAD1; // 帧头1

tx_bufpos++ = DWIN_HEAD2; // 帧头2

tx_bufpos++ = len + 3; // 数据长度(命令+地址+数据)

tx_bufpos++ = 0x82; // 写变量存储器命令

tx_bufpos++ = (addr >> 8) & 0xFF; // 地址高字节

tx_bufpos++ = addr & 0xFF; // 地址低字节

for(uint8_t i = 0; i < len; i++) {

tx_bufpos++ = datai;

}

HAL_UART_Transmit(&huart1, tx_buf, pos, 100);

}

// 发送16位数据(单通道曲线数据)

void DWIN_WriteWord(uint16_t addr, uint16_t data)

{

uint8_t buf2;

buf0 = (data >> 8) & 0xFF; // 高字节在前

buf1 = data & 0xFF;

DWIN_WriteData(addr, buf, 2);

}

// 发送32位数据(双精度或长整型)

void DWIN_WriteLong(uint16_t addr, uint32_t data)

{

uint8_t buf4;

buf0 = (data >> 24) & 0xFF;

buf1 = (data >> 16) & 0xFF;

buf2 = (data >> 8) & 0xFF;

buf3 = data & 0xFF;

DWIN_WriteData(addr, buf, 4);

}

二、曲线数据发送(实时曲线方式)

迪文屏的实时曲线通常使用 0x9010-0x9FFF 区域作为通道缓冲区:

// 通道地址定义(根据DGUS工程设置调整)

#define CURVE_CH0_ADDR 0x9010 // 通道0基地址

#define CURVE_CH1_ADDR 0x9020 // 通道1基地址

#define CURVE_CH2_ADDR 0x9030 // 通道2基地址

#define CURVE_CH3_ADDR 0x9040 // 通道3基地址

// 发送曲线数据(Y轴数值,范围0-65535或根据量程调整)

void DWIN_SendCurveData(uint8_t channel, uint16_t value)

{

uint16_t addr;

switch(channel) {

case 0: addr = CURVE_CH0_ADDR; break;

case 1: addr = CURVE_CH1_ADDR; break;

case 2: addr = CURVE_CH2_ADDR; break;

case 3: addr = CURVE_CH3_ADDR; break;

default: return;

}

DWIN_WriteWord(addr, value);

}

// 批量发送曲线数据(提高刷新率)

void DWIN_SendCurveBatch(uint8_t channel, uint16_t *data, uint8_t count)

{

uint16_t addr;

switch(channel) {

case 0: addr = CURVE_CH0_ADDR; break;

case 1: addr = CURVE_CH1_ADDR; break;

case 2: addr = CURVE_CH2_ADDR; break;

case 3: addr = CURVE_CH3_ADDR; break;

default: return;

}

// 批量发送(迪文屏支持连续地址写入)

uint8_t tx_buf256;

uint8_t pos = 0;

uint8_t len = count * 2; // 每个数据2字节

tx_bufpos++ = 0x5A;

tx_bufpos++ = 0xA5;

tx_bufpos++ = len + 3; // 长度

tx_bufpos++ = 0x82; // 写命令

tx_bufpos++ = (addr >> 8) & 0xFF;

tx_bufpos++ = addr & 0xFF;

for(uint8_t i = 0; i < count; i++) {

tx_bufpos++ = (datai >> 8) & 0xFF;

tx_bufpos++ = datai & 0xFF;

}

HAL_UART_Transmit(&huart1, tx_buf, pos, 100);

}

三、实际应用示例(ADC数据采集显示)

// ADC值转换为曲线Y坐标(假设ADC 12位,曲线高度300像素)

uint16_t ADC_To_CurveY(uint16_t adc_val)

{

// 映射:0-4095 -> 0-300(根据实际曲线控件高度调整)

return (uint16_t)((uint32_t)adc_val * 300 / 4096);

}

// 主循环中定时发送

void main_loop(void)

{

static uint32_t last_tick = 0;

uint16_t adc_val, curve_y;

if(HAL_GetTick() - last_tick >= 50) { // 20Hz刷新率

last_tick = HAL_GetTick();

// 读取ADC

adc_val = HAL_ADC_GetValue(&hadc1);

// 转换为曲线坐标

curve_y = ADC_To_CurveY(adc_val);

// 发送到迪文屏通道0

DWIN_SendCurveData(0, curve_y);

// 同时发送数值显示(假设显示地址0x1000)

DWIN_WriteWord(0x1000, adc_val);

}

}

四、DGUS屏软件配置要点

添加曲线控件:在DGUS Tool中选择"趋势图"或"实时曲线"控件

设置通道数:1-4通道可选

设置Y轴范围:匹配STM32发送的数据范围(如0-300)

设置数据地址:

实时曲线:使用0x9010+(通道号×0x10)

历史曲线:使用自定义变量地址(如0x1000)

相关推荐
瑞瑞小同学2 小时前
处理echarts x轴内容过多,重叠问题
前端·javascript·echarts
HexCIer2 小时前
面向未来的原子化 CSS:UnoCSS 核心架构分析与 Tailwind CSS 现状
前端·css·vite
程序员黑豆3 小时前
鸿蒙应用开发中的单位详解:px、vp、fp、lpx
前端·harmonyos
像我这样帅的人丶你还3 小时前
MCP + npm:给五年前的老系统接上AI
前端·javascript·agent
南一Nanyi3 小时前
依赖注入和控制反转
前端·设计模式·nestjs
小村儿3 小时前
连载14-实战篇--一个半月,我一个人和 Claude Code 搭出一套数字人工程
前端·后端·ai编程
愚公移码4 小时前
蓝凌EKP18产品:流程虚拟机(PVM)
java·开发语言·前端
十月的皮皮4 小时前
stm20260720-从新手 C 到量产 STM32 工程:程序设计推导指南
c语言·开发语言·stm32·stm32cubemx·hal库
promiseThen4 小时前
5 分钟上手 Markdown:标题到表格、代码块与简历实战
前端
web66liang4 小时前
webpack4+vue2项目使用 sass-embedded 导致的 DockerfIle 构建失败的问题
前端