野火指南者(STM32F103VET6)應用:實現USB虛擬串口(CDC_VPC)

来源:https://www.cnblogs.com/couvrir/archive/2023/06/06/17461078.html
-Advertisement-
Play Games

MCU:STM32F103VET6 開發環境:STM32CubeMX+MDK5 實現USB的虛擬串口不需要去理解USB的底層驅動,只需要STM32CubeMX去配置生成工程即可。在野火的指南者中,是沒有這一類的視頻和示例的,博主使用這款開發板實現USB虛擬串口。 首先需要打開STM32CubeMX工 ...


MCU:STM32F103VET6

開發環境:STM32CubeMX+MDK5

 

實現USB的虛擬串口不需要去理解USB的底層驅動,只需要STM32CubeMX去配置生成工程即可。在野火的指南者中,是沒有這一類的視頻和示例的,博主使用這款開發板實現USB虛擬串口。

首先需要打開STM32CubeMX工具。輸入開發板MCU對應型號,找到開發板對應封裝的MCU型號,雙擊打開(圖中第三)。

 

此時,雙擊完後會關閉此界面,然後打開一個新界面。

 

然後,我們開始基本配置。

 

現在我們選擇一個LED作為系統LED,該步驟可以忽略,只是本人喜歡這樣子。以硬體原理圖的綠燈為例子。

 

基本配置除了時鐘樹外,基本上已經配置好了。

現在來配置USB_Device。STM32F1系列USB只支持USB_Device。

 

選中USB類型後,還需要細化其中的類型。

 

一切配置都是基於硬體原理圖的。硬體配置除常規配置外,還是需要看硬體原理圖的。在硬體原理圖中,可以看到只有PD6拉低時,USB才使能。(針對野火指南者開發板)

 

現在配置時鐘樹

 

配置完成,完善工程,生成工程。

到此,STM32CubeMX工具的使用結束!可以發現在桌面已經生成了USB_VPC工程。

 

USB虛擬串口還需要裝驅動才能被是識別到,在Win7、Win8機型PC中需要到ST官網下載。win10及以上機型在本地已有驅動,無需安裝。

使用MDK5打開USB_VPC工程打開。點擊魔法棒,勾選微庫。選擇對應的下載器,勾選下載完複位允許。USB線一端接開發板USB_Device,一端接PC。

 

現在可以開始實驗了,實現VPC的發送與回傳,並重定向printf函數。

在此之前,簡單描述一下生成的USB文件以及重要函數。

然後再插播一條,看帖子說是,剛下載完程式時,是識別不出埠的。需要在上電的情況下從PC那拔插一次USB線。然後可以使用一個函數解決這個問題。可以在gpio.c中寫入函數,然後記得在頭文件聲明。使用要在MX_USB_DEVICE_Iint()之前。

(我沒遇到這個問題,但是我還是放到工程了,但是我沒用這函數。)

 1 /* USER CODE BEGIN 2 */
 2 /*USB 重新枚舉函數*/
 3 void USB_Reset(void)
 4 {
 5     GPIO_InitTypeDef GPIO_InitStruct = {0};
 6     
 7     __HAL_RCC_GPIOA_CLK_ENABLE();
 8     
 9     GPIO_InitStruct.Pin = GPIO_PIN_12;
10     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
11     GPIO_InitStruct.Pull = GPIO_NOPULL;
12     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
13     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
14     
15     HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_RESET);
16     HAL_Delay(100);
17     HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_SET);
18 }
19 /* USER CODE END 2 */

 

實驗環節:發送與回傳

在main.c中(截取片段,修改部分)

 1 /* Private includes ----------------------------------------------------------*/
 2 /* USER CODE BEGIN Includes */
 3 #include "usbd_cdc_if.h"
 4 /* USER CODE END Includes */
 5 
 6 /* Private typedef -----------------------------------------------------------*/
 7 /* USER CODE BEGIN PTD */
 8 
 9 /* USER CODE END PTD */
10 
11 /* Private define ------------------------------------------------------------*/
12 /* USER CODE BEGIN PD */
13 /* USER CODE END PD */
14 
15 /* Private macro -------------------------------------------------------------*/
16 /* USER CODE BEGIN PM */
17 
18 /* USER CODE END PM */
19 
20 /* Private variables ---------------------------------------------------------*/
21 
22 /* USER CODE BEGIN PV */
23 
24 /* USER CODE END PV */
25 
26 /* Private function prototypes -----------------------------------------------*/
27 void SystemClock_Config(void);
28 /* USER CODE BEGIN PFP */
29 
30 /* USER CODE END PFP */
31 
32 /* Private user code ---------------------------------------------------------*/
33 /* USER CODE BEGIN 0 */
34 
35 /* USER CODE END 0 */
36 
37 /**
38   * @brief  The application entry point.
39   * @retval int
40   */
41 int main(void)
42 {
43   /* USER CODE BEGIN 1 */
44     char str[] = "Hello World!\r\n";
45   /* USER CODE END 1 */
46 
47   /* MCU Configuration--------------------------------------------------------*/
48 
49   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
50   HAL_Init();
51 
52   /* USER CODE BEGIN Init */
53 
54   /* USER CODE END Init */
55 
56   /* Configure the system clock */
57   SystemClock_Config();
58 
59   /* USER CODE BEGIN SysInit */
60 //    USB_Reset();
61   /* USER CODE END SysInit */
62 
63   /* Initialize all configured peripherals */
64   MX_GPIO_Init();
65   MX_USB_DEVICE_Init();
66   /* USER CODE BEGIN 2 */
67 
68   /* USER CODE END 2 */
69 
70   /* Infinite loop */
71   /* USER CODE BEGIN WHILE */
72   while (1)
73   {
74     /* USER CODE END WHILE */
75     CDC_Transmit_FS((uint8_t*)str, 14);
76     HAL_Delay(2000);
77     /* USER CODE BEGIN 3 */
78   }
79   /* USER CODE END 3 */
80 }

在usbd_cdc_if.c中(截取片段,修改部分)

 1 /**
 2   * @brief  Data received over USB OUT endpoint are sent over CDC interface
 3   *         through this function.
 4   *
 5   *         @note
 6   *         This function will issue a NAK packet on any OUT packet received on
 7   *         USB endpoint until exiting this function. If you exit this function
 8   *         before transfer is complete on CDC interface (ie. using DMA controller)
 9   *         it will result in receiving more data while previous ones are still
10   *         not sent.
11   *
12   * @param  Buf: Buffer of data to be received
13   * @param  Len: Number of data received (in bytes)
14   * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
15   */
16 static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
17 {
18   /* USER CODE BEGIN 6 */
19     CDC_Transmit_FS(Buf, *Len);
20     
21   USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
22   USBD_CDC_ReceivePacket(&hUsbDeviceFS);
23   return (USBD_OK);
24   /* USER CODE END 6 */
25 }

實驗結果(波特率隨意選)

 

 

 實驗環節:列印重定向

 在usbd_cdc_if.c中(截取片段,修改部分),聲明在usbd_cdc_if.h文件。

 1 /* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */
 2 #include "stdarg.h"
 3 #include "stdio.h"
 4 
 5 uint8_t usbtemp[64];
 6 void usbvcom_printf(const char *format,...)
 7 {
 8     uint16_t     len;
 9     va_list     args;
10     
11     va_start(args, format);
12     len = vsnprintf((char *)usbtemp, sizeof(usbtemp)+1, (char *)format, args);
13     va_end(args);
14     
15     CDC_Transmit_HS(usbtemp, len);
16 }
17 
18 /* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */

然後就可以像printf那樣使用了,實測過是正常的!

 

時代越來越好,開發效率越來越高,希望能幫助到你!!!

還有就是,開源萬歲。 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # 1、背景 在我們開發的過程中有這麼一種場景, `/projectA` 目錄是 `hadoopdeploy`用戶創建的,他對這個目錄有`wrx`許可權,同時這個目錄屬於`supergroup`,在這個組中的用戶也具有這個目錄的`wrx`許可權,對於其他人,不可訪問這個目錄。現在有這麼一個特殊的用戶`r ...
  • 有時候,我們為了方便,我們往往使用擴展函數的代碼方式創建很多GridView的操作功能,如在隨筆《在DevExpress中使用BandedGridView表格實現多行表頭的處理》中介紹過多行表頭的創建及綁定處理,在《基於DevExpress的GridControl實現的一些界面處理功能》也介紹了一些... ...
  • ## 一:背景 ### 1. 講故事 在這麼多的案例分析中,往往會發現一些案例是卡死線上程的內核態棧上,但拿過來的dump都是用戶態模式下,所以無法看到內核態棧,這就比較麻煩,需要讓朋友通過其他方式生成一個藍屏的dump,這裡我們簡單彙總下。 ## 二:如何生成內核態dump ### 1. 案例代碼 ...
  • # 使用c#實現23種常見的設計模式 設計模式通常分為三個主要類別: - 創建型模式 - 結構型模式 - 行為型模式。 這些模式是用於解決常見的對象導向設計問題的最佳實踐。 以下是23種常見的設計模式並且提供`c#代碼案例`: ## 創建型模式: ### 1. 單例模式(Singleton) ``` ...
  • SM2是國家密碼管理局於2010年12月17日發佈的橢圓曲線公鑰密碼演算法。 產生背景: 隨著密碼技術和電腦技術的發展,目前常用的1024位RSA演算法面臨嚴重的安全威脅,我們國家密碼管理部門經過研究,決定採用SM2橢圓曲線演算法替換RSA演算法。 SM2演算法和RSA演算法都是公鑰密碼演算法,SM2演算法是一種 ...
  • 導航屬性 導航屬性是作為.NET ORM核心功能中的核心,在SqlSugar沒有支持導航屬性前,都說只是一個高級DbHelper, 經過3年的SqlSugar重構已經擁有了一套 非常成熟的導航屬性體系,本文不是重點講SqlSugar而是重點講導航屬性的作用,讓更多寫Sql人還未使用ORM的人瞭解到O ...
  • System.Speech是.NET框架的一部分,提供了語音識別和語音合成的功能。通過使用System.Speech命名空間中的類,開發人員可以在.NET應用程式中實現語音識別功能。 在本文中,我將演示如何使用 System.Speech.NET,這是開發語音應用程式比較牛逼的內庫。它適用於 .NE ...
  • # 通過圖片流來返回圖片 # 前言 之前寫了個圖片介面,然後做了個授權,但是光返回圖片地址雖然能適應大部分需求,但是考慮到有些人不想去處理返回值,也是做了個直接返回圖片流的介面。 # 介面展示 ## 返回指定寬度和高度圖片流 ![image](https://img2023.cnblogs.com/ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...