1. 陶晶驰串口屏与STM32CubeMX开发环境搭建
第一次接触陶晶驰串口屏的朋友可能会觉得它很神秘,其实它就是个带触摸功能的显示屏,通过串口和单片机通信。我去年做智能家居中控项目时就用了它,实测下来确实比传统LCD屏省事不少。STM32CubeMX是ST官方推出的图形化配置工具,能自动生成初始化代码,特别适合快速开发。
硬件连接很简单:用杜邦线把串口屏的TX接STM32的RX(如USART1_RX PA10),RX接TX(PA9),别忘了共地。电源建议单独供电,我遇到过串口干扰导致屏幕闪烁的情况,后来改用独立5V电源就稳定了。
软件环境需要准备:
- STM32CubeMX最新版(我用的6.9.0)
- Keil MDK或STM32CubeIDE
- 陶晶驰屏的配套资料包(含通信协议文档)
安装时有个小坑要注意:CubeMX的HAL库版本要和IDE里的保持一致。我有次用CubeMX生成代码后编译报错,折腾半天发现是Keil里用的HAL库版本太旧。
2. 串口中断接收配置实战
2.1 CubeMX基础配置
打开CubeMX新建工程,选择你的STM32型号(我用的F103C8T6)。关键配置步骤如下:
- 在Pinout界面启用USART1
- 模式选择Asynchronous
- 参数设置:波特率115200(与屏幕默认一致),8位数据,无校验,1停止位
- NVIC Settings里勾选USART1全局中断
生成代码前记得在Project Manager里选对IDE类型。第一次使用时我忘了改Toolchain,生成的Keil工程全是IAR配置,闹了个大笑话。
2.2 中断接收代码实现
生成的代码已经包含串口初始化,我们需要自己写中断处理逻辑。陶晶驰屏的数据帧格式通常是:
0x0A [长度] [指令] [数据] 0x0B在main.c里添加缓冲区定义:
#define BUF_SIZE 64 uint8_t rx_buf[BUF_SIZE]; uint8_t rx_index = 0;重写中断回调函数:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART1) { uint8_t byte = huart->Instance->DR; // 帧头检测 if(byte == 0x0A) rx_index = 0; // 存入缓冲区 if(rx_index < BUF_SIZE) { rx_buf[rx_index++] = byte; // 帧尾检测 if(byte == 0x0B) { process_command(rx_buf, rx_index); rx_index = 0; } } HAL_UART_Receive_IT(huart, &byte, 1); } }别忘了在main()里启动中断接收:
uint8_t temp; HAL_UART_Receive_IT(&huart1, &temp, 1);3. PWM输出配置与联动控制
3.1 PWM基础配置
回到CubeMX,以控制LED亮度为例:
- 启用TIM3 Channel1(PA6)
- 时钟源选Internal Clock
- 参数设置:
- Prescaler: 71 (72MHz/72=1MHz)
- Counter Mode: Up
- Period: 999 (1MHz/1000=1kHz PWM)
- Pulse: 初始占空比500(50%)
生成代码后,在main()初始化部分添加:
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 500);3.2 指令解析与PWM控制
实现process_command函数:
void process_command(uint8_t* buf, uint8_t len) { if(len < 5 || buf[0]!=0x0A || buf[len-1]!=0x0B) return; uint8_t cmd = buf[2]; uint8_t value = buf[3]; switch(cmd) { case 0x01: // 亮度调节 __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, value*10); send_response("OK"); break; default: send_response("ERR"); } }4. 数据反馈与界面联动
陶晶驰屏支持动态更新控件属性,我们可以把PWM实际值回显到屏幕上。在send_response函数中实现:
void send_response(char* msg) { uint8_t tx_buf[32]; sprintf(tx_buf, "0A 03 01 %s 0B", msg); // 简化协议 HAL_UART_Transmit(&huart1, tx_buf, strlen(tx_buf), 100); }屏幕端需要配置"数值显示"控件,设置其VALUE属性与单片机返回的数据绑定。我在项目中发现一个实用技巧:可以在屏幕工程里添加调试文本框,专门显示原始通信数据,排查问题时特别方便。
5. 常见问题排查指南
5.1 通信不稳定问题
如果出现数据丢帧或乱码:
- 检查波特率是否一致(屏幕和代码配置)
- 测量电源电压是否稳定(建议示波器看纹波)
- 尝试降低波特率测试(比如改到9600)
5.2 PWM输出异常
遇到PWM无输出或频率不对:
- 确认GPIO复用配置正确(CubeMX里引脚要显示TIMx_CHx)
- 检查时钟树配置(APB1定时器时钟要使能)
- 用逻辑分析仪抓取波形验证参数
5.3 屏幕触控不同步
触控操作无响应时:
- 确认屏幕校准数据是否保存
- 检查通信协议版本(有些老屏需要特殊指令)
- 测试发送简单指令(如页面切换)确认基础通信正常
调试时建议准备一个USB转TTL工具,可以直接用串口助手测试屏幕指令,排除单片机代码的影响。我习惯用这种分治法,能快速定位问题所在。