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