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通过串口与迪文串口屏通讯完全可行。

 

转载于:https://www.cnblogs.com/foxclever/p/6287450.html

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是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函数中进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值