这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【转载】STM32与串口屏交互--from森

共1条 1/1 1 跳转至

【转载】STM32与串口屏交互--from森

工程师
2025-02-19 22:59:05     打赏

前言

最近大创和嵌入式比赛都使用到了串口屏,刚开始学习也没什么头绪,后来瞎搞搞就能用了,但是我设计的非常简单,还有很多需要优化的地方,后面我会将代码发出来。为什么我要用串口屏呢?串口屏综合了以上屏幕的特点,即尺寸大、管脚少,能够充分减少占用单片机的I/O资源,且支持触摸。串口屏可作为输出设备(显示)以及输入设备(按键),开发难度小,操作简单,软件要求低且拥有专门的上位机辅助开发,重点是:看着牛


一、前期准备

界面设计就不多做叙述,我直接写关于stm32与串口屏交互的部分


二.关于在上位机USART HMI里面的一些配置

1.首先是在program.s里面定义一个全局变量的标志位

1.png2.我这边使用的是双态按钮,只有0和1两个值,通过按下后的值向单片机发送一个值,这里是使用了prints函数直接通过串口来发送的

2.png

到这里串口屏上位机代码的部分就写完了,我写的很简单,也没个帧头帧尾的,大家可以加上。


三.stm32的代码部分

关于单片机的代码部分,我是用的是stm32f407zgt6的最小系统板,这里必须注意下,最小系统板和核心板要 避免使用串口1,因为下载程序的时候会占用(PA9 PA10)这两个引脚,所以这个问题困扰了我很久,后来突然想到这件事情,我换成串口2就正常了**


下面是代码展示


#include "tjc.h"

#include <stdarg.h>

#include <stdlib.h>

#include <stdio.h>

#include <stdarg.h>


///*

//* 描述: HAL库实现多串口使用printf输出

//* 参数: huart:对应的串口结构体

//* 返回: 无*/

void Uart_printf(UART_HandleTypeDef *huart,char *format, ...)

{

  char buf[512]; //定义临时数组,根据实际发送大小微调


  va_list args;

  va_start(args, format);

  uint16_t len = vsnprintf((char *)buf, sizeof(buf), (char *)format, args);

  va_end(args);

  HAL_UART_Transmit(huart,(u8 *)buf,len,1000);

}


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

#ifndef __TJC_H

#define __TJC_H


#include "stm32f4xx_hal.h"


#define u8 uint8_t

#define u16 uint16_t

#define u32 uint32_t

#define u64 uint64_t

typedef __IO uint32_t  vu32;

typedef __IO uint16_t vu16;

typedef __IO uint8_t  vu8;

extern void HAL_Delay_us(uint32_t nus);


void Uart_printf(UART_HandleTypeDef *huart,char *format, ...);


#endif

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

/* USER CODE BEGIN PV */

uint8_t cmd;

uint8_t flag=0;

/* USER CODE END PV */


/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

/* USER CODE BEGIN PFP */


/* USER CODE END PFP */


/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */

  

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

if(huart->Instance == USART2){

switch(cmd)

{

case 0x01:

flag=1;

break;

case 0x02:

flag=2;

break;

}

HAL_UART_Receive_IT(&huart2, &cmd, 1);

}

}

/* USER CODE END 0 */


/**

  * @brief  The application entry point.

  * @retval int

  */

int main(void)

{


  /* USER CODE BEGIN 1 */


  /* USER CODE END 1 */


  /* MCU Configuration--------------------------------------------------------*/


  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();


  /* USER CODE BEGIN Init */


  /* USER CODE END Init */


  /* Configure the system clock */

  SystemClock_Config();


  /* USER CODE BEGIN SysInit */


  /* USER CODE END SysInit */


  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_USART1_UART_Init();

  MX_TIM1_Init();

  MX_USART2_UART_Init();

  MX_ADC1_Init();

  MX_TIM3_Init();

  /* USER CODE BEGIN 2 */

  HAL_UART_Receive_IT(&huart2, &cmd, 1);

  

  DHT11_Strat(); //开始启用DHT11

  /* USER CODE END 2 */


  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {


  DHT11_Read_Data(&temperature , &humidity);   //读取dht11温湿度传感器

  MQ2_Read_Data(); //读取mq2烟雾传感器

  

  Uart_printf(&huart2,"page1.n0.val=%d\xff\xff\xff",temperature);//串口屏实时显示温度

  Uart_printf(&huart2,"page1.n1.val=%d\xff\xff\xff",humidity);//串口屏实时显示湿度   

  Uart_printf(&huart2,"page1.n2.val=%d\xff\xff\xff",(int)ppm);//串口屏实时显示烟雾浓度  

  

  if(flag==1) //串口接收中断接收到串口屏发来的数据,点亮小灯

  {

HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_RESET);

  }

  else if(flag==2) //串口接收中断接收到串口屏发来的数据,熄灭小灯

  {

HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET);

  }

 

  HAL_Delay(800);

  

    /* USER CODE END WHILE */


    /* USER CODE BEGIN 3 */

  }

  /* USER CODE END 3 */

}

来源: 整理文章为传播相关技术,网络版权归原作者所有,如有侵权,请联系删除。

                        





共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]