天天看點

DIY一個usb數字鍵盤(一) 基于stm32cubemx HAL庫 usb hid協定前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定開發環境STM32cubemx初始化GPIOhid 描述符keil代碼編寫非常重要的一點就是要及時彈出下一篇

基于HAL庫的自制usb數字鍵盤 (一)

  • 前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定
  • 開發環境
  • STM32cubemx初始化
    • 經典時鐘
    • 經典 swd
    • 5ms的 tim2 (這個時間很重要,記住)(可自行修改)
  • GPIO
    • 勾上usb
    • custom hid
      • 參數
  • hid 描述符
  • keil代碼編寫
    • 參數修改
    • 複制封包
    • 資料發送
  • 非常重要的一點就是要及時彈出
  • 下一篇

前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定

邏輯代碼部分:基于HAL庫的自制usb數字鍵盤 (二)邏輯部分

類似文章:usb 搖桿

開發環境

單片機:stm32f103c8t6

軟體 :keil (編寫代碼),stm32cubemx(初始化),HID Descriptor tool(生成封包),usb bound(抓包)

STM32cubemx初始化

經典時鐘

DIY一個usb數字鍵盤(一) 基于stm32cubemx HAL庫 usb hid協定前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定開發環境STM32cubemx初始化GPIOhid 描述符keil代碼編寫非常重要的一點就是要及時彈出下一篇
DIY一個usb數字鍵盤(一) 基于stm32cubemx HAL庫 usb hid協定前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定開發環境STM32cubemx初始化GPIOhid 描述符keil代碼編寫非常重要的一點就是要及時彈出下一篇

經典 swd

DIY一個usb數字鍵盤(一) 基于stm32cubemx HAL庫 usb hid協定前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定開發環境STM32cubemx初始化GPIOhid 描述符keil代碼編寫非常重要的一點就是要及時彈出下一篇

5ms的 tim2 (這個時間很重要,記住)(可自行修改)

勾上中斷

DIY一個usb數字鍵盤(一) 基于stm32cubemx HAL庫 usb hid協定前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定開發環境STM32cubemx初始化GPIOhid 描述符keil代碼編寫非常重要的一點就是要及時彈出下一篇

GPIO

我沒寫矩陣掃描,最簡單的每個按鍵對應一個gpio ,當然可改成矩陣,(相信看到這的大佬都會)

DIY一個usb數字鍵盤(一) 基于stm32cubemx HAL庫 usb hid協定前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定開發環境STM32cubemx初始化GPIOhid 描述符keil代碼編寫非常重要的一點就是要及時彈出下一篇
DIY一個usb數字鍵盤(一) 基于stm32cubemx HAL庫 usb hid協定前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定開發環境STM32cubemx初始化GPIOhid 描述符keil代碼編寫非常重要的一點就是要及時彈出下一篇

勾上usb

DIY一個usb數字鍵盤(一) 基于stm32cubemx HAL庫 usb hid協定前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定開發環境STM32cubemx初始化GPIOhid 描述符keil代碼編寫非常重要的一點就是要及時彈出下一篇

custom hid

DIY一個usb數字鍵盤(一) 基于stm32cubemx HAL庫 usb hid協定前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定開發環境STM32cubemx初始化GPIOhid 描述符keil代碼編寫非常重要的一點就是要及時彈出下一篇

參數

ps:提前說明,一下參數可以在keil 工程裡面修改

第一個參數 很重要

  • 可以解釋為,stm32 将資料發送到一個緩存區,而不是直接發送到 上位機(pc端),而上位機,每隔一端時間會來通路緩沖區,讀取資料。而這個讀取時間間隔就是第一個參數。這也是為什麼定時器要設定為5ms,過快會導緻,多次資料發送,過慢,會導緻資料丢失
  • custom_hid_fs_BINTFRVAL

第二個參數

封包個數

  • 封包就是 下位機向上位機,解釋自己是啥東西,有啥功能,資料格式,等等的非常重要的參數

第三個參數

輸出緩存,選最大

第四個參數

最大支援的hid 裝置的接口數,應為現在隻有鍵盤,是以1就行,

如果是需要,同時鍵盤,滑鼠,搖桿啥的,根據數量選擇即可

後面參數保持預設即可

DIY一個usb數字鍵盤(一) 基于stm32cubemx HAL庫 usb hid協定前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定開發環境STM32cubemx初始化GPIOhid 描述符keil代碼編寫非常重要的一點就是要及時彈出下一篇

這些都是,接入電腦後的名稱參數等,不該也行

DIY一個usb數字鍵盤(一) 基于stm32cubemx HAL庫 usb hid協定前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定開發環境STM32cubemx初始化GPIOhid 描述符keil代碼編寫非常重要的一點就是要及時彈出下一篇

最後主要 usb的時鐘 48M

DIY一個usb數字鍵盤(一) 基于stm32cubemx HAL庫 usb hid協定前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定開發環境STM32cubemx初始化GPIOhid 描述符keil代碼編寫非常重要的一點就是要及時彈出下一篇

然後生成初始化代碼

hid 描述符

可以看這篇文章做了解

具體,我其實也隻是一知半解,這裡說明隻是我個人的了解。(大佬輕噴)

DIY一個usb數字鍵盤(一) 基于stm32cubemx HAL庫 usb hid協定前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定開發環境STM32cubemx初始化GPIOhid 描述符keil代碼編寫非常重要的一點就是要及時彈出下一篇
  • 第一個參數:描述這是 一般桌面控制裝置 用途頁
  • 第二個參數:描述 這是鍵盤
  • 第三個參數:資料包的收集開始,鍵盤屬于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裡 的封包位元組 參數設定

    DIY一個usb數字鍵盤(一) 基于stm32cubemx HAL庫 usb hid協定前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定開發環境STM32cubemx初始化GPIOhid 描述符keil代碼編寫非常重要的一點就是要及時彈出下一篇
    選擇 Save As ,記得儲存成 .h檔案
    DIY一個usb數字鍵盤(一) 基于stm32cubemx HAL庫 usb hid協定前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定開發環境STM32cubemx初始化GPIOhid 描述符keil代碼編寫非常重要的一點就是要及時彈出下一篇

keil代碼編寫

參數修改

在usbd_conf.h中可以修改

DIY一個usb數字鍵盤(一) 基于stm32cubemx HAL庫 usb hid協定前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定開發環境STM32cubemx初始化GPIOhid 描述符keil代碼編寫非常重要的一點就是要及時彈出下一篇

複制封包

在usbd_custom_hid_if.c

DIY一個usb數字鍵盤(一) 基于stm32cubemx HAL庫 usb hid協定前言:在代碼實作部分,我在下一篇文章講解,本文會較為詳細的講一下基本設定和協定設定開發環境STM32cubemx初始化GPIOhid 描述符keil代碼編寫非常重要的一點就是要及時彈出下一篇

資料發送

在使用到 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

繼續閱讀