迪文的顯示屏使用起來比較方便,其使用串口通訊,即可支持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通過串口與迪文串口屏通訊完全可行。
