STONE 자동차 대시보드용 LCD 화면

배송 시 요청 사항: 차량용 대시보드용 10.1인치 LCD 화면과 STONE RTL8762CJF MCU와 결합된 LCD 화면은 온보드 디스플레이 대시보드를 개발하고 만드는 데 사용됩니다.

소개

자동차를 일상적으로 사용하는 과정에서 우리는 항상 자동차의 상태를 이해하고 자동차의 중요한 부품이 손상되는 것을 방지하고 잠재적인 위험을 제거해야 합니다. 종종 대시보드에 표시되는 정보는 차량의 상태를 알 수 있는 방법입니다.

이번에는 10.1인치 TFT LCD 화면을 사용하여 온보드 디스플레이 대시보드를 만들 것입니다. 우리 모두가 알다시피, STONE 지능형 TFT LCD 모듈 디스플레이는 너무 많은 지루한 지침 없이 편리하고 빠릅니다. 이것은 대부분의 학습 애호가에게 적합할 뿐만 아니라 실제 프로젝트에서 개발 속도를 높이고 개발 시간을 절약하며 시장을 빠르게 점유할 수 있습니다.

IIC 또는 직렬 포트를 통해 TFT LCD 화면에 데이터를 업로드하는 목적을 달성하기 위해 일반적으로 사용되는 RTL8762CJF SCM을 사용합니다. 이번에는 운전자에게 더 나은 시뮬레이션 경험을 제공하기 위해 음성 방송 기능도 사용합니다.

LCD 화면 자동차 대시보드 프로젝트 기능

여기에서 우리는 중고차 디스플레이 프로젝트, 주로 터치 조절, 마이크로 컨트롤러 업로드 지침 방식, 버튼을 사용한 시뮬레이션, MCU 버튼 누름, 직렬 포트 명령을 통해 STVC101WT – 01 직렬 인터페이스 화면 지침을 통해 데이터를 업로드해야 합니다. 화면은 자동으로 데이터를 분석하여 LCD 화면에 표시합니다. 동시에, MCU를 제어하기 위해 직렬 포트 명령을 달성하기 위해 화면에 버튼 기능도 있습니다.

요약하면 XNUMX가지 기능

  1. 직렬 포트 화면은 비트맵 표시 기능을 실현합니다.
  2. 다이얼 회전 기능을 달성하기 위해;
  3. 발행된 터치 명령을 달성하기 위해;
  4. 음성 방송을 달성하기 위해;
  5. 데이터 명령 업로드를 달성하기 위해.

기능이 결정되고 모듈 선택:

  1. 터치 스크린의 모델;
  2. 어떤 종류의 MCU 모듈을 사용할 것인지;
  3. 음성 방송 모듈.

하드웨어 소개 및 원리

경적

때문에 STONE 직렬 포트 화면은 오디오 드라이버와 함께 제공되며 해당 인터페이스를 예약하여 일반적으로 혼으로 알려진 가장 일반적인 자석 확성기를 사용할 수 있습니다. 확성기는 전기 신호를 소리 신호로 변환하는 일종의 변환기입니다. 확성기는 음향기기에서 가장 약한 부품 중 하나이자 음향효과를 위한 가장 중요한 부품 중 하나이다. 스피커의 종류는 많고 가격도 천차만별입니다. 오디오 전기 에너지는 전자기, 압전 또는 정전기 효과를 통해 종이 대야 또는 진동판을 진동시키고 주변 공기와 공명(공명)시켜 소리를 생성합니다.

구매 링크: http://dwz.date/afdC

STVC101WT-01 직렬 LCD 화면 설명

  • 10.1인치 1024×600 산업용 TFT 패널 및 4와이어 저항막 방식 터치 스크린;
  • 밝기 300cd/m2;
  • LED 백라이트;
  • RGB 색상 65k;
  • 가시 영역은 222.7mm * 125.3mm입니다.
  • 시야각 70/70/50/60;
  • 노동 수명 20,000시간.
  • 32비트 cortex-m4 200Hz CPU;
  • CPLD EPM240 tft-lcd 컨트롤러;
  • 128MB(또는 1GB) 플래시 메모리;
  • USB 포트(U 디스크) 다운로드;
  • GUI 디자인을 위한 도구 상자 소프트웨어;
  • 간단하고 강력한 XNUMX진법 명령어.

기본 기능

  • 8m-128m 바이트 플래시 메모리 공간, SDWe 시리즈 128M 바이트, SDWa 시리즈 8M/16M 바이트;
  • 하드웨어 JPG 디코딩, 스토리지보다 효율적이고 빠른 디스플레이를 지원합니다.
  • U 디스크 오프라인 일괄 다운로드를 지원하고 일괄 다운로드의 효율성을 효과적으로 개선하고 운영자의 전문 품질 요구 사항을 줄입니다.
  • 256바이트 레지스터 공간;
  • 64K 워드(128K 바이트) 가변 메모리 공간, 8채널 커브 저장, 초고속(80ms) 가변 디스플레이
  • 응답 속도;
  • 페이지당 최대 128개의 디스플레이 변수를 지원합니다.
  • 통합 실시간 시계 RTC, 터치 부저 사운드 기능;
  • 지원 소프트웨어 90도, 180도, 270도 화면 회전, 적절한 시각적 각도 조정;
  • 백라이트 밝기 조정 지원, 자동 대기 화면 보호기 기능;
  • 외부 매트릭스 키보드 지원;
  • 오디오 및 비디오 재생 지원;
  • 업계 최고의 전자기 복사 지수로 ClassB를 쉽게 처리할 수 있습니다.
  • 파일 이름 명명 규칙은 플래시 블록 번호에 해당하지 않고 지루한 수동 할당 없이 간단합니다. 플래시 블록 기능;
  • 가상 직렬 화면 기능을 지원합니다.

STONE STVC101WT – 01 디스플레이 모듈은 MCU와의 직렬 포트 통신을 통해 이 프로젝트에서 사용해야 하며 메뉴 표시줄 옵션 버튼, 텍스트 상자, 배경 이미지 및 논리 페이지를 통해 좋은 UI 이미지를 디자인하려면 PC를 통해서만 필요합니다. 추가한 다음 구성 파일을 생성하고 디스플레이 화면에 다운로드하여 마지막으로 실행할 수 있습니다.

RTL8762C EVB 소개

8762C 평가 보드는 다음을 포함하여 고객이 개발한 하드웨어 환경을 제공합니다.

  1. 전력 변환 모듈;
  2. 26축 모션 센서;
  3. 4개의 LED와 6개의 버튼;
  4. 버튼 배터리 및 리튬 배터리 홀더;
  5. USB에서 UART로의 변환 칩, FT232RL.

보드 블록 및 인터페이스 배포 평가
평가 보드 블록에 대한 자세한 설명
평가 보드 블록 및 인터페이스 배포는 다음 그림을 참조하십시오.

자동차 대시보드용 LCD 화면 자동차 대시보드용 LCD 화면

열쇠

리셋 키와 5개의 독립 키 세트가 있으며,
다음 그림과 같이

자동차 대시보드용 LCD 화면

메인 칩 8762 c

  • 유연한 GPIO 설계
  • 하드웨어 키 스캔 및 디코더
  • 임베디드 IR 트랜시버
  • 실시간 카운터(RTC)
  • SPI 마스터/8개에서, 타이머 x 2, I2C x 8, PWM x 2, UART x XNUMX
  • 400ksps, 12비트, 8채널 AUXADC
  • 외부 오디오 코덱을 위한 I2S 인터페이스
  • LCD용 I8080 인터페이스
  • 내부 32K RCOSC는 BLE 링크를 유지합니다.
  • 5밴드 이퀄라이저가 내장된 PGA 및 오디오 ADC

STONE 도구 상자 개발 단계

일반적으로 세 단계만 있습니다.

  1. TOOL2019 상위 컴퓨터 소프트웨어 디자인 사용;
  2. MCU 및 화면 통신 개발;
  3. 오디오 파일 제작 및 가져오기.

설치 STONE 수단

TOOL은 웹사이트에서 다운로드할 수 있습니다. https://www.stoneitech.com, 뿐만 아니라 관련 USB 직렬 드라이버.

KEIL 설치

1、다운로드 링크: https://pan.baidu.com/s/1smropvXeXKXw413W_-rvtw
2, 압축 해제 후 다운로드

자동차 대시보드용 LCD 화면

압축을 푼 후 폴더를 엽니다.

자동차 대시보드용 LCD 화면

4、c51v900 파일을 더블 클릭합니다. exe를 실행하고 대화 상자에서 다음을 클릭합니다.

자동차 대시보드용 LCD 화면

STONE TOOL 2019 인터페이스 디자인

설치된 TOOL 2019를 사용하여 왼쪽 상단 모서리에 있는 새 프로젝트를 클릭한 다음 확인을 클릭합니다.

자동차 대시보드용 LCD 화면

기본 프로젝트는 기본적으로 파란색 배경으로 생성됩니다. 선택하고 마우스 오른쪽 버튼을 클릭한 다음 제거를 선택하여 배경을 제거합니다. 다음으로 그림 파일을 마우스 오른쪽 버튼으로 클릭하고 추가를 클릭하여 다음과 같이 자신의 그림 배경을 추가합니다.

자동차 대시보드용 LCD 화면

다음과 같습니다 :

자동차 대시보드용 LCD 화면

해당하는 배경 이미지를 선택합니다.

같은 방식으로 프로젝트에 비트맵 파일과 오디오 파일을 추가합니다.

자동차 대시보드용 LCD 화면

그런 다음 필요한 컨트롤을 추가합니다. 여기에는 주로 버튼 컨트롤, 숫자 더하기 및 빼기 컨트롤, 데이터 변수 컨트롤이 있습니다.

자동차 대시보드용 LCD 화면

그런 다음 각 컨트롤의 변수 주소를 구성합니다. 여기에 다음 구성이 있습니다.

  1. 에어컨 버튼 주소는 0x000C로 구성됩니다.
  2. 상향등 버튼 주소는 0x000D로 구성됩니다.
  3. 단축 다이얼 주소는 0x001B로 구성됩니다.
  4. 전기 아이콘 주소는 0x0018로 구성됩니다.
  5. PM2.5 주소는 0x001C로 구성됩니다.

버튼이 구성되면 다음 그림이 한 번 표시됩니다.

자동차 대시보드용 LCD 화면

  1. 구성 버튼 누름 효과;
  2. 값을 쓰는 데 사용되는 변수 주소의 제어를 구성합니다.
  3. 구성 플러스 또는 마이너스 작업;
  4. 값 범위를 구성합니다.

디지털 텍스트 상자를 구성할 때 다음 그림이 차례로 표시됩니다.

자동차 대시보드용 LCD 화면

제어 변수 주소를 설정합니다.
자릿수를 설정하십시오.
숫자의 크기를 설정합니다.
정렬 번호를 설정합니다.

속도계를 구성할 때 다음 그림이 차례로 표시됩니다.

자동차 대시보드용 LCD 화면

선택한 라이브러리 파일;
갤러리 파일에서 지정할 파일.
포인터 아이콘 주위의 중심 좌표를 설정합니다.
포인터의 회전 범위를 설정합니다.
포인터의 회전 각도를 설정합니다.
마지막으로 빌드 구성 도구를 클릭합니다.
참고 :
제어 버튼은 가변 주소를 통해 해당 비트맵과 연결되므로 적절한 제어를 위해서는 일관성이 필요합니다.
따라서 직렬 포트 명령은 다음과 같습니다.
Battery: 0xA5, 0x5A, 0x05, 0x82, 0x00, 0x18, 0x00, 0x00
Speed: 0xA5, 0x5A, 0x05, 0x82, 0x00, 0x1B, 0x00, 0x00
PM2.5: 0xA5, 0x5A, 0x05, 0x82, 0x00, 0x1C, 0x00, 0x00

RTL8762C의 개발

다음 그림과 같이 KEIL을 열고 프로젝트 파일을 가져옵니다.

자동차 대시보드용 LCD 화면

처음 사용하는 것이므로 FLASH 알고리즘을 적절히 조정해야 합니다.
옵션 버튼을 클릭하여 플래시 다운로드 구성 상자로 이동하고 알고리즘을 다음 그림과 같이 변경합니다.

자동차 대시보드용 LCD 화면

여기에서 버튼 컨트롤을 사용하므로 코드에서 다음과 같이 변경해야 합니다.:

/**
* @file     main.c
* @brief    uart demo polling tx and rx.
* @details
* @author   wangzex
* @date     2018-06-28
* @version  v0.1
*********************************************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include
#include "rtl876x_nvic.h"
#include "rtl876x_pinmux.h"
#include "rtl876x_rcc.h"
#include "rtl876x_uart.h"
#include "trace.h"
#include "rtl876x_gpio.h"
#include "os_timer.h"
#include "os_sched.h"
/* Defines ------------------------------------------------------------------*/
#define UART_TX_PIN                P0_0//P4_0
#define UART_RX_PIN                P0_1//P4_1
/* Defines ------------------------------------------------------------------*/
#define GPIO_INPUT_PIN_BAT_UP           P4_0// KEY0
#define GPIO_BAT_UP_INPUT               GPIO_GetPin(GPIO_INPUT_PIN_BAT_UP)
#define GPIO_INPUT_PIN_BAT_DN           P4_1// KEY1
#define GPIO_BAT_DN_INPUT               GPIO_GetPin(GPIO_INPUT_PIN_BAT_DN)
#define GPIO_INPUT_PIN_SPEED_UP         P2_4//KEY2
#define GPIO_SPEED_UP_INPUT             GPIO_GetPin(GPIO_INPUT_PIN_SPEED_UP)
#define GPIO_INPUT_PIN_SPEED_DN         P2_3// KEY3
#define GPIO_SPEED_DN_INPUT             GPIO_GetPin(GPIO_INPUT_PIN_SPEED_DN)
#define GPIO_INPUT_PIN_SWITCH           P0_5//KEY4
#define GPIO_SWITCH_INPUT               GPIO_GetPin(GPIO_INPUT_PIN_SWITCH)
#define KEYSCAN_SW_INTERVAL             (165)/* 200ms */
#define KEYSCAN_SW_RELEASE_TIMEOUT      (10)/* 10ms */
uint8_t data_buf_bat[]     = {0xA5, 0x5A, 0x05, 0x82, 0x00, 0x18, 0x00, 0x00};
uint8_t data_buf_speed[]   = {0xA5, 0x5A, 0x05, 0x82, 0x00, 0x1B, 0x00, 0x00};
uint8_t data_buf_pm25[]    = {0xA5, 0x5A, 0x05, 0x82, 0x00, 0x1C, 0x00, 0x00};//the last byte is data
void *KeyScan_Timer_Handle = NULL;
void timer_keyscan_callback(void *p_xTimer)
{
uint8_t gpio_input_data_level = 0;
gpio_input_data_level = GPIO_ReadInputDataBit(GPIO_BAT_UP_INPUT);//KEY0
DBG_DIRECT("GPIO_BAT_UP_INPUT = %d\n", gpio_input_data_level);
if(!gpio_input_data_level)
{
gpio_input_data_level = GPIO_ReadInputDataBit(GPIO_SWITCH_INPUT);//KEY0
DBG_DIRECT("GPIO_BAT_UP_INPUT = %d\n", gpio_input_data_level);
if(!gpio_input_data_level)
{
data_buf_pm25[7] ++;
UART_SendData(UART, data_buf_pm25, 8);
}
else
{
data_buf_bat[7] ++;
UART_SendData(UART, data_buf_bat, 8);
}
}
gpio_input_data_level = GPIO_ReadInputDataBit(GPIO_BAT_DN_INPUT);//KEY0
DBG_DIRECT("GPIO_BAT_UP_INPUT = %d\n", gpio_input_data_level);
if(!gpio_input_data_level)
{
gpio_input_data_level = GPIO_ReadInputDataBit(GPIO_SWITCH_INPUT);//KEY0
DBG_DIRECT("GPIO_BAT_UP_INPUT = %d\n", gpio_input_data_level);
if(!gpio_input_data_level)
{
data_buf_pm25[7] --;
UART_SendData(UART, data_buf_pm25, 8);
}
else
{
data_buf_bat[7] --;
UART_SendData(UART, data_buf_bat, 8);
}
}
gpio_input_data_level = GPIO_ReadInputDataBit(GPIO_SPEED_UP_INPUT);//KEY0
DBG_DIRECT("GPIO_BAT_UP_INPUT = %d\n", gpio_input_data_level);
if(!gpio_input_data_level)
{
data_buf_speed[7] ++;
UART_SendData(UART, data_buf_speed, 8);
}
gpio_input_data_level = GPIO_ReadInputDataBit(GPIO_SPEED_DN_INPUT);//KEY0
DBG_DIRECT("GPIO_BAT_UP_INPUT = %d\n", gpio_input_data_level);
if(!gpio_input_data_level)
{
data_buf_speed[7] --;
UART_SendData(UART, data_buf_speed, 8);
}
//    gpio_input_data_level = GPIO_ReadInputDataBit(GPIO_PM25_INPUT);//KEY0
//    DBG_DIRECT("GPIO_BAT_UP_INPUT = %d\n", gpio_input_data_level);
//    if(!gpio_input_data_level)
//    {
//        data_buf_pm25[7] --;
//        UART_SendData(UART, data_buf_pm25, 8);
//    }
os_timer_restart(&KeyScan_Timer_Handle, KEYSCAN_SW_INTERVAL);
}
void timer_keyscan_init(void)
{
DBG_DIRECT("[io_keyscan] timer_keyscan_init: keyscan timer init");
if (false == os_timer_create(&KeyScan_Timer_Handle, "keyscan_timer",  1, \
KEYSCAN_SW_INTERVAL, false, timer_keyscan_callback))
{
DBG_DIRECT("[io_keyscan] timer_keyscan_init: timer creat failed!");
}
os_timer_start(&KeyScan_Timer_Handle);
}
/** @brief  UART_BaudRate_Table
*         div ovsr ovsr_adj :These three parameters set the baud rate calibration parameters of UART.
baudrate    |   div     |   ovsr    |   ovsr_adj
--------------------------------------------------------
1200Hz      |   2589    |   7       |   0x7F7
9600Hz      |   271     |   10      |   0x24A
14400Hz     |   271     |   5       |   0x222
19200Hz     |   165     |   7       |   0x5AD
28800Hz     |   110     |   7       |   0x5AD
38400Hz     |   85      |   7       |   0x222
57600Hz     |   55      |   7       |   0x5AD
76800Hz     |   35      |   9       |   0x7EF
115200Hz    |   20      |   12      |   0x252
128000Hz    |   25      |   7       |   0x555
153600Hz    |   15      |   12      |   0x252
230400Hz    |   10      |   12      |   0x252
460800Hz    |   5       |   12      |   0x252
500000Hz    |   8       |   5       |   0
921600Hz    |   4       |   5       |   0x3F7
1000000Hz   |   4       |   5       |   0
1382400Hz   |   2       |   9       |   0x2AA
1444400Hz   |   2       |   8       |   0x5F7
1500000Hz   |   2       |   8       |   0x492
1843200Hz   |   2       |   5       |   0x3F7
2000000Hz   |   2       |   5       |   0
2100000Hz   |   1       |   14      |   0x400
2764800Hz   |   1       |   9       |   0x2AA
3000000Hz   |   1       |   8       |   0x492
3250000Hz   |   1       |   7       |   0x112
3692300Hz   |   1       |   5       |   0x5F7
3750000Hz   |   1       |   5       |   0x36D
4000000Hz   |   1       |   5       |   0
6000000Hz   |   1       |   1       |   0x36D
-----------------------------------------------------
*/ /* End of UART_BaudRate_Table */
/* Globals ------------------------------------------------------------------*/
typedef struct
{
uint16_t div;
uint16_t ovsr;
uint16_t ovsr_adj;
} UART_BaudRate_TypeDef;
const UART_BaudRate_TypeDef BaudRate_Table[10] =
{
{271, 10, 0x24A}, // BAUD_RATE_9600
{165, 7,  0x5AD}, // BAUD_RATE_19200
{20,  12, 0x252}, // BAUD_RATE_115200
{10,  12, 0x252}, // BAUD_RATE_230400
{5,   12, 0x252}, // BAUD_RATE_460800
{4,   5,  0x3F7}, // BAUD_RATE_921600
{2,   5,  0},     // BAUD_RATE_2000000
{1,   8,  0x492}, // BAUD_RATE_3000000
{1,   5,  0},     // BAUD_RATE_4000000
{1,   1,  0x36D}, // BAUD_RATE_6000000
};
void board_gpio_init(void)
{
Pad_Config(GPIO_INPUT_PIN_BAT_UP, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE,
PAD_OUT_HIGH);
Pinmux_Config(GPIO_INPUT_PIN_BAT_UP, DWGPIO);
Pad_Config(GPIO_INPUT_PIN_BAT_DN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE,
PAD_OUT_HIGH);
Pinmux_Config(GPIO_INPUT_PIN_BAT_DN, DWGPIO);
Pad_Config(GPIO_INPUT_PIN_SPEED_UP, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE,
PAD_OUT_HIGH);
Pinmux_Config(GPIO_INPUT_PIN_SPEED_UP, DWGPIO);
Pad_Config(GPIO_INPUT_PIN_SPEED_DN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE,
PAD_OUT_HIGH);
Pinmux_Config(GPIO_INPUT_PIN_SPEED_DN, DWGPIO);
Pad_Config(GPIO_INPUT_PIN_SWITCH, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE,
PAD_OUT_HIGH);
Pinmux_Config(GPIO_INPUT_PIN_SWITCH, DWGPIO);
}
uint8_t String_Buf[100];
/**
* @brief  Initialization of pinmux settings and pad settings.
* @param  No parameter.
* @return void
*/
void board_uart_init(void)
{
Pad_Config(UART_TX_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_HIGH);
Pad_Config(UART_RX_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_HIGH);
Pinmux_Config(UART_TX_PIN, UART0_TX);
Pinmux_Config(UART_RX_PIN, UART0_RX);
}
/**
* @brief  Initialize GPIO peripheral.
* @param  No parameter.
* @return void
*/
void driver_gpio_init(void)
{
/* Initialize GPIO peripheral */
RCC_PeriphClockCmd(APBPeriph_GPIO, APBPeriph_GPIO_CLOCK, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin    = GPIO_INPUT_PIN_BAT_UP;
GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_IN;
GPIO_InitStruct.GPIO_ITCmd  = DISABLE;
GPIO_Init(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin    = GPIO_INPUT_PIN_BAT_DN;
GPIO_Init(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin    = GPIO_INPUT_PIN_SPEED_UP;
GPIO_Init(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin    = GPIO_INPUT_PIN_SPEED_DN;
GPIO_Init(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin    = GPIO_INPUT_PIN_SWITCH;
GPIO_Init(&GPIO_InitStruct);
}
/**
* @brief  Demo code of operation about gpio.
* @param  No parameter.
* @return void
*/
void gpio_demo(void)
{
/* Configure pad and pinmux firstly! */
board_gpio_init();
/* Initialize gpio peripheral */
driver_gpio_init();
}
/**
* @brief  Initialize uart peripheral.
* @param  No parameter.
* @return void
*/
void driver_uart_init(void)
{
UART_DeInit(UART);
RCC_PeriphClockCmd(APBPeriph_UART0, APBPeriph_UART0_CLOCK, ENABLE);
/* uart init */
UART_InitTypeDef UART_InitStruct;
UART_StructInit(&UART_InitStruct);
/* Config uart baudrate */
UART_InitStruct.div            = BaudRate_Table[BAUD_RATE_115200].div;
UART_InitStruct.ovsr           = BaudRate_Table[BAUD_RATE_115200].ovsr;
UART_InitStruct.ovsr_adj       = BaudRate_Table[BAUD_RATE_115200].ovsr_adj;
UART_InitStruct.parity         = UART_PARITY_NO_PARTY;
UART_InitStruct.stopBits       = UART_STOP_BITS_1;
UART_InitStruct.wordLen        = UART_WROD_LENGTH_8BIT;
UART_InitStruct.rxTriggerLevel = 16;                      //1~29
UART_InitStruct.idle_time      = UART_RX_IDLE_2BYTE;      //idle interrupt wait time
UART_Init(UART, &UART_InitStruct);
}
/**
* @brief  UARt send data continuous.
* @param  No parameter.
* @return void
*/
void uart_senddata_continuous(UART_TypeDef *UARTx, const uint8_t *pSend_Buf, uint16_t vCount)
{
uint8_t count;
while (vCount / UART_TX_FIFO_SIZE > 0)
{
while (UART_GetFlagState(UARTx, UART_FLAG_THR_EMPTY) == 0);
for (count = UART_TX_FIFO_SIZE; count > 0; count--)
{
UARTx->RB_THR = *pSend_Buf++;
}
vCount -= UART_TX_FIFO_SIZE;
}
while (UART_GetFlagState(UARTx, UART_FLAG_THR_EMPTY) == 0);
while (vCount--)
{
UARTx->RB_THR = *pSend_Buf++;
}
}
/**
* @brief  Demo code of uart.
* @param  No parameter.
* @return void
*/
void uart_demo(void)
{
uint16_t demo_str_len = 0;
//    uint8_t rx_byte = 0;
board_uart_init();
driver_uart_init();
char *demo_str = "### Uart demo polling read uart data ###\r\n";
demo_str_len = strlen(demo_str);
memcpy(String_Buf, demo_str, demo_str_len);
/* Send demo tips */
uart_senddata_continuous(UART, String_Buf, demo_str_len);
/* Loop rx and tx */
//    while (1)
//    {
//        if (UART_GetFlagState(UART, UART_FLAG_RX_DATA_RDY) == SET)
//        {
//            rx_byte = UART_ReceiveByte(UART);
//            UART_SendByte(UART, rx_byte);
//        }
//    }
}
/**
* @brief    Entry of app code
* @return   int (To avoid compile warning)
*/
int main(void)
{
uart_demo();
gpio_demo();
timer_keyscan_init();
os_sched_start();
return 0;
}

마지막으로 MCU를 자동차 대시보드용 직렬 포트 LCD 화면 LCD에 연결하기만 하면 됩니다.
스피커를 연결하여 시연합니다.

자동차 대시보드용 LCD 화면

위쪽으로 스크롤