STM32物联网项目-HMI串口屏

HMI串口屏实验

串口屏

屏幕使用的是淘晶池的串口屏,显示内容可以通过官方上位机来编辑,屏幕学习平台:http://wiki.tjc1688.com/doku.phpd=start

通信原理:屏幕里实际也是由单片机在驱动,在屏幕上的操作,最终会变成数据通过底层单片机的串口发送到我们的单片机串口上,就能控制自己的单片机做出相应操作,同时自己的单片机也能发送屏幕能识别的特殊指令到屏幕的单片机里,实现屏幕切换页面等操作

STM32物联网项目-HMI串口屏

这些参数可以在屏幕学习平台的系统变量指令查看到

STM32物联网项目-HMI串口屏

页面设计

上位机软件的使用类似安卓开发的Android Studio,也是可以通过拖控件来完成设计,可对控件的位置,属性和事件进行个性化编辑,类似于面向对象的设计方法,而且软件也是全中文,上手还是比较容易的

软件的使用方法可在官方学习平台上查看,这里记录几点比较重要的地方

1、添加字库

要想在文本框或者按钮上显示文字,就要先创建一个字库,设置字体的编码格式,大小,是指定内容还是所有字符,因为在控件属性里没有设置文字大小的选项,也没有编码选项,所以要制作自己想要的字库

点击工具,字库制作

STM32物联网项目-HMI串口屏

生成字库后导入到软件中,后续的控件就可以根据字库ID号来选择合适大小的文字并显示

STM32物联网项目-HMI串口屏

点击“数码管”按钮后,在下方会显示事件,按下事件是按下瞬间触发,弹起事件是按下后按键恢复原样瞬间触发,一个按键动作就是先按下,再弹起;需要勾选发送键值,键值信息会在后面调试时显示,同时也可以通过串口发送给单片机处理,page 1表示跳转到页面1(id:1),当前页面id是0,页面1就是数码管显示页面

STM32物联网项目-HMI串口屏

3、页面调试

这是比较重要的一步,在设计好页面后,如果不测试就烧录到屏幕中,则可能会出现按钮按下了没有执行跳转命令的情况,又需要改动重新烧录,浪费时间;所以软件有个调试功能,所见即所得,在调试页面可以实现按键跳转页面,更改控件值等功能,也可以通过编写指令控制按钮按下弹起,这些指令后续就可以通过单片机来发送;调试出来的效果什么样,烧录到屏幕中就是什么样

点击上方工具栏的调试按钮,则进入调试页面,调试前最好编译一下,保证页面控件的属性和事件代码没有写错

STM32物联网项目-HMI串口屏

在模拟器返回数据框内可以看到按下“数码管”按钮后的键值信息,这是因为在按钮事件中勾选了发送键值才会有数据返回,不勾选则没有数据,填写page 1跳转指令,则在调试中按下按钮就会跳转到数码管页面,没写则只会返回键值数据,页面不会跳转

数据格式

每一次按钮的键值信息都是7个字节数据,首字节0x65是固定的,是协议头,说明从0x65起后面的6个字节数据都是有效数据;

第二个字节0x00表示的是页面id,每个页面创建时都有id,0x00表示页面0,如果是0x01则表示页面1,指示的是哪个页面的按钮控件被触发;

第三个字节0x01表示是控件1触发的事件,在“数码管”按钮属性中可以看到id号,0x01就表示id为1的按钮触发了事件

STM32物联网项目-HMI串口屏

CubeMX配置

GPIO

分别配置数码管、按键、LED灯、步进电机引脚

STM32物联网项目-HMI串口屏

因为使用DMA来搬运屏幕发来的串口数据,所以要配置DMA,模式选择普通模式,内存选择地址增加

STM32物联网项目-HMI串口屏

NIVC

嵌套中断向量中,开启触摸按键的外部中断,DMA只是搬运数据,不需要通知CPU,所以不需要开启中断,串口需要开启中断,会用到空闲中断

STM32物联网项目-HMI串口屏

HMI.c

单片机发送给屏幕的数据要以0xFF 0xFF 0xFF作为结束符,所以HMI_SendString函数通过串口发送数据后再调用HMI_SendEndData函数发送结束符

HMI_Protocol函数会在HAL_UART_IdleCallback(&huart1)中调用,说明串口接收完一组数据,进入空闲中断后,则调用HMI_Protocol来处理数据

因为一组数据是以0x65开始的,所以要找出0x65,往后的就是正确的数据

处理数据就是根据屏幕的上位机软件调试页面的键值信息来判断哪个按钮被按下了,按下了就执行相应的操作

屏幕按钮与实战板的触摸按钮实时同步

不但屏幕上的按钮可以控制数码管和电机,板子上的触摸按键也能控制数码管和电机,同时,在触摸按键按下后屏幕的按钮也会显示被按下,这就需要用到一个标志位Page_Step_Motor_KEY_Flag,标志位默认为FALSE

因为触摸按键之前就实现了电机控制功能,所以屏幕按钮按下就调用触摸按键的外部中断函数即可,所以要加标志位判断是屏幕按钮按下的还是板子上的触摸按键按下的

如果是屏幕按键按下,则标志位置为TRUE,再调用外部中断回调函数控制电机,控制完后再将标志位清零,为下次按钮准备

如果是触摸按键按下的,则执行控制电机函数,再判断该标志位是否为FALSE,如果是,则说屏幕按钮没按下,需要将按下按钮的指令发送到屏幕,同时控制屏幕按钮按下,如果标志位为TRUE,则说明屏幕按下了按钮,则不需要将控制指令发送到屏幕

HMI_Protocol()

HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

//如果按键2被按下  if(GPIO_Pin == KEY2_Pin)  {    LED.LED_Fun来源:ONE_Day|
                                                        

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年8月5日
下一篇 2022年8月5日

相关推荐