【工具使用】STM32CubeMX-USB配置-實現U盤功能

一、概述

????無論是新手還是大佬,基于STM32單片機的開發,使用STM32CubeMX都是可以極大提升開發效率的,并且其界面化的開發,也大大降低了新手對STM32單片機的開發門檻。
????本文主要講述STM32芯片USB功能的配置及其相關知識。

二、軟件說明

????STM32CubeMX是ST官方出的一款針對ST的MCU/MPU跨平臺的圖形化工具,支持在Linux、MacOS、Window系統下開發,其對接的底層接口是HAL庫,另外習慣于寄存器開發的同學們,也可以使用LL庫。STM32CubeMX除了集成MCU/MPU的硬件抽象層,另外還集成了像RTOS,文件系統,USB,網絡,顯示,嵌入式AI等中間件,這樣開發者就能夠很輕松的完成MCU/MPU的底層驅動的配置,留出更多精力開發上層功能邏輯,能夠更進一步提高了嵌入式開發效率。
????演示版本 6.1.0

三、USB功能簡介

STM32F103C8T6的USB外設

  1. 頂部模塊: - Analog transceiver:模擬收發器,通過 DP 和 DM 引腳實現物理層信號的收發,是 USB 與外部連接的接口。

  2. 綠色區域(USB 時鐘 48MHz 驅動): - Suspend timer:掛起定時器,用于管理 USB 的掛起狀態。 - RX - TX、Control S.I.E.:負責數據的接收(RX)與發送(TX),以及控制相關操作。 - Clock recovery:時鐘恢復模塊,從輸入信號中恢復時鐘。 - Endpoint selection:端點選擇模塊,用于選擇不同的 USB 端點。 - 這些模塊連接到 Control registers and logic(控制寄存器及邏輯)和 Interrupt registers and logic(中斷寄存器及邏輯),實現配置與中斷管理;同時連接到多個 Endpoint registers(端點寄存器),用于存儲端點相關數據。 - Packet buffer interface:數據包緩沖區接口,負責與下方的緩沖區模塊交互。

  3. 灰色區域(PCLK 驅動,通過 APB1 總線通信): - Arbiter:仲裁器,管理總線訪問優先級。 - Packet buffer memory:數據包緩沖存儲器,存儲 USB 數據。 - Register mapper:寄存器映射,將端點寄存器映射到系統地址空間。 - Interrupt mapper:中斷映射,將 USB 中斷路由到 NVIC(嵌套向量中斷控制器)。 - APB1 wrapper:APB1 總線封裝,通過 APB1_bus 與系統連接,PCLK1 提供時鐘。 整體上,該框圖展示了 USB 外設從物理信號收發、時鐘處理、數據傳輸到系統接口(APB1)的完整流程,以及寄存器配置、中斷管理等功能模塊的協作關系。

四、USB配置及代碼實現

  • STM32CubeMX配置

USB設備類選擇

????這是USB設備類選擇的下拉菜單,因為我們要實現一個U盤的功能,所以這里我們選擇Mass Storage Class(簡稱MSC)
Disable:禁用,表示不使用任何設備類功能。
Audio Device Class:音頻設備類,用于音頻相關設備,如聲卡、耳機等音頻輸入輸出設備。
Communication Device Class (Virtual Port Com):通信設備類(虛擬串口),用于實現虛擬串口通信功能,方便設備與計算機進行數據傳輸,常應用于一些需要串口通信模擬的場景。
Download Firmware Update Class (DFU):下載固件更新類,用于設備固件的更新操作,允許設備在運行過程中通過特定方式更新自身固件。
Human Interface Device Class (HID):人機接口設備類,像鍵盤、鼠標、游戲手柄等直接與用戶交互的設備屬于此類。
Custom Human Interface Device Class (HID):自定義人機接口設備類,是在標準 HID 基礎上,根據特定需求進行定制開發的人機交互設備類別。
Mass Storage Class:大容量存儲類,用于 U 盤、移動硬盤等存儲設備,使設備能像存儲介質一樣被計算機識別和讀寫數據。

USB設備相關參數

????這部分是 USB 設備相關的參數設置,分為 Basic Parameters(基本參數) 和 Class Parameters(類參數) 兩部分,這些參數共同配置了 USB 設備的基本屬性、調試行為以及大容量存儲類的緩沖區設置,確保設備在特定場景下正常工作。

  1. Basic Parameters
    USBD_MAX_NUM_INTERFACES:表示 USB 設備支持的最大接口數量,圖中設置為 1。接口用于區分設備的不同功能(如一個設備僅實現單一功能時,接口數為 1)。
    USBD_MAX_NUM_CONFIGURATION:最大配置數量,設為 1。USB 設備配置代表不同工作模式,此處表示僅有一種工作模式。
    USBD_MAX_STR_DESC_SIZE:USB 描述符字符串的最大長度,為 512 bytes,用于定義設備名稱等描述信息的最大長度。
    USBD_SELF_POWERED:設備自供電狀態,顯示 Enabled,即設備采用自供電方式,而非依賴 USB 主機供電。
    USBD_DEBUG_LEVEL:調試級別為 0: No debug message,表示調試時不輸出任何調試信息。

  2. Class Parameters
    MSC_MEDIA_PACKET:針對大容量存儲類(Mass Storage Class, MSC),定義媒體輸入 / 輸出緩沖區大小為 512 bytes,用于數據傳輸時的緩沖處理。

USB設備描述符相關配置

????這部分是 USB 設備描述符相關的配置信息,分為 Device Descriptor(設備描述符) 和 Device Descriptor FS(全速設備描述符) 兩部分,這些描述符信息是 USB 設備在與主機通信時,用于向主機聲明自身屬性和功能的關鍵參數,確保設備能被正確識別和驅動,這部分不需要修改,了解下其作用即可。

  1. Device Descriptor
    VID (Vendor Identifier):廠商標識符,值為 1155,用于唯一標識設備的生產廠商。
    LANGID_STRING (Language Identifier):語言標識符,值為 English(United States),表示設備使用的語言為美國英語。
    MANUFACTURER_STRING (Manufacturer Identifier):制造商標識符,值為 STMicroelectronics,表明設備由意法半導體制造。
  2. Device Descriptor FS
    PID (Product Identifier):產品標識符,值為 22314,用于唯一標識該廠商下的具體產品。
    PRODUCT_STRING (Product Identifier):產品描述字符串,值為 STM32 Mass Storage,說明這是一個基于 STM32 的大容量存儲設備(如 U 盤、移動存儲等)。
    CONFIGURATION_STRING (Configuration Identifier):配置描述字符串,值為 MSC Config,表示設備的配置與大容量存儲類(Mass Storage Class, MSC)相關。
    INTERFACE_STRING (Interface Identifier):接口描述字符串,值為 MSC Interface,表明設備使用的接口屬于大容量存儲類接口,用于實現數據的存儲讀寫功能。

????完整配置如下,USB 協議規定時鐘誤差需≤±0.25%,而STM32F103的內部 RC 振蕩器(HSI,8MHz)精度僅 ±1%,無法滿足要求,所以這時必須使用外部晶振。時鐘按CubeMX自己計算的即可,一般是用48MHz。
USB配置

  • 相關接口實現

????完成以上配置后生成工程,為實現電腦對U盤的讀寫功能,這里還需要實現usbd_storage_if.c文件下的STORAGE_Read_FSSTORAGE_Write_FS接口,以完成電腦識別USB后對單片機內部Flash的操作,同時可以修改一下STORAGE_GetCapacity_FS接口,用來給電腦識別U盤設備的容量大小。如果需要使用外部Flash,則在此處實現外部Flash的讀寫操作。

/** @defgroup USBD_STORAGE_Private_Defines* @brief Private defines.* @{*/#define STORAGE_LUN_NBR                  1
#define STORAGE_BLK_NBR                  44//0x10000
#define STORAGE_BLK_SIZ                  0x400//0x200/* USER CODE BEGIN PRIVATE_DEFINES */
#define FLASH_START_ADDR                 0x08005000
/* USER CODE END PRIVATE_DEFINES *//*** @brief  .* @param  lun: .* @param  block_num: .* @param  block_size: .* @retval USBD_OK if all operations are OK else USBD_FAIL*/
int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{/* USER CODE BEGIN 3 */*block_num  = STORAGE_BLK_NBR;*block_size = STORAGE_BLK_SIZ;return (USBD_OK);/* USER CODE END 3 */
}/*** @brief  .* @param  lun: .* @retval USBD_OK if all operations are OK else USBD_FAIL*/
int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{/* USER CODE BEGIN 6 */if (lun == 0){memcpy(buf, (uint8_t *)(FLASH_START_ADDR + blk_addr * FLASH_PAGE_SIZE), blk_len * FLASH_PAGE_SIZE);}return (USBD_OK);/* USER CODE END 6 */
}/*** @brief  .* @param  lun: .* @retval USBD_OK if all operations are OK else USBD_FAIL*/
int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{/* USER CODE BEGIN 7 */if (lun == 0){FLASH_EraseInitTypeDef f;uint32_t err = 0;uint16_t i;/* Flash解鎖 */HAL_FLASH_Unlock();f.TypeErase = FLASH_TYPEERASE_PAGES;f.PageAddress = FLASH_START_ADDR + blk_addr * FLASH_PAGE_SIZE;f.NbPages = blk_len;f.Banks = FLASH_BANK_1;/* Flash擦除 */HAL_FLASHEx_Erase(&f, &err);for (i = 0; i < blk_len * FLASH_PAGE_SIZE; i += 4){/* Flash寫入 */HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FLASH_START_ADDR + blk_addr * FLASH_PAGE_SIZE + i, *(uint32_t *)(&buf[i]));}/* Flash鎖 */HAL_FLASH_Lock();}return (USBD_OK);/* USER CODE END 7 */
}
  • 效果演示

效果演示

五、注意事項

1、如果是自己畫的板子,注意D+口(DP)需要上拉個1.5k的電阻到3.3V。

六、相關鏈接

對于剛入門的小伙伴可以先看下STM32CubeMX的基礎使用及Keil的基礎使用。
【工具使用】STM32CubeMX-基礎使用篇
【工具使用】Keil5軟件使用-基礎使用篇
【工具使用】STM32CubeMX-片內Flash讀寫操作

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80671.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80671.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80671.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從ISO17025合規到信創適配 解密質檢lims系統實驗室的 AI 質檢全鏈路實踐

在北京某國家級質檢中心的 CMA 復評審現場&#xff0c;審核專家通過系統后臺調取近半年的檢測記錄&#xff0c;從樣品登記時的電子簽名到報告簽發的 CA 簽章&#xff0c;178 項合規指標全部自動校驗通過 —— 這是白碼質檢 LIMS 系統創造的合規奇跡。 一、智能合規引擎&#xf…

【操作系統】進程同步問題——生產者-消費者問題

問題描述 生產者進程負責生產產品&#xff0c;并將產品存入緩沖池&#xff0c;消費者進程則從緩沖池中取出產品進行消費。為實現生產者和消費者的并發執行&#xff0c;系統在兩者之間設置了一個包含n個緩沖區的緩沖池。生產者將產品放入緩沖區&#xff0c;消費者則從緩沖區中取…

SpringBoot-6-在IDEA中配置SpringBoot的Web開發測試環境

文章目錄 1 環境配置1.1 JDK1.2 Maven安裝配置1.2.1 安裝1.2.2 配置1.3 Tomcat1.4 IDEA項目配置1.4.1 配置maven1.4.2 配置File Encodings1.4.3 配置Java Compiler1.4.4 配置Tomcat插件2 Web開發環境2.1 項目的POM文件2.2 項目的主啟動類2.3 打包為jar或war2.4 訪問測試3 附錄3…

Vue3 父子組件傳值, 跨組件傳值,傳函數

目錄 1.父組件向子組件傳值 1.1 步驟 1.2 格式 2. 子組件向父組件傳值 1.1 步驟 1.2 格式 3. 跨組件傳值 運行 4. 跨組件傳函數 ?5. 總結 1. 父傳子 2. 子傳父 3. 跨組件傳值(函數) 1.父組件向子組件傳值 1.1 步驟 在父組件中引入子組件 在子組件標簽中自定義屬…

嵌入式學習筆記 - STM32 U(S)ART 模塊HAL 庫函數總結

一 串口發送方式&#xff1a; ①輪訓方式發送&#xff0c;也就是主動發送&#xff0c;這個容易理解&#xff0c;使用如下函數&#xff1a; HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout); ②中斷方式發送&#xff…

AI無法解決的Bug系列(一)跨時區日期過濾問題

跨時區開發中&#xff0c;React Native如何處理新西蘭的日期過濾問題 有些Bug&#xff0c;不是你寫錯代碼&#xff0c;而是現實太魔幻。 比如我最近給新西蘭客戶開發一個React Native應用&#xff0c;功能非常樸素&#xff1a;用戶選一個日期范圍&#xff0c;系統返回該范圍內…

基于天貓 API 的高效商品詳情頁實時數據接入方法解析

一、引言 在電商大數據分析、競品監控及智能選品等場景中&#xff0c;實時獲取天貓商品詳情頁數據是關鍵需求。本文將詳細解析通過天貓開放平臺 API 高效接入商品詳情數據的技術方案&#xff0c;涵蓋接口申請、數據獲取邏輯及代碼實現&#xff0c;幫助開發者快速構建實時數據采…

系分論文《論遺產系統演化》

系統分析師論文范文系列 摘要 2022年6月,某金融機構啟動核心業務系統的技術升級項目,旨在對其運行超過十年的遺留系統進行演化改造。該系統承擔著賬戶管理、支付結算等關鍵業務功能,但其技術架構陳舊、擴展性不足,難以適應數字化轉型與業務快速增長的需求。作為系統分析師,…

Spark Core基礎與源碼剖析全景手冊

Spark Core基礎與源碼剖析全景手冊 Spark作為大數據領域的明星計算引擎&#xff0c;其核心原理、源碼實現與調優方法一直是面試和實戰中的高頻考點。本文將系統梳理Spark Core與Hadoop生態的關系、經典案例、聚合與分區優化、算子底層原理、集群架構和源碼剖析&#xff0c;結合…

人工智能賦能產業升級:AI在智能制造、智慧城市等領域的應用實踐

人工智能賦能產業升級&#xff1a;AI在智能制造、智慧城市等領域的應用實踐 近年來&#xff0c;人工智能&#xff08;AI&#xff09;技術的快速發展為各行各業帶來了深刻的變革。無論是制造業、城市管理&#xff0c;還是交通、醫療等領域&#xff0c;AI技術都展現出了強大的應用…

React Native打包報錯: Task :react-native-picker:verifyReleaseResources FAILE

RN打包報錯&#xff1a; Task :react-native-picker:verifyReleaseResources FAILED Execution failed for task :react-native-picker:verifyReleaseResources. 解決方法&#xff1a; 修改文件react-native-picker中的版本信息。 路徑&#xff1a;node_modules/react-native-p…

虛擬網絡編輯器

vmnet1 僅主機模式 hostonly 功能&#xff1a;虛擬機只能和宿主機通過vmnet1通信&#xff0c;不可連接其他網絡&#xff08;包括互聯網&#xff09; vmnet8 地址轉換模式 NAT 功能&#xff1a;虛擬機可以和宿主通過vmnet8通信&#xff0c;并且可以連接其他網絡&#xff0c;但是…

docker環境和dockerfile制作

docker 一、環境和安裝 1、 docker安裝 使用 root 權限登錄 CentOS。確保 yum 包更新到最新sudo yum update卸載舊版本yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux …

[luogu12542] [APIO2025] 排列游戲 - 交互 - 博弈 - 分類討論 - 構造

傳送門&#xff1a;https://www.luogu.com.cn/problem/P12542 題目大意&#xff1a;給定一個長為 n n n 的排列和一張 m m m 個點 e e e 條邊的簡單連通圖。每次你可以在圖上每個點設置一個 0 ~ n ? 1 0\sim n-1 0~n?1、兩兩不同的權值發給交互庫&#xff0c;交互庫會…

智能體agent概述

智能體概述 智能體是一個能夠感知環境并在環境中自主行動以實現特定目標的系統。它具有以下幾個關鍵特征&#xff1a; 自主性 - 智能體可以在沒有直接人為干預的情況下運作&#xff0c;能夠自行決策和行動。 響應性 - 能夠感知環境并對環境變化做出及時響應。 主動性 - 不僅…

2:OpenCV—加載顯示圖像

加載和顯示圖像 從文件和顯示加載圖像 在本節中&#xff0c;我將向您展示如何使用 OpenCV 庫函數從文件加載圖像并在窗口中顯示圖像。 首先&#xff0c;打開C IDE并創建一個新項目。然后&#xff0c;必須為 OpenCV 配置新項目。 #include <iostream> #include <ope…

python訓練 60天挑戰-day31

知識點回顧 規范的文件命名規范的文件夾管理機器學習項目的拆分編碼格式和類型注解 昨天我們已經介紹了如何在不同的文件中&#xff0c;導入其他目錄的文件&#xff0c;核心在于了解導入方式和python解釋器檢索目錄的方式。 搞清楚了這些&#xff0c;那我們就可以來看看&#x…

構建自動收集并總結互聯網熱門話題的網站

構建自動收集并總結互聯網熱門話題的網站的具體方案&#xff1a; 一、系統架構設計 數據采集層 ? 使用Python的Scrapy或BeautifulSoup抓取新聞網站/社交媒體API # 示例&#xff1a;微博熱點爬蟲 import requests def fetch_weibo_hot():url "https://weibo.com/ajax/st…

pycharm無需科學上網工具下載插件的解決方案

以下是兩種無需科學上網即可下載 PyCharm 插件的解決思路&#xff1a; 方法 1&#xff1a;設置 PyCharm 代理 打開 PyCharm選擇菜單&#xff1a;File → Settings → Appearance & Behavior → System Settings → HTTP Proxy在代理設置中進行如下配置&#xff1a; 代理地…

機器學習自然語言處理

在自然語言處理&#xff08;NLP&#xff09;領域&#xff0c;詞向量&#xff08;Word Embedding&#xff09;是將人類語言轉化為計算機可理解形式的關鍵技術。它通過數學空間中的向量表示&#xff0c;捕捉詞語的語義和語法信息&#xff0c;有效解決了傳統離散表示的 “維數災難…