天天看點

STM32L476應用開發之四:觸摸屏驅動與資料互動

資料互動可以說是任何一台儀器都需要的功能。我們的便攜式氣體分析儀,需要人來操作和配置,是以觸摸屏就是我們必然的一個選擇。本次我們計劃采用3.5寸顯示屏,序列槽通訊。

1、硬體設計

前面我們實驗了串行通訊,這次來使用屏實作顯示。這次我們計劃使用的3.5寸觸摸屏采用RS232串行通訊接口,其接口排布如下:

STM32L476應用開發之四:觸摸屏驅動與資料互動
對于RS232接口我們采用了周立功RSM232子產品來做實驗,其推薦的連接配接方式如下圖:
STM32L476應用開發之四:觸摸屏驅動與資料互動
在實驗過程中我們不需要這些保護措施,根據以上的分析我們可以對序列槽通訊做如下設計。RS232接口原理圖如下:
STM32L476應用開發之四:觸摸屏驅動與資料互動

2、軟體設計

首先對序列槽部分做參數配置,波特率、資料位、停止位、奇偶校驗等按要求配置好。接下來編寫測試代碼。

static void LCD_UART_Configuration(void)
{
  huart1.Instance = USART1;

  huart1.Init.BaudRate = 115200;

  huart1.Init.WordLength = UART_WORDLENGTH_8B;

  huart1.Init.StopBits = UART_STOPBITS_1;

  huart1.Init.Parity = UART_PARITY_NONE;

  huart1.Init.Mode = UART_MODE_TX_RX;

  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

  huart1.Init.OverSampling = UART_OVERSAMPLING_16;

  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }      

這次我們使用的屏串行通訊的協定是廠家自己定義的,不過資料幀結構較為簡單,如下圖所示:

STM32L476應用開發之四:觸摸屏驅動與資料互動

而且功能也比較簡單,隻有5中功能碼:通路寄存器的0x80和0x81、通路變量存儲器的0x82和0x83以及通路曲線緩沖區的0x84,具體描述如下圖所示:

STM32L476應用開發之四:觸摸屏驅動與資料互動

根據以上描述我們可以編寫對應不同對象通路的程式了。

(1)、寫資料變量存儲器

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

(2)、讀變量存儲器資料

void ReadDataFromLCD(uint16_t startAddress,uint8_t readWordLength)
{
  //指令的長度由幀頭(2個位元組)+資料長度(1個位元組)+指令(1個位元組)+起始位址(2個位元組)+讀取的字長度(1個位元組)

  uint16_t cmd_Length=7;

  uint8_t cmd_VAR_Read[]={0x5A,0xA5,0x04,FC_VAR_Read,0x00,0x00,0x00};//讀資料指令

  cmd_VAR_Read[4]=(uint8_t)(startAddress>>8);//起始位址

  cmd_VAR_Read[5]=(uint8_t)startAddress;//起始位址

  cmd_VAR_Read[6]=readWordLength;//讀取長度

  SendData(cmd_VAR_Read,cmd_Length);
}      

(3)、寫曲線緩沖區

void WriteCurveToLCD(uint8_t txData[],uint16_t length,uint8_t channelMode)
{
  //指令的長度由幀頭(2個位元組)+資料長度(1個位元組)+指令(1個位元組)+通道模式(1個位元組)+資料(length,最多8個字)

  uint16_t cmd_Length=length+5;

  uint8_t cmd_Curve_Write[WriteCurveCommandLength];//寫曲線緩沖區指令

  cmd_Curve_Write[0]=0x5A;

  cmd_Curve_Write[1]=0xA5;

  cmd_Curve_Write[2]=(uint8_t)(length+2);

  cmd_Curve_Write[3]= FC_Curve_Write;

  cmd_Curve_Write[4]=channelMode;

  for(int dataIndex=0;dataIndex<length;dataIndex++)
  {
    cmd_Curve_Write[dataIndex+5]=txData[dataIndex];
  }

  SendData(cmd_Curve_Write,cmd_Length);
}      

(4)、寫寄存器資料

void SetRegisterData(uint8_t regAddress,uint8_t txData[],uint16_t length)
{
  //指令的長度由幀頭(2個位元組)+資料長度(1個位元組)+指令(1個位元組)+寄存器位址(1個位元組)+寫的資料

  uint16_t cmd_Length=length+5;

  uint8_t cmd_Reg_Write[WriteCurveCommandLength];//寫曲線緩沖區指令

  cmd_Reg_Write[0]=0x5A;

  cmd_Reg_Write[1]=0xA5;

  cmd_Reg_Write[2]=(uint8_t)(length+2);

  cmd_Reg_Write[3]= FC_REG_Write;

  cmd_Reg_Write[4]=regAddress;

  for(int dataIndex=0;dataIndex<length;dataIndex++)
  {
    cmd_Reg_Write[dataIndex+5]=txData[dataIndex];
  }

  SendData(cmd_Reg_Write,cmd_Length);
}      

(5)、讀寄存器資料

void GetRegisterData(uint8_t regAddress,uint8_t readByteLength)
{
  //指令的長度由幀頭(2個位元組)+資料長度(1個位元組)+指令(1個位元組)+寄存器位址(1個位元組)+讀取寄存器的位元組長度(1個位元組)

  uint16_t cmd_Length=6;

  uint8_t cmd_Reg_Read[]={0x5A,0xA5,0x03,FC_REG_Read,0x00,0x00};//讀資料指令

  cmd_Reg_Read[4]=regAddress;

  cmd_Reg_Read[5]=readByteLength;

  SendData(cmd_Reg_Read,cmd_Length);
}      

3、測試結果

完成上述編寫後,接上顯示屏下裝,我們來檢視顯示效果:

STM32L476應用開發之四:觸摸屏驅動與資料互動

如果閱讀這篇文章讓您略有所得,還請點選下方的【好文要頂】按鈕。

當然,如果您想及時了解我的部落格更新,不妨點選下方的【關注我】按鈕。

如果您希望更友善且及時的閱讀相關文章,也可以掃描上方二維碼關注我的微信公衆号【木南創智】

繼續閱讀