娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

STM32 使用Cubemx 建一個USB(HID)設備下位機,實現數據收發

發布者:電子科技愛好者最新更新時間:2025-02-18 來源: cnblogs關鍵字:STM32  Cubemx  數據收發 手機看文章 掃描二維碼
隨時隨地手機看文章

這里記錄一下如何做一個USB下位機,這里主要分3部分:1、建立工程;2、添加報文描述符;3、數據的傳輸。這里就不講USB的理論知識了,有想要了解的百度一下就可以了。

 

建立工程:工程建立參考:https://www.cnblogs.com/libra13179/p/7193375.html

 

  1、首先打開USB

  

  

  2、接著把USB設置為下圖HID模式

  

  3、選擇外部時鐘

  

  4、配置時鐘樹

  

  5、配置USB設置

  

  

  下面的USB設置就有點講究了,

  

  USBD_CUSTOM_HID_REPORT_DESC_SIZE 這個是指報告描述符所用的字節數為34(默認為2);USBD_CUSTOMHID_OUTREPORT_BUF_SIZE 表示輸入輸出端點一次傳輸數據大小最大為64個字節(默認為2)

  【 補充:現在新版本的STM32Cumebx在這個配置里還多了一項CUSTOM_HID_FS_BINTERVAL,這個是指數據傳輸的最小時間間隔(ms)這里修改為跟下面USB傳輸部分中修改時間間隔一致 】

 

6、確認后,生成代碼

  補充:生成代碼的時候注意把堆的大小改大一點,不然容易出現設備識別出來出現感嘆號的情況

   

  最后生成項目

  

 

添加報文描述符:

 

  這里只是建立了一個工程,你編譯不會有錯,不過PC還是無法識別你這個是USB設備的,因為缺少了關鍵的報文描述符,這里我就說一下報文描述符怎么寫,這個你可以直接用HID descriptor Tool軟件生成,如下圖,下圖就是一個報文的基本要素了,該描述符主要作用是告訴PC機一下USB的信息,簡單來說就是告訴PC我有什么用。

 HID descriptor Tool 百度云下載鏈接:https://pan.baidu.com/s/1BbEV3pak0KgVXD8GHtzLow ;提取碼:nalw 。

  

  這里我說一下這個報文的要素,第一部分你可以理解為報文頭;第二部分你可以理解為USB告訴PC機問我要做什么,這里主要告訴PC機我要做一個接收與發送的設備,USAGE~INPUT這里是描述這個USB設備作為輸入的時候的數據格式,下一個USAGE~OUTPUT是描述該USB設備輸出的數據格式,其中LOGICAL_MINIMUM是指每個字節數據的最小值,LOGICAL_MAXIMUM是指每個字節數據的最大值,REPORT_COUNT是指定每次傳輸數據最多多少個字節,REPORT_SIZE是指定每次傳輸數據每個字節的位數;第三部分是結束標志。

============================================================

下面我插入一個對報文描述符進行一個簡單的描述:

   

標簽解析舉例(Usage :0x50, 0x01):

  (Usage Page標簽0x0?)0x05=0000 0101 :

  0x05表示前綴,0x01為數據部分,0x05轉換成二進制,就是0000 01 01,按照HID類協議5.3 generic item format的定義,這個字節被分成3個部分:

  bit0~bit1代表的是這個前綴后面跟的數據長度,這里就是后面0x01的長度,兩位可以表示最大4字節的數據,即bsize

  bit2~bit3代表的是這個前綴的類型,總共可以有三種類型:0=main,1=global,2=local,3=reserved;

  bit4~bit7代表前tag,一般分為input(二進制的1000 00 nn,即bit4~bit7=1000,代表一個tag,bit2~bit3=00,代表main,bit0~bit1=nn,代表這個前綴后面還有nn所代表的數據),output(二進制的 1001 00 nn),feature(1011 00 nn),collection(1010 00 nn),end collection(1100 00 nn)

即:

  0000:Usage Page

  01: bType,全局(bType=0:主項目;bType=1:全局項目;bType=2:區域項目)

  01:bSzie,1字節(bSzie為項目所需數據字節數目,bSzie可為1、2、4,注意bSzie不可為3)

 (Page ID)0x01: 表示該Page為Generalic Desktop Controls(Usage ID 0為保留。ID 1到0x1F為”top level” collection保留,這些ID雖然對于Application不是必須,但可以用于識別通用設備類型)

  

  Usage = (usage page:usage ID):其將數據的操控與它的用途作一對一的對應,所以解讀報告后就可以知道每個數據作何種操作。所以“傳輸的數據”和“操作”只是一事件的兩種描述方式。用途是以一個32位卷標(稱作usage tag)來表示,高16位稱作usage page(用途類頁),低16位稱為usage ID(用途識別名),文件universal serial Bus HID Usage Table完整列出所有的usage pages(用途類頁)和usage ID(用途識別名),使用者必須遵照文件的規范來聲明操作的用途。用途卷標只是報告描述符諸多標簽的一個,利用這些卷標取可以清楚完整的描述符操作的用途。

  這里其實說的并不清楚,因為作者有點懶就不細說了,想了解更多的可以百度《圈圈教你玩USB》,這里說的比我好。

==============================================================================

 

言歸正傳,我們生成了報文描述符后,保存為.h文件,我對這些報文做了一些很淺顯的解析,可能表達不夠準確,打開可以看到如下代碼所示:


char ReportDescriptor[34] = 

{                     //這里34就是前面建立工程第五點說的,報文描述符大小

    0x06, 0x00, 0xff,              // USAGE_PAGE (Vendor Defined Page 1) 表示一個報文標簽之類的用途類頁

    0x09, 0x01,                    // USAGE (Vendor Usage 1) 表示一個報告ID標志

    0xa1, 0x01,                    // COLLECTION (Application) 表示應用集合,要以下面最后的0xc0結束它



    0x09, 0x01,                    //   USAGE (Vendor Usage 1)同下同名解析

    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)  同下同名解析

    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255) 同下同名解析

    0x95, 0x40,                    //   REPORT_COUNT (64)  同下REPORT_COUNT

    0x75, 0x08,                    //   REPORT_SIZE (8)   同下REPORT_SIZE

    0x81, 0x02,                    //   INPUT (Data,Var,Abs) 表示USB要輸入數據到PC的功能



    0x09, 0x01,                    //   USAGE (Vendor Usage 1) 每個功能的一個卷標志

    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)    表示每個傳輸數據限定為0

    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)    表示每個傳輸數據的最大值限定為255

    0x95, 0x40,                    //   REPORT_COUNT (64) 每次接收的數據長度,這里是64位

    0x75, 0x08,                    //   REPORT_SIZE (8)        傳輸字段的寬度為8bit,表示每個傳輸的數據范圍為0~ffff ffff

    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs) 表示USB設備要接收PC的數據的功能

    0xc0                           // END_COLLECTION  結束標志

};


到這里我們就可以下一步了,打開剛才建立的工程,在 usbd_custom_hid_if.c 文件里,找到 CUSTOM_HID_ReportDesc_FS 這個函數,把剛才生成的報文文件覆蓋掉函數里面的文件,代碼如下:


/** Usb HID report descriptor. */

__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =

{

    0x06, 0x00, 0xff,              // USAGE_PAGE (Vendor Defined Page 1)

    0x09, 0x01,                    // USAGE (Vendor Usage 1)

    0xa1, 0x01,                    // COLLECTION (Application)

    0x09, 0x01,                    //   USAGE (Vendor Usage 1)

    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)

    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)

    0x95, 0x40,                    //   REPORT_COUNT (64)

    0x75, 0x08,                    //   REPORT_SIZE (8)

    0x81, 0x02,                    //   INPUT (Data,Var,Abs)

    0x09, 0x01,                    //   USAGE (Vendor Usage 1)

    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)

    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)

    0x95, 0x40,                    //   REPORT_COUNT (64)

    0x75, 0x08,                    //   REPORT_SIZE (8)

    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)

    0xc0                           // END_COLLECTION

};


然后再修改將usbd_conf.h做對應修改:

  #define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE      64

  #define USBD_CUSTOM_HID_REPORT_DESC_SIZE       34

同時修改usbd_customhid.h文件中的發送與接收長度為64

  #define CUSTOM_HID_EPIN_SIZE                  0x40

  #define CUSTOM_HID_EPOUT_SIZE              0x40

  到這里基本就算做出一個USB設備了,我們編譯下載程序看看。

 

========================【注意】===========================================

  如果電腦顯示了這個USB設備,但是有黃色感嘆號,說明USB枚舉成功,可是驅動安裝失敗,這時我們可以libusb自帶的inf-wizard工具生成USB驅動程序,libusb官網下載鏈接為https://sourceforge.net/projects/libusb-win32/,或者可以去百度云盤下載( 鏈接:https://pan.baidu.com/s/10GUwwhPZTYONBYbOutVBzA ;提取碼:lf87 )。

  下載好文件后解壓,找到下圖的inf-wizar工具打開。

  

  打開后該工具可以掃描你電腦的USB設備,并獲取設備的PID、VID。

  

   根據 PID/VID 找到你自己的USB設備,選擇它點擊Next。

  

   保持默認配置,Next即可,最后你自己選擇你的USB設備驅動的安裝路徑,你可以自己在C盤建立個文件夾安裝在里面即可。

 ===============================================================

 

USB數據傳輸:參考http://www.stm32cube.com/article/138

 

  關于數據傳輸,HID設備是采用輪詢方式傳輸的,ST默認20ms速度實在不敢恭維,還得要改一下枚舉時的聲明(這里修改跟CUSTOM_HID_FS_BINTERVAL一致,舊版STM32Cumebx中沒有這項配置修改可以直接修改usbd_conf.h文件里的CUSTOM_HID_FS_BINTERVAL),修改usbd_customhid.c文件(如果是新版STM32cubemx生成的工程的話,已經可以直接在工程里修改CUSTOM_HID_FS_BINTERVAL了,該宏就是這里使用的宏,如果你是用新版STM32Cubemx,并在里面修改了CUSTOM_HID_FS_BINTERVAL,這里不做修改都行,因為新版生成的項目這里直接就是使用CUSTOM_HID_FS_BINTERVAL的宏,你修改了CUSTOM_HID_FS_BINTERVAL的宏這里就跟著修改了)。


__ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_CfgDesc[USB_CUSTOM_HID_CONFIG_DESC_SIZ] __ALIGN_END =

{

 ....

 ....


  0x20,          /*bInterval: Polling Interval (20 ms)*/


  /* 34 */


 ....

 ....


  0x20,/* bInterval: Polling Interval (20 ms) */


  /* 41 */

}


這兩個地方隨心來改,最小可以改到0x01。這就快很多啦。到這里數據傳輸準備工作就做好了,下面我們先來說一下USB發送:


  先定義個發送BUFF:


uint8_t send_buf[64] = {//定義一個USB的發送BUFF

                         1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,

                         17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,

                         40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64}; 

  再包括發送函數頭文件以及聲明一個外部定義:


#include 'usbd_customhid.h' //包括發送函數頭文件

extern USBD_HandleTypeDef hUsbDeviceFS; //外部聲明USB的句柄

  現在可以在main函數里添加發送代碼了,我這里設置按一下按鍵就發送一次,同時led亮1s:


  while (1)

  {

    /* USER CODE BEGIN 3 */

        if(HAL_GPIO_ReadPin(GPIOE,k1_Pin)==0)

        {    

            //按鍵消抖

            while(HAL_GPIO_ReadPin(GPIOE,k1_Pin)==0);

            //點亮指示燈

            HAL_GPIO_WritePin(GPIOE,led1_Pin,GPIO_PIN_RESET);

[1] [2]
關鍵字:STM32  Cubemx  數據收發 引用地址:STM32 使用Cubemx 建一個USB(HID)設備下位機,實現數據收發

上一篇:STM32使用HAL庫實現ADC單通道轉換
下一篇:STM32 Cubemx 輸出可調頻率與占空比的PWM

0

推薦閱讀最新更新時間:2025-04-10 10:47

CubeMX配置stm32的DAC
我們使用 STM32CubeMX 軟件進行配置。DAC 的配置是相對很簡單的,如下圖所示: 選擇兩個輸出通道,其中 External Trigger 選項為是否選擇 外部中斷EXTI9 觸發,如下圖所示: DAC 的基本設置,很簡單,對于博主使用的 STM32L151 來說就只有2個選項: DAC選擇了輸出緩存,可以用來減少輸出阻抗,無需外部運放即可直接驅動外部負載。但是輸出的電壓沒法低于20mv。 不使能輸出緩存,DAC可以輸出低于20mv的信號。 對于其他型號的 DAC ,可能還會有下面兩個選項: Wave generation mode 波形生成模式:可選三角波發生器 ( Triangle wave genera
[單片機]
<font color='red'>CubeMX</font>配置<font color='red'>stm32</font>的DAC
STM32】STM32CubeMX教程--功能介紹
功能介紹: 我們首先看下CubeMx的主界面,模塊分類大體是這樣,我們接下來一一講解。 已存在工程 Open Existing Projects:打開項目工程 新建工程 ·Start My project from MCU:從MCU開始我的項目 ·Start My project from STBoard:從ST開發板開始我的項目 ·Start My project from Cross Selector:從交叉選擇器啟動我的項目 軟件包管理 ·CHECK FOR UPDATE:檢查更新 ·INSTALL/REMOVE:安裝/移除
[單片機]
【<font color='red'>STM32</font>】STM32<font color='red'>CubeMX</font>教程--功能介紹
德州儀器最新收發器提升高負載 CAN 網絡的數據速率
2012 年 5 月 30 日,北京訊 日前,德州儀器 (TI) 宣布推出支持超過 1 Mbps 數據速率的 Turbo CAN 收發器系列,充分滿足目前工業 CAN 網絡對更多節點及更高數據傳輸長度不斷增長的需求。該 SN65HVD255 與 SN65HVD256 器件提供短時間傳播延遲及快速環路時間,不但支持更高數據速率,而且還可提升這些系統的定時裕量。上述器件延繼了 TI 的 CAN 創新,可提供源于 SN65HVD251 與 SN65HVD1050 收發器的新一代設計路徑。 與同類競爭產品相比,SN65HVD255 與 SN65HVD256 可提供傳輸數據主計時功能、欠壓鎖定以及 +/-12 kV 人體模式 (HBM)
[工業控制]
STM32CubeMX學習筆記(21)——DAC接口使用(輸出模擬音頻波形)
一、DAC簡介 DAC(Digital-to-Analog Converter),即數字/模擬轉換模塊,故名思議,它的作用就是把輸入的數字編碼,轉換成對應的模擬電壓輸出,它的功能與 ADC 相反。在常見的數字信號系統中,大部分傳感器信號被化成電壓信號,而 ADC 把電壓模擬信號轉換成易于計算機存儲、處理的數字編碼,由計算機處理完成后,再由 DAC 輸出電壓模擬信號,該電壓模擬信號常用來驅動某些執行器件,使人類易于感知。如音頻信號的采集及還原就是這樣一個過程。 STM32 具有片上 DAC 外設,它的分辨率可配置為 8 位或 12 位的數字輸入信號,具有兩個 DAC 輸出通道,這兩個通道互不影響,每個通道都可以使用 DMA 功能,
[單片機]
STM32CubeMX學習筆記(6)——USART串口使用
一、USART簡介 通用同步異步收發器(Universal Synchronous Asynchronous Receiver and Transmitter)是一個串行通信設備,可以靈活地與外部設備進行全雙工數據交換。有別于 USART 還有一個 UART(Universal Asynchronous Receiver and Transmitter),它是在 USART 基礎上裁剪掉了同步通信功能,只有異步通信。簡單區分同步和異步就是看通信時需不需要對外提供時鐘輸出,我們平時用的串口通信基本都是 UART。 串行通信一般是以幀格式傳輸數據,即是一幀一幀的傳輸,每幀包含有起始信號、數據信息、停止信息,可能還有校驗信息。USAR
[單片機]
STM32CubeMx圖形化配置工具的主要特征與安裝教程
STM32CubeMx簡介 STM32CubeMX 是意法半導體推出的圖形化配置工具, 通過傻瓜化的操作便能實現相關配置, 最終能夠生成 C 語言代碼, 支持多種工具鏈, 比如 MDK、 IARFor ARM、 TrueStudio 等。 STM32CubeMx主要特征 1. 直觀的 STM32 微控制器和微處理器選擇 2. 豐富易用的圖形用戶界面, 可配置 3. 具有自動解決沖突的引腳排列 4. 外設和中間層功能模式與參數約束的動態驗證 Arm?Cortex?-M 核心 5. 具有動態驗證配置的時鐘樹 6. 帶有估計功耗結果的電源序列 7. 初始化 C 代碼生成項目, 符合 IAR?, Keil?和 GCC 編譯, 運行 ARM
[單片機]
STM32<font color='red'>CubeMx</font>圖形化配置工具的主要特征與安裝教程
STM32CubeMX 之 CAN通訊
一、CAN總線簡介 CAN是控制器局域網絡(Controller Area Network,CAN)的簡稱,是由以研發和生產汽車電子產品著稱的德國BOSCH公司開發的,是國際上應用最廣泛的現場總線之一。 CAN控制器通過組成總線的2根線(CAN-H和CAN-L)的電位差來確定總線的電平,信號是以兩線之間的“差分”電壓形式出現,這點與RS485類似,但兩者電平值不同。CAN總線電平分為顯性電平和隱性電平。 CAN總線采用兩種互補的邏輯數值“顯性”和“隱性”。其中,“顯性”數值表示邏輯“0”,而“隱性”表示邏輯“1”。 當總線上同時出現“顯性”位和“隱性”位時,最終呈現在總線上的是“顯性”位。 在“隱性”狀態下,VCAN_
[單片機]
STM32CubeMX知識點
System Core RCC 高速外部時鐘(HSE)選擇: 旁路時鐘源(BYPASS Clock Source) : 也就是外部時鐘源 石英/陶瓷 晶振(Crystal/Ceramic Resonator) SYS SYS模塊主要為調試選項 Serial Wire : 通過SWD協議下載調試 JTAG : 通過JTAG協議下載調試 Trace Asynchonous Sw : SWD協議追蹤功能 JTAG with Trace Synchro : JTAG協議追蹤功能
[單片機]
STM32<font color='red'>CubeMX</font>知識點
添点儿料...
无论热点新闻、行业分析、技术干货……
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 类乌齐县| 安顺市| 太原市| 万宁市| 白河县| 革吉县| 鄂尔多斯市| 徐水县| 尼勒克县| 乌拉特前旗| 东乡县| 静宁县| 丽水市| 新乐市| 会同县| 霍州市| 浠水县| 乌鲁木齐市| 林口县| 花莲市| 闸北区| 通城县| 成安县| 红安县| 申扎县| 青阳县| 大新县| 合阳县| 乌鲁木齐县| 丰台区| 大连市| 仙游县| 阳信县| 长沙市| 乡城县| 洛浦县| 西盟| 浮山县| 灵寿县| 宾川县| 白朗县|