基于HAL庫的自制usb數字鍵盤 (一)
- 前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定
- 開發環境
- STM32cubemx初始化
-
- 經典時鐘
- 經典 swd
- 5ms的 tim2 (這個時間很重要,記住)(可自行修改)
- GPIO
-
- 勾上usb
- custom hid
-
- 參數
- hid 描述符
- keil代碼編寫
-
- 參數修改
- 複制封包
- 資料發送
- 非常重要的一點就是要及時彈出
- 下一篇
前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定
邏輯代碼部分:基于HAL庫的自制usb數字鍵盤 (二)邏輯部分
類似文章:usb 搖桿
開發環境
單片機:stm32f103c8t6
軟體 :keil (編寫代碼),stm32cubemx(初始化),HID Descriptor tool(生成封包),usb bound(抓包)
STM32cubemx初始化
經典時鐘

經典 swd
5ms的 tim2 (這個時間很重要,記住)(可自行修改)
勾上中斷
GPIO
我沒寫矩陣掃描,最簡單的每個按鍵對應一個gpio ,當然可改成矩陣,(相信看到這的大佬都會)
勾上usb
custom hid
參數
ps:提前說明,一下參數可以在keil 工程裡面修改
第一個參數 很重要
- 可以解釋為,stm32 将資料發送到一個緩存區,而不是直接發送到 上位機(pc端),而上位機,每隔一端時間會來通路緩沖區,讀取資料。而這個讀取時間間隔就是第一個參數。這也是為什麼定時器要設定為5ms,過快會導緻,多次資料發送,過慢,會導緻資料丢失
- custom_hid_fs_BINTFRVAL
第二個參數
封包個數
- 封包就是 下位機向上位機,解釋自己是啥東西,有啥功能,資料格式,等等的非常重要的參數
第三個參數
輸出緩存,選最大
第四個參數
最大支援的hid 裝置的接口數,應為現在隻有鍵盤,是以1就行,
如果是需要,同時鍵盤,滑鼠,搖桿啥的,根據數量選擇即可
後面參數保持預設即可
這些都是,接入電腦後的名稱參數等,不該也行
最後主要 usb的時鐘 48M
然後生成初始化代碼
hid 描述符
可以看這篇文章做了解
具體,我其實也隻是一知半解,這裡說明隻是我個人的了解。(大佬輕噴)
- 第一個參數:描述這是 一般桌面控制裝置 用途頁
- 第二個參數:描述 這是鍵盤
- 第三個參數:資料包的收集開始,鍵盤屬于Application,(協定規定)
- 第四個參數:描述這是 鍵盤的用途頁
- 第五個參數:聲明接下來的參數最小值為 0
- 第五個參數:聲明接下來的參數最小值為 0
- 第六個參數:聲明 資料代表的按鍵從 keypad 1 and End 開始
-
第七個參數:聲明 資料代表的按鍵到 keypad 0 and Insert 結束
(這裡意思是我要 用 這10個按鍵)
- 第八個參數:聲明 資料代表的按鍵到 keypad 0 and Insert 結束
- 第九個參數:這 裡每個資料 為 1 位 (1位元組 8位)
- 第十個參數:共有 10 個這樣 1 位的資料 代表十個按鍵
- 第11個參數: 這十個資料的類型 (上面那篇文章有細講)
- 第12,13 ,14個參數:為了湊成兩位元組 16位,補上 6位 常量
-
第15個參數 :資料包收集結束
總共 29個位元組,可以往上看,之前stm32cubemx裡 的封包位元組 參數設定
選擇 Save As ,記得儲存成 .h檔案DIY一個usb數字鍵盤(一) 基于stm32cubemx HAL庫 usb hid協定前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定開發環境STM32cubemx初始化GPIOhid 描述符keil代碼編寫非常重要的一點就是要及時彈出下一篇 DIY一個usb數字鍵盤(一) 基于stm32cubemx HAL庫 usb hid協定前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定開發環境STM32cubemx初始化GPIOhid 描述符keil代碼編寫非常重要的一點就是要及時彈出下一篇
keil代碼編寫
參數修改
在usbd_conf.h中可以修改
複制封包
在usbd_custom_hid_if.c
資料發送
在使用到 USBD_CUSTOM_HID_SendReport()的函數前加上 頭檔案和 句柄聲明
例:
#include "usbd_customhid.h"
extern USBD_HandleTypeDef hUsbDeviceFS;
/*
其他代碼
*/
SBD_CUSTOM_HID_SendReport(&USB_OTG_dev, buff, 2);
非常重要的一點就是要及時彈出
因為緩存區不會自己重新整理,是以假如我們發送資料到緩存區後,沒有清 0,那麼 ,以5ms為例, 按下數字 1 後,會以每秒20個“1”列印在電腦螢幕上。
是以要及時彈出即清零
舉例:
buff[0]=0x01;
buff[1]=0x00;
USBD_CUSTOM_HID_SendReport(&USB_OTG_dev, buff, 2);
HAL_Delay(5);
buff[0]=0x00;
buff[1]=0x00;
USBD_CUSTOM_HID_SendReport(&USB_OTG_dev, buff, 2);
HAL_Delay(5);
當然實際中不會這樣 傻傻的用 delay延時
定時器會更為好用
下一篇
因為代碼部分,用了較為系統的封裝,代碼太多了,,,是以另起一篇來講,當然dalao可以忽略。。
有啥問題可留言說明。
dae::2021.9.9
autho:_zs_dawn