zoukankan      html  css  js  c++  java
  • STM32F412应用开发笔记之八:迪文串口屏显示驱动

    迪文的显示屏使用起来比较方便,其使用串口通讯,即可支持RS232,又可以支持TTL电平。在NUCLEO-F412ZG实验板上,USART2已经引到了CN9上,我们就利用USART2来实现与迪文串口屏的通讯试验。USART2硬件接口如下图红框所示:

    我们在STM32CubeMX中配置USART2,打开“USART2 Configuration”界面,打开“GPIO Settings”标签:

     

    配置完成后,我们生成项目源码,USART2的配置如下:

    /* USART2 init function */

    static void MX_USART2_UART_Init(void)

    {

      huart2.Instance = USART2;

      huart2.Init.BaudRate = 115200;

      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();

      }

    }

    在上述配置函数中,调用了HAL_UART_Init函数来初始化USART2,同时调用HAL_UART_MspInit函数来初始化硬件配置,HAL_UART_MspInit函数需要我们编写供系统回调。

    接下来我们编写向屏写数据的源码,我们向屏写氧气百分比、氢气百分比、甲烷百分比、乙炔百分比、乙烯百分比和丙烷百分比等数据。

    //向屏写数据,用于数据显示

    void SetDataToLCD(void)

    {

      uint16_t length=SetVarDataLength;

      uint8_t txData[SetVarDataLength];

      uint16_t startAddress=0x0000;

      //对往下写的数据作格式化转换

      SendDataProcess(txData);

      //发送数据

      WriteDataToLCD(startAddress,txData,length);

    }

    其中SendDataProcess函数是对要写的数据进行格式化,因为屏幕只能接受符合其要求格式的数据。WriteDataToLCD是我们封装的向屏发送数据的函数:

    //写数据变量存储器

    void WriteDataToLCD(uint16_t startAddress,uint8_t txData[],uint16_t length)

    {

      /*命令的长度由帧头(2个字节)+数据长度(1个字节)+指令(1个字节)+起始地址(2个字节)+数据(长度为length)*/

      uint16_t cmd_Length=length+6;

      uint8_t cmd_VAR_Write[WriteDataCommandLength];

      cmd_VAR_Write[0]=0x5A;

      cmd_VAR_Write[1]=0xA5;

      cmd_VAR_Write[2]=(uint8_t)(length+3);

      cmd_VAR_Write[3]= FC_VAR_Write;

      cmd_VAR_Write[4]=(uint8_t)(startAddress>>8);//起始地址

      cmd_VAR_Write[5]=(uint8_t)startAddress;//起始地址

      for(int dataIndex=0;dataIndex<length;dataIndex++)

      {

        cmd_VAR_Write[dataIndex+6]=txData[dataIndex];

      }

      SendData(cmd_VAR_Write,cmd_Length);

    }

    编写完成后我们运行调试:

     

    调试无误后,我们在IO终端中查看数据显示结果,证明运行数据是没有问题的。

     

    接下来我们在先视频上查看数据,与在IO终端中一致,就是说屏显示的数据就是MCU发送给它的数据:

     

    再来看看对传感器做一下扰动时(用配气仪和小型气泵向传感器管道送不同的气)数据的变化,传感器检测对象变化是屏幕显示也变化。

     

    再来改变一下气体成分和气泵的转速看看数据的变化:

     

    经过以上实验,NUCLEO-F412ZG通过串口与迪文串口屏通讯完全可行。

  • 相关阅读:
    iOS强引用和弱引用
    HTTP和Socket的区别
    iOS日期加减
    iOS判断日期A是否在日期B到日期C之间
    分布式锁与实现(一)——基于Redis实现 【比较靠谱】
    Redisson实现分布式锁
    Redisson分布式锁实现
    从redis中取值如果不存在设置值,使用Redisson分布式锁【我】以及不使用锁的方式
    redisson整合spring
    如何优雅地用Redis实现分布式锁?
  • 原文地址:https://www.cnblogs.com/foxclever/p/6287450.html
Copyright © 2011-2022 走看看