基于STM32CUBEMX的淘晶驰串口屏通讯入门

本文介绍了如何在HMICODE环境中进行串口通讯以改变屏幕参数,详细阐述了指令格式及浮点数处理。同时,讲解了如何利用用户存储区进行数据保存和读取,以及如何实现按键长按功能。此外,还展示了通过滑块改变频率的实现过程,并涉及到单片机读取数据的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件名称为HMI CODE,包含两个字库和一个工程

双击test打开工程并照教程载入字库

如图所示为工程模板

如何串口通讯改变屏幕参数

首先点击上方的调试界面进入调试

点击左下角键盘输入,在指令区域输入x1.val=1点击执行所有代码

可以看到此时绿灯旁边示数为0.01这是因为采用了虚拟浮点数,因此想要显示小数就必须乘以100来显示。比如要显示3.14,输入就是314

以串口3为例,单片机执行指令

HAL_UART_Transmit(&huart3,"x1.val=1000\xff\xff\xff", 14, 0xffff);

注意14为长度是要算好的,其他指令根据长度是要变换的,三个\xff为截止符一定要加。

此时选择用户MCU输入,选择好波特率和串口并点击开始可以看到

Vci示数为10,我们输入的指令是1000,虚拟浮点数减少两位为10

如何关机保存数据

写入一个变量到用户存储区(EEPROM)

(支持X3、X5、K0系列)

wepo att,add

att:变量/常量

add: 用户存储区位置(从0开始,到1023结束,总共1024个)

实例1:wepo t0.txt,10 (将t0.txt的内容写入用户存储区的第10位置,在储存区中的占用空间为t0.txt的最大设置值+1,即t0的txt-maxl属性表示的大小+1,假如txt-maxl=20,那么最多可以放下10个汉字或者20个英文字母,实际占用的控件为10-30,共21个位置,下个存储地址应从31开始)

实例2:wepo “abcd”,20   (将字符串“abcd”写入用户存储区的第20位置,在储存区中占用大小为5字节,一个英文字母1个字节,共四个字节,因为是字符串,多加1个字节,最后为5个字节,实际存储地址为20-24,注意:由双引号括起来的或者xx.txt的就是字符串)

实例3:wepo 125,10   (将数值125写入用户存储区的第10位置, 在储存区中占用大小为4字节,即10-13位置)

实例4:wepo “一二三四五”,100 (将”一二三四五”字符串写入用户存储区的第100位置,每个汉字占用2字节,5个汉字共10字节,因为是字符串,加1字节,共11字节,实际存储地址100-110,下个存储地址应该从111开始)

备注:

1.写入内容为变量字符串的时候,在储存区中的占用空间为此变量的最大字符数+1;写入内容为常量字符串的时候,在储存区中的占用空间为此常量字符串的实际字符数+1。

2.写入内容为变量数值或常量数值的时候,在储存区中的占用空间统一为4字节。

3.使用用户存储区读写操作过程中请切记规划好数据区位置,以免位置交错引起数据覆盖错乱。

从用户存储区(EEPRO)读数据到一个变量

repo att,add

att:目标变量

add: 用户存储区位置(从0开始)

实例1:repo t0.txt,10   (从用户存储区的10位置读数据到t0.txt变量中,在储存区中的读取数据量为t0.txt的最大设置值+1,即t0的txt-maxl属性表示的大小+1)

实例2.repo n0.val,10   (从用户存储区的10位置读数据到n0.val,在存储区中的读取数据量为4字节)

备注:

1.读入内容为变量字符串的时候,在储存区中的读取数据量为此变量的最大字符数+1。

2.读入内容为变量数值时候,在储存区中的读取数据量统一为4字节。

3.使用用户存储区读写操作过程中请切记规划好数据区位置,以免位置交错引起数据覆盖错乱。

如何实现按键长按功能

1.新建一个定时器tm0,en属性设置为0,其他属性不用管;此时定时器处于默认关闭状态。

2.在按钮的按下事件中写上如下代码:

tm0.tim=2000     2秒后进入长按功能

tm0.en=1         打开定时器

3.在按钮的弹起事件中写上如下代码:

tm0.en=0        已经松手了,所以定时器立即停止工作

4.在定时器tm0的定时事件中写上如下代码:

tm0.tim=100      按钮刚按下的时候,定时时间是2秒,这里修改为100ms,就意味着如果不松手,每100ms会来执行一次后面的代码

此处写上您想操作的长按事件代码,比如:n0.val++

如何实现单片机读取数据

如图选择滑块来实现频率的改变

在弹起事件和滑动事件中输入

n1.val=h1.val      使用n1显示示数

printh AA         起始标识符,可以自己更改,主要作用是让单片机识别串口数据是谁的

prints h1.val,1     将h1的数据发送出去,长度为1

printh BB         结束标识符,可以自己更改,作用同上

wepo h1.val,10    如前面介绍将数字保存起来

此时单片机内使用字符串接收,黄色部分不能去掉,会报错

#define RXBUFFERSIZE  6    //最大接受字节数

uint8_t RxBuffer[RXBUFFERSIZE];   //接收数据

在主函数写入

HAL_UART_Receive(&huart3, (uint8_t *)&RxBuffer,4,0xff);

此时做逻辑判断

if (RxBuffer[0]==0xAA&&RxBuffer[2]==0xBB) //起始位0是0XAA结束位是0XBB

{

       fre_fenpin=RxBuffer[1];     //fenpin等于第二个数组,也就是我们发送的数据

       fre_val = (fre_fenpin)*10;  //乘以10,因为我分频采用了71,需要计算

       TIM8->ARR=fre_val;//更改频率,不做解释

             HAL_Delay(1);

}

<think>好的,用户想了解晶驰串口STM32F1的兼容性及通信方法,需要教程配置说明。首先,我需要回顾相关的引用资料。引用[2]提到有一个STM32F103与晶驰触摸串口通讯C语言示例,项目地址也提供了,这可能对用户有帮助。另外,引用[1][3]分别讨论了STM32F103与大彩串口蓝牙模块的通信,虽然不完全相关,但其中的串口配置步骤可能有共通之处。 首先,确定用户使用的具体型号,晶驰串口可能有不同型号,但通常它们使用类似的UART协议。接下来,兼容性方面,STM32F1系列通常支持USART,而晶驰一般使用标准串口通信,所以硬件上是兼容的。需要检查电压匹配,比如STM32是3.3V,而串口如果是5V的话,可能需要电平转换模块。 然后,通信方法方面,基本步骤包括配置STM32串口参数(波特率、数据位、停止位、校验位),与幕的设定一致。引用[2]中的示例代码应该展示了如何初始化串口发送数据,用户可能需要参考这部分。此外,引用[1]提到的配置时钟、中断处理数据格式化也是关键点。 可能还需要考虑通信协议,晶驰通常有自己的指令集,比如通过特定格式的字符串或十六进制指令控制显示内容。用户需要查阅晶驰的文档,了解具体的指令格式,然后在STM32代码中构造这些指令并通过串口发送。 另外,引用[3]中提到的使用AT指令配置蓝牙模块,虽然不直接相关,但配置串口的步骤类似,比如设置波特率等,这可能对用户理解串口配置有帮助。需要确保STM32的USART初始化与幕要求的参数一致,比如9600波特率、8N1等。 用户可能需要具体的代码示例,比如初始化USART的函数、发送数据的函数,以及如何处理幕的响应。此外,是否需要中断接收数据,或者采用轮询方式,这也是需要考虑的部分。引用[2]的项目地址提供了示例代码,用户可以参考那里的实现。 最后,验证通信是否正确,可能需要用示波器或逻辑分析仪检查信号,或者通过串口调试助手监控数据流。测试发送简单的指令,比如清或显示文本,确认幕响应正常。 总结步骤:硬件连接(注意电平)、串口参数配置、指令格式处理、代码实现(初始化、发送接收)、测试调试。需要提醒用户注意电压匹配,参考官方文档,以及利用现有示例代码进行开发。</think>### 晶驰串口STM32F1系列通信方法 #### 一、兼容性分析 1. **硬件兼容性** 晶驰串口STM32F1系列(如STM32F103)通过UART(异步串行通信)协议连接,硬件接口兼容。 - **电平匹配**:STM32F1的UART为3.3V TTL电平,晶驰串口通常支持3.3V或5V TTL电平,需根据幕型号确认。若幕为5V电平,需添加电平转换模块(如MAX3232)[^1]。 - **引脚定义**:STM32的TX(发送)接幕RX(接收),RX接幕TX,GND共地。 2. **协议兼容性** 晶驰串口支持文本指令或十六进制指令控制(如清、显示变量等),与STM32的USART外设完全兼容[^2]。 --- #### 二、通信配置步骤 1. **硬件连接** | STM32F1引脚 | 串口引脚 | |-------------|-------------| | PA9 (USART1_TX) | RX | | PA10 (USART1_RX) | TX | | GND | GND | 2. **STM32串口初始化** ```c void USART1_Init(uint32_t baudrate) { GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // 配置TX (PA9) 为推挽输出 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置RX (PA10) 为浮空输入 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStruct); USART_InitStruct.USART_BaudRate = baudrate; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART1, &USART_InitStruct); USART_Cmd(USART1, ENABLE); } ``` 3. **发送指令控制幕** 以文本指令模式为例,发送清指令: ```c void Send_ClearScreen(void) { char cmd[] = "CLS(0);\r\n"; // 清指令格式 for (int i = 0; cmd[i] != '\0'; i++) { USART_SendData(USART1, cmd[i]); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } } ``` 4. **幕初始化设置** - 在晶驰上位机软件中设置通信参数(波特率、数据格式)与STM32配置一致。 - 将生成的幕工程文件烧录至串口。 --- #### 三、调试技巧 1. **逻辑分析仪验证**:通过捕捉TX/RX波形确认数据格式正确性。 2. **串口助手辅助**:先用PC串口助手测试幕响应,再移植代码至STM32。 3. **错误处理**:添加超时机制校验,避免通信阻塞。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值