日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

大彩串口屏与STM32G070CBT6通讯调试

發(fā)布時(shí)間:2024/3/24 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大彩串口屏与STM32G070CBT6通讯调试 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

大彩串口屏與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

指令EEXXXX XX…FF FC FF FF
含義幀頭指令指令參數(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文件中定義代碼如下:

/*! * \brief 發(fā)送1個(gè)字節(jié) * \param t 發(fā)送的字節(jié) */ void SendChar(uint8_t t) {HAL_UART_Transmit(&huart2,&t,1, 20);while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET);//等待發(fā)送結(jié)束}

接著在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中重定義如下:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {/* Prevent unused argument(s) compilation warning */UNUSED(huart);/* NOTE : This function should not be modified, when the callback is needed,the HAL_UART_RxCpltCallback can be implemented in the user file.*/if(huart->Instance==USART2){queue_push(uart2_rx_buf);HAL_UART_Receive_IT(&huart2,&uart2_rx_buf, 1);} }

**其中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)具體代碼如下:

unsigned short Convert(unsigned short s) {char right, left;right = s& 0XFF;//低八位left = s >> 8;//高八位 右移8位s = right * 256 + left;return s; }

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ā)給電腦:

void NotifyText(uint16 screen_id, uint16 control_id, uint8 *str) {if(screen_id==4) //畫(huà)面ID2:文本設(shè)置和顯示{ int32 value=0; sscanf(str,"%ld",&value); //把字符串轉(zhuǎn)換為整數(shù) if(control_id==2) //最高電壓{ //限定數(shù)值范圍(也可以在文本控件屬性中設(shè)置) if(value<0) { value = 0; } else if(value>380) { value = 380; } SetTextInt32(4,2,value,0,1); //更新最高電壓SetTextInt32(4,5,value/2,1,1); //更新最高電壓/2//下面就是加入的代碼sprintf(tx_buffer,"value = %ld ",value);//把最高電壓value的值,通過(guò)sprintf函數(shù)放在tx_buffer中。要包含頭文件:#include <stdio.h>HAL_UART_Transmit(&huart1,(uint8_t*)tx_buffer,sizeof(tx_buffer), 20);//通過(guò)串口1把數(shù)據(jù)發(fā)送出去while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!=SET);//等待發(fā)送結(jié)束} } }

在畫(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。