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.