当前位置: 代码网 > 科技>人工智能 > 【STM32CubeMX+HAL库】hmi串口屏显示波形

【STM32CubeMX+HAL库】hmi串口屏显示波形

2024年08月02日 人工智能 我要评论
这里我们选择使能串口1,可以看到设置完成后,系统会选择固定的引脚,当引脚被占用时,则无法使能串口1,因此st公司提供了多个串口通信通道(不同芯片数目不同)。usart hmi是淘晶驰开发的一款基于串口通信并采用指令集控制的可触摸屏幕,集成了多种控件,如按钮控件,滑块控件等,大大减轻了开发的难度。基于串口通信的特殊性,对于需要传输的整形数据,我们只能将其转化为字符串形势,否则指令无法被识别。基本原理:单片机发送指令给串口屏,控制串口屏的显示。单片机烧录,运行,可以看到串口屏显示的正弦波形。

usart hmi是淘晶驰开发的一款基于串口通信并采用指令集控制的可触摸屏幕,集成了多种控件,如按钮控件,滑块控件等,大大减轻了开发的难度。

          曲线控件学习入口

下面我们来讲解一下cubemx的配置以及输出正弦波代码的编写(三角波、方波同理)

一、cubemx配置

1、设置时钟源(外部高速晶振)

2、 配置烧录口

 

3、 串口配置

这里我们选择使能串口1,可以看到设置完成后,系统会选择固定的引脚,当引脚被占用时,则无法使能串口1,因此st公司提供了多个串口通信通道(不同芯片数目不同)。

usart.c文件中可查看串口的具体配置 

4、时钟树配置

前期基本拉满即可,博主用的是stmf4ccu6,不同芯片主频不同。

4、文件配置

注意ide的选择,我们使用的是keil5。

注:文件路径名不可包含中文 

 二、keil配置+算法

 1、根据所用烧录器进行具体的烧录接口配置

 我使用的是创芯工坊的一款dap-link,所以debugger选择cmsis-dap

 

 2、重要函数的配置与使用

1)重写printf函数,便于打印内容

魔术棒勾选“use microlib”,否则printf函数无法正常使用

 

 接着重写fputc与fgetc函数

/* user code begin 4 */
int fputc(int ch, file *f)
{
  hal_uart_transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}
int fgetc(file *f)
{
  uint8_t ch = 0;
  hal_uart_receive(&huart1, &ch, 1, 0xffff);
  return ch;
}
/* user code end 4 */

2)代码部分

基本原理:单片机发送指令给串口屏,控制串口屏的显示

串口屏曲线控件的控制需要用到这一指令,具体详见:http://wiki.tjc1688.com/doku.php?id=6.指令集:1.基本指令集#add

基于串口通信的特殊性,对于需要传输的整形数据,我们只能将其转化为字符串形势,否则指令无法被识别。

这里提供一个将整形变量转化为字符型的函数,大家直接使用即可

void itoa(int num,char str[] )
{
	int sign = num,i = 0,j = 0;
	char temp[11];
	if(sign<0)
	{
		num = -num;
	}
	do
	{
		temp[i] = num%10+'0';       
		num/=10;
		i++;
	}while(num>0);
	if(sign<0)
	{
		temp[i++] = '-';
	}
	temp[i] = '\0';
	i--;
	while(i>=0)
	{
	str[j] = temp[i];
	j++;
	i--;
	} 
	str[j] = '\0';
}

 接着我封装了一个传输数据的函数,仅供参考

void send_data(int a,int ch)
{
	char str[10];           //定义一个存放字符串的数组
	itoa(a,str);            //内嵌一个整形转字符的函数
	printf("add 1,%d,",ch);  
	printf("%s",str);        //字符串形势传输指令
	printf("\xff\xff\xff");  //结束符,告诉串口屏一次指令传输完毕
	hal_delay(10);           //必要的延时函数
}

定义变量,不要忘了声明上文介绍的函数

/* private define ------------------------------------------------------------*/
/* user code begin pd */
void send_data(int a,int ch);
void itoa(int num,char str[] );
int x,y;
float k;
/* user code end pd */

主循环函数:

 while (1)
  {
    /* user code end while */

    /* user code begin 3 */
		for(x=0;x<=999999;x++)
		{
			k=sin(0.05*x);
			y=40*k+100;
	    send_data(y,0);         //向串口屏曲线控件通道0发送数据
		}
		hal_delay(50);
  }

单片机烧录,运行,可以看到串口屏显示的正弦波形

 (不要在意屏幕下方的数据,作者瞎写的t-t)

后续也可加入串口中断,按键中断等进行尝试,这里就不再赘述

如有错误,请即使评论指正。不懂的也可评论区留言。

that's all for today's sharing.thanks for your perusal.

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com