HAL库_STM32与陶晶驰T1系列串口屏通讯

一、实验目的

       利用陶晶驰串口屏设计软件、Kei以及STM32CubeMX软件结合硬件,完成串口屏与单片机之间的简单通信。

二、硬件连接

32单片机与串口屏连接

串口屏与电源板连接

三、使用USART HMI软件完成串口屏界面设计

3.1创建工程

1.点击新建

2. 选择保存工程的位置,并设置文件名,点击保存

3. 选择串口屏型号,在串口屏的背面可以看到屏幕的型号或者在购买订单中查找,这里选用的设备为T1系列TJC3224T124_011

4. 点击左侧的显示选项,选择一个显示方向,并点击 OK,完成工程的创建

3.2建立一个主页

3.2.1修改页面名称

     这里改为main,建议使用英文名称,不建议使用中文或其他非 ascii 字符的文字。

3.2.2新建字库和导入字库

2.1点击工具-字库制作

2.2设置如下

2.3点击生成字库并保存,选择加入刚刚生成的字库

3.2.3加入按钮控件

修改按钮控件显示的文字

front值对应创建的字库,txt值是控件显示的文字,bco和pco可以分别修改背景和文字的颜色

3.3建立功能实现页面

3.3.1修改页面名称

3.3.2加入控件并编辑

t_是文本控件,b_是按钮控件,n_是数字控件

3.4编写代码

完成功能:

1.按下main界面中的b0按钮跳转到界面show_trans;

    点击mian中的b0按钮,编写按钮控件的按下或弹起事件

2.按下show_trans界面的b1按钮则n1显示的数值加5,按下show_trans界面的b2按钮则n1显示的数值减5;

    分别点击show_trans中的b1和b2按钮,编写按钮控件的按下或弹起事件:

3.按下show_trans界面的其他部分跳转到main界面;

    点击show_trans中空白界面

4.按下show_trans界面的b0按钮向单片机发送数据;

淘晶驰没有定义固定的串口屏发送给单片机的数据格式,需要自己定义格式。

常见的通讯协议的格式如下:

帧头 + 帧长度 + 帧内容 + 帧校验 + 帧尾

我们可以根据需要定义一个通讯协议的结构如下:

帧头  + 帧内容 +帧尾

设定帧头为0a,帧尾为ff,帧内容即发送数据设为两个字节。

    点击show_trans界面的b0按钮,编写按钮控件的按下或弹起事件:

编译后进行调试,检验功能有没有实现。

四、Keil编写32工程代码

  4.1初始配置

    使用stm32cubeMX完成以下配置,包括系统时钟,下载和串口配置。

    注意串口要使能中断并设置波特率为9600;

4.2编写程序

4.2.1修改设置

点击魔法棒,Target-勾选Use Microlib,DEBUG-Setting-Flash Download-勾选Rest and run;

4.2.3在usart.c中分别重定向printf和get char,scanf函数

#include "stdio.h"
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);//HAL库串口发送函数
  return ch;
}

int fgetc(FILE *f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1, &ch, 1, 0xffff);//HAL库串口接收函数
  return ch;
}

4.2.4实现串口接收并发送数据

1.在main中第一次调用接收中断函数

/* USER CODE BEGIN 2 */
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
/* USER CODE END 2 */

2.编写HAL_UART_RxCpltCallback中断回调函数,处理接收的数据


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	rx_data[rx_cnt] = rx_byte;     //接收数据转存入数组
	rx_cnt=rx_cnt+1;

	if (rx_data[rx_cnt-1] == 0xFF  && rx_data[rx_cnt-4] == 0x0a)  //判断接收数据的帧头帧尾
	{
		HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
        printf("show_trans.n1.val=%d\xff\xff\xff",rx_data[rx_cnt-3]+rx_data[rx_cnt-2]*256);
		//将收到的数据发送回串口屏
		rx_cnt =0;
		memset(rx_data,0x00,sizeof(rx_data));    //清空数组
	}
	 HAL_UART_Receive_IT(&huart1, (uint8_t *)&rx_byte, 1);//再开启中断
}

串口屏发送的数据格式为0a  _ _  _ _  ff,据此来编写判断条件

if (rx_data[rx_cnt-1] == 0xFF  && rx_data[rx_cnt-4] == 0x0a)  //判断接收数据的帧头帧尾

注意:0a所在字节后第一个字节为低位,第二个字节为高位。

向串口屏发送数据

 printf("show_trans.n1.val=%d\xff\xff\xff",rx_data[rx_cnt-3]+rx_data[rx_cnt-2]*256);
		//将收到的数据发送回串口屏

五、下载并完成调试

  • 5
    点赞
  • 156
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是HAL库STM32与迪文屏串口通讯的基本例程: ```c #include "stm32f4xx_hal.h" #include <string.h> UART_HandleTypeDef huart2; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART2_UART_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART2_UART_Init(); while (1) { char data[] = "Hello, Display!"; HAL_UART_Transmit(&huart2, (uint8_t *)data, strlen(data), HAL_MAX_DELAY); HAL_Delay(1000); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 7; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000); HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } static void MX_USART2_UART_Init(void) { huart2.Instance = USART2; huart2.Init.BaudRate = 9600; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` 上述代码实现了通过UART2与迪文屏进行通讯。需要注意的是,迪文屏需要使用9600波特率进行通讯。在主循环中,我们不断向迪文屏发送“Hello, Display!”的数据,并且每隔1秒钟发送一次。如果需要接收来自迪文屏的数据,可以使用HAL_UART_Receive函数。 需要注意的是,如果使用的是不同型号的STM32芯片,需要根据芯片的具体型号进行修改。此外,如果使用的是不同的UART口,需要在MX_USART2_UART_Init函数中进行相应的修改。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值