大彩串口屏与STM32G070CBT6通讯调试
大彩串口屏與STM32G070CBT6通訊調(diào)試
- 1 大彩串口屏
- 1.1 指令格式和指令集
- 1.2 硬件連接與程序下載
- 2 串口屏例程移植到STM32G070CBT6
- 2.1 STM32CubeMX生成基于STM32G070CBT6的Hall庫程序
- 2.2 大彩demo程序移植
- 3 總結
本文主要講解如何將大彩提供的DEMO移植到自己項目的工程文件中。首先通過STM32CubeMX生成基于STM32G070CBT6的Hall庫程序;然后將大彩的程序移植到生成的Hall庫程序中。
1 大彩串口屏
對串口屏基本功能不作過多介紹。主要講解一下指令格式和硬件連接。
1.1 指令格式和指令集
對串口屏基本功能不作過多介紹。主要講解一下指令格式和指令集。
一條完整的無 CRC 校驗指令幀格式如表所示。具體指令集解析可看官方大彩串口屏指令集。鏈接: link
| 含義 | 幀頭 | 指令 | 指令參數(shù) | 幀尾 |
真實切屏指令;
讀取文本控件后單片機獲取的指令:
1.2 硬件連接與程序下載
大彩屏與單片機硬件接線圖如下。在 VisualTFT中設計好界面,編譯通過后,可通過USB轉串口將程序下載至串口屏,接線參考如下。如果不確定一開始串口屏中程序的波特率,可通過VisualTFT聯(lián)機設備查看一開始串口屏中的波特率。
2 串口屏例程移植到STM32G070CBT6
2.1 STM32CubeMX生成基于STM32G070CBT6的Hall庫程序
打開cubemx后,選擇STM32G070CBT6作為主控,串口配置如下,注意波特率要跟串口屏中的波特率一致,這里設置為119200,串口屏的也為119200:
同時必須勾選上中斷:
此處可設置中斷的優(yōu)先級,這里設置成1。
這里還配置了一個PC13引腳,用來控制led燈的閃爍。
之后就可以配置生成代碼:
2.2 大彩demo程序移植
先到大彩官網(wǎng)去下載對應的例程。本文選擇的是如下例程做的移植。
1、首先將STM32_KEIL5\STM32\DCDEMO7\src里面的**cmd_queue.c、hmi_driver.c**兩個.c文件復制到proj1\Core\Src中(這里的pro1是我配置cubemx的時候設置的項目名稱Project Name,看自己設置的名稱)。然后再打開STM32_KEIL5\STM32\DCDEMO7\inc,把**cmd_process.h、cmd_queue.h、hmi_driver.h,**三個頭文件復制到proj1\Core\Inc中。
具體操作也可參看鏈接: link
這個博主寫得很詳細,是基于STM32F407。本文這部分是參考了這一篇。
2、把cmd_queue.c中的#include "ulitity.h"注釋掉。
3、將hmi_driver.h中的#include "hmi_user_uart.h"改為自己的#include “usart.h”(如果用cubemx生成的代碼,就是改成usart.h這個頭文件)。
接著,找到官方程序里的hmi_user_uart.h頭文件。首先#include "stm32f10x_it.h" 不需要;接著將里面的宏定義全部復制到#include "usart.h"(自己的串口頭文件);然后串口初始化函數(shù)也不需要(hall會自己生成初始化函數(shù),要改波特率直接在里面改就行了);最后void SendChar(uchar t);這個函數(shù)要移植到自己的串口文件。
這里注重講一下SendChar這和函數(shù),在自己項目usart.c文件中定義代碼如下:
接著在usart.h頭文件中聲明一下這個函數(shù):void SendChar(uint8_t t);
4、最后是main.c頭文件的修改。要把例程里main.c的頭文件,變量,函數(shù)等復制過來。頭文件只需要復制三個(#include "hmi_driver.h",#include "cmd_queue.h",#include "cmd_process.h");變量聲明全部復制;最后函數(shù)則圖上的位置開始,一直復制到main.c的最后。把這些復制到自己的main.c文件中。
5、如果要正常接受到串口屏發(fā)來的指令,必須重新寫一下串口的回調(diào)函數(shù)(注意要把cubemx自動生成的回調(diào)函數(shù)注釋掉-在proj1\Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_uart.c文件中,搜索HAL_UART_RxCpltCallback)。
在main.c中重定義如下:
**其中uart2_rx_buf定義在usart.c中uint8_t uart2_rx_buf;,在usart.h中extern uint8_t uart2_rx_buf;
6、最后可在main函數(shù)中加入自己的代碼了。至此應該可以正常通訊了。
在開始必須 HAL_UART_Receive_IT(&huart2,&uart2_rx_buf, 1);開啟中斷,并且在回調(diào)函數(shù)里重新開啟。
ps:在調(diào)試的時候發(fā)現(xiàn)進入ProcessMessage( PCTRL_MSG msg, uint16 size )函數(shù)里后,處理uint16 screen_id = PTR2U16(&msg->screen_id); 這條語句發(fā)現(xiàn)會卡死,原因還沒有弄清楚。這條語句的作用是將畫面ID這個16位的變量高低八位互換了一下位置。所以重新加了一個函數(shù),交換高低位位置。改了以后就沒有問題了。
其中Convert函數(shù)為16位的高低八位互換函數(shù),用移位計算實現(xiàn),(引用鏈接: link)具體代碼如下:
7、在這里我們還將數(shù)據(jù)通過另一個串口,即串口1,發(fā)送到電腦串口調(diào)試工具上顯示。硬件接線就是單片機通過一個usb轉串口與電腦相連。這里只對屏幕界面切換,和畫面ID4中文本控件某個數(shù)值做響應,在電腦調(diào)試工具中顯示對觸摸屏做的改變。
首先在void NotifyText(uint16 screen_id, uint16 control_id, uint8 *str)函數(shù)中加入代碼如下,實現(xiàn)最高電壓value的值發(fā)給電腦:
在畫面切換調(diào)動的函數(shù)NotifyScreen(screen_id); 中加入代碼,實現(xiàn)切屏信息發(fā)送給串口助手。
//進入音樂畫面自動播放if(current_screen_id == 17) {uint8 buffer[6] = {0x90,0x01 ,0x00 ,0x01 ,0x01};SetButtonValue(17,3,1);PlayMusic(buffer); //播放音樂}**//就在這個函數(shù)最后,加入的代碼** sprintf(tx_buffer,"current_screen_id = %d ",current_screen_id);HAL_UART_Transmit(&huart1,(uint8_t*)tx_buffer,sizeof(tx_buffer), 20);while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!=SET);// }效果如下,此處串口1波特率設置的是115200,用文本模式接收:
3 總結
本次調(diào)試的一般流程如下。
1、首先通過VisualTFT聯(lián)機設備,確定串口屏有無問題,并把官方的串口屏程序通過串口下載進去。下載完成以后,可以通過電腦的串口助手接收串口屏發(fā)送來的指令格式是否正確。注意波特率要一致。
2、使用cubemx生成代碼,生成后首先驗證單片機的串口是否能正常通信,這里可參考鏈接: link ,單片機通過USB轉串口連接電腦,電腦上的串口助手發(fā)給單片機什么數(shù)據(jù),單片機就返回什么數(shù)據(jù)。
3、根據(jù)移植步驟移植大彩提供的demo到自己的項目里。通訊不上的話,一般是串口中斷那塊代碼有問題:程序一開始沒有打開串口接收中斷;在回調(diào)函數(shù)中寫壓指令函數(shù),還有回調(diào)函數(shù)中必須重新開啟中斷;這里指令處理函數(shù)ProcessMessage中的PTR2U16(&msg->screen_id); 和PTR2U16(&msg->control_id); 會跳入死循環(huán),暫時不知道原因,重寫一下交換高低位函數(shù)就好了。
以上是一些我的調(diào)試過程與總結,水平有限,如有錯誤,希望大家指正。
總結
以上是生活随笔為你收集整理的大彩串口屏与STM32G070CBT6通讯调试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新时代 计算机专业前景,新时代的四大“
- 下一篇: 毕业论文的修改技巧详解