基于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檔案

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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/299250.html
標籤:其他
