本帖最后由 Zhao_kar 于 2023-10-5 18:18 编辑
STM32L476RG第三节——基于TJC的串口屏的串口基本使用
闲聊:上一期讲了串口,然后接下来就讲解串口屏的使用,这边使用的是TJC的串口屏,然后需要下载一下他们家的UI设计软件USART HMI,方便后续开发,这一节没有什么理论,只讲怎么使用这个软件和如何使用stm32的串口去驱动屏幕。
上一期的补充:上一期我没有提到RXTX这个,单片机串口和ch340的连接是这么个顺序,单片机的RX连接ch340的TX,TX连接ch340的RX。
这一期的补充:本次需要两个CH340模块,因为需要依赖HMI软件的一个串口功能方便开发,免得连线连来连去的。
此外备注:本次只是简单讲讲使用,后续项目中,实际上用的到的可能只有文本显示,也就是变量显示功能,然后本篇报告因为展示,会使用上一期没讲到的串口接收函数。本次实验实现功能为
- 串口屏的HMI自带仿真调试
- 按键组件和文本组件的使用
- 按键按下控制单片机LED亮灭
- 按键按下控制单片机向串口屏发送信息使得文本显示
一、硬件连接
本次实验实际需要串口屏一个,两个ch340,一个stm32l4单片机,具体连线为,串口屏的5V和GND供电交给第一个ch340模块,RX与TX与ch340的相反连接,第二个ch340用于和单片机连接。如下图1
二、HMI的配置和使用
1、首先下载HMI的软件,打开界面,然后新建文件不讲解了,选对型号就行,根据自己的屏幕型号选择
2、添加控件,如下,两个按钮,四个文本控件,其中两个用于接收单片机发送的数据,从而显示,如下图2
3、添加字库,字库和文件建立这里不说了,自己可以摸索,值得注意的是字库要用gb123,别用utf8,这样子默认的会出错,导致串口屏下载的时候无法下载
4、编写函数
- 按钮一添加
printh 01
- 按钮二添加
printh 02
5、改变组件的TXT显示,只需要在这个位置更改就行
6、注释:这里不用管,因为就一个字库
- 按键使用,字库font选择,这个需要选择一个字库去显示文字
- txt_maxl——字符最大长度,这个用于分配内存空间
7、串口屏配置完成,进行下载,可以看到下载成功后如下图
三、cubemx的配置和keil的编写
1、跟上一篇一样,usart的配置和其他的不变,唯一需要添加到是中断,需要勾选usart1的中断,以及为了点灯,把GPIO的PA5配置一下就行了。
2、函数和代码块的解释
- uint8_t Rx; //定义一个RX,用于单片机的接收,即为,在单片机的中断处,使用RX来接受外部串口设备的值
- uint16_t TX1=01;//定义两个变量,一个用于发送到串口屏的文本一
- uint16_t TX2=02;//发送到文本二
- HAL_UART_Receive_IT(&huart1, (uint8_t *)&Rx, 1);//上一篇讲过了,就是一个接收函数,这里用于接收RX的值(PS:我的RX的x小写了,不用管,按照自己的写就行)
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart == &huart1)
{
switch(Rx)
{
case 0x01:
{
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
// printf("01");
printf("t2.txt=\"%u \"\xff\xff\xff", TX1);
} break;
case 0x02:
{
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
// printf("02");
printf("t3.txt=\"%u \"\xff\xff\xff", TX2);
} break;
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&Rx, 1);//循环使能,才能不断接政
}
}
重点解释这部分,这个是用于单片机的串口中断函数的,如果单片机的串口检测到接收到了数据,进入中断,然后使用switch判断,如果RX的值是1,则关闭LED,如果RX的值是2,则打开LED,同时,向文本组件发送数据。
-
printf("t2.txt=\"%u \"\xff\xff\xff", TX1); //这是文本显示部分,用于单片机向串口组件发送数据,其中t2是对应组件的标签,后面的不用管,知道是16进制的就行,TX1就是我们要发送的。
3、keil的编写
- cubemx跟第二节一样,没什么变动,所以接下来直接讲keil如何操作,且HMI已经配置成功
- 首先要配置printf函数,跟第二节一样,usart.c配置一下就行了,且勾选mircousb的选项
- 然后包含#include<stdio.h>
- 然后定义变量,如前面提到的三个,rx,tx1,tx2
uint8_t Rx;
uint16_t TX1=01;
uint16_t TX2=02;
- 然后在主函数的begin2处添加接收函数
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1, (uint8_t *)&Rx, 1);
/* USER CODE END 2 */
- 接下来在begin4添加中断函数
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart == &huart1)
{
switch(Rx)
{
case 0x01:
{
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
// printf("01");
printf("t2.txt=\"%u \"\xff\xff\xff", TX1);
} break;
case 0x02:
{
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
// printf("02");
printf("t3.txt=\"%u \"\xff\xff\xff", TX2);
} break;
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&Rx, 1);//循环使能,才能不断接政
}
}
/* USER CODE END 4 */
基本上代码就完成了,前面也大概解释了,按照操作来,HMI串口屏还有很多功能,想学习的话去找官网资料,这边不引流不打广告,TJC搜一下就可以找资料了。
四、实际操作
1、首先打开HMI的调试,经过前面的配置,调试端口,可以看到按下按钮1,会显示01,按下按钮2会显示02(这是HMI的虚拟调试,如下图)
2、打开VOFA,此时按下实物的按钮1,串口接受到01,按下2同理
3、关闭vofa免得冲突,1和2的实验中,之所以两个文本没接受到数据,很简单,因为此时串口屏只作为发送端,而没有接收数据,所以到了单片机的部分
4、打开仿真调试,使用MCU输入,选择前面stm32对应的ch340串口端口,然后按下按钮1,再按下按钮2,可以看到如下情况(放视频)
- 单片机led没亮
- 仿真中可以看到串口屏发送了01,然后文本框1的0变成了1
- 按下2之后,led点亮,文本框2的文本变成了2
这个仿真要连接stm32的ch340串口
5、因为是测试,而且由于仿真软件的问题,实际上串口1没有发送数据,我们同时可以打开vofa检测串口的实际发出,实际上,仿真软件只是向单片机的串口发送了数据,并且接受到了数据,我们可以按下实物,其实是没反应的,但是打开VOFA检测实际,还是可以看到两个按钮的输出。01和02(实物没反应视频如下)
video3
6、仿真完毕,确认没问题后,我们可以直接实物连接了,把串口屏和单片机连到一起,就可以看到如下的情况了。(直接串口屏连接单片机实物视频)
video4
五、最后补充
总结,本次报告重点介绍了串口屏的基本使用,关键在于如何接收单片机发送的数据并显示,以及单片机如何接收串口屏的数据,并且利用中断回调函数来实现了开关灯的简单操作。
下一期第四节,讲HC05的使用。