上一篇介紹了stm32cube的設定後
我們再來更改main.c的內容
首先是#include
因為會用到USB HS的定義,所以我們先宣告了
以及include "usbd_customhid.h"
extern USBD_HandleTypeDef hUsbDeviceHS;
#include "usbd_customhid.h"

接下來是main內的,while上開啟timer中斷
HAL_TIM_Base_Start_IT(&htim9);
以及while迴圈內開啟uart中斷

---
接下來是stm32f4xx_it.c 中斷管理方面
新增這幾行
#include "usbd_customhid.h"
extern USBD_HandleTypeDef hUsbDeviceHS;
extern uint8_t uart_got[8];
在TIM1_BRK_TIM9_IRQHandler timer9中斷那邊新增自動發送
USBD_CUSTOM_HID_SendReport(&hUsbDeviceHS,uart_got,8);
----
修改usbd_custom_hid_if.c的內容
因為我們是high speed,所以要修改CUSTOM_HID_ReportDesc_HS的內容
HID_UsagePage(0x01),
HID_Usage ( 0x05 ),
HID_Collection ( HID_Application ),
HID_LogicalMin ( 0 ),
HID_LogicalMaxS ( 1 ),
HID_PhysicalMin ( 0 ),
HID_PhysicalMaxS (1 ),
HID_ReportSize ( 1 ),
HID_ReportCount(13),
HID_UsagePage ( 0x09 ),
HID_UsageMin(0x01),
HID_UsageMax(0x0d),
HID_Input(0x02),
HID_ReportCount(0x03),
HID_Input(0x01),
HID_UsagePage(0x01),
HID_LogicalMax(0x07),
HID_PhysicalMaxS(0x3b01),
HID_ReportSize(0x04),
HID_ReportCount(0x01),
HID_Unit(0x14),
HID_Usage(0x39),
HID_Input(0x42),
HID_Unit(0x00),
HID_ReportCount(0x01),
HID_Input(0x01),
HID_LogicalMaxS(0xff00),
HID_PhysicalMaxS(0xff00),
HID_Usage(0x30),
HID_Usage(0x31),
HID_Usage(0x32),
HID_Usage(0x35),
HID_ReportSize(0x08),
HID_ReportCount(0x04),
HID_Input(0x02),
HID_UsagePage(0x00ff),
HID_Usage(0x20),
HID_ReportCount(0x01),
HID_Input(0x02),
HID_Usage(0x2126),
HID_ReportCount(0x08),
HID_Output(0x02),![]()
因為是參考我之前寫得文章HAL庫,但是我又懶得改
所以你會看到一堆錯誤
解決方法是把那些define給叫出來吧
開啟usbd_custom_hid_if.h
找個user_code begin新增
// HID Request Codes
#define HID_REQUEST_GET_REPORT 0x01U
#define HID_REQUEST_GET_IDLE 0x02U
#define HID_REQUEST_GET_PROTOCOL 0x03U
#define HID_REQUEST_SET_REPORT 0x09U
#define HID_REQUEST_SET_IDLE 0x0AU
#define HID_REQUEST_SET_PROTOCOL 0x0BU
// HID Report Types
#define HID_REPORT_INPUT 0x01U
#define HID_REPORT_OUTPUT 0x02U
#define HID_REPORT_FEATURE 0x03U
// Usage Pages
#define HID_USAGE_PAGE_UNDEFINED 0x00U
#define HID_USAGE_PAGE_GENERIC 0x01U
#define HID_USAGE_PAGE_SIMULATION 0x02U
#define HID_USAGE_PAGE_VR 0x03U
#define HID_USAGE_PAGE_SPORT 0x04U
#define HID_USAGE_PAGE_GAME 0x05U
#define HID_USAGE_PAGE_DEV_CONTROLS 0x06U
#define HID_USAGE_PAGE_KEYBOARD 0x07U
#define HID_USAGE_PAGE_LED 0x08U
#define HID_USAGE_PAGE_BUTTON 0x09U
#define HID_USAGE_PAGE_ORDINAL 0x0AU
#define HID_USAGE_PAGE_TELEPHONY 0x0BU
#define HID_USAGE_PAGE_CONSUMER 0x0CU
#define HID_USAGE_PAGE_DIGITIZER 0x0DU
#define HID_USAGE_PAGE_UNICODE 0x10U
#define HID_USAGE_PAGE_ALPHANUMERIC 0x14U
// ...
// Generic Desktop Page (0x01)
#define HID_USAGE_GENERIC_POINTER 0x01U
#define HID_USAGE_GENERIC_MOUSE 0x02U
#define HID_USAGE_GENERIC_JOYSTICK 0x04U
#define HID_USAGE_GENERIC_GAMEPAD 0x05U
#define HID_USAGE_GENERIC_KEYBOARD 0x06U
#define HID_USAGE_GENERIC_KEYPAD 0x07U
#define HID_USAGE_GENERIC_X 0x30U
#define HID_USAGE_GENERIC_Y 0x31U
#define HID_USAGE_GENERIC_Z 0x32U
#define HID_USAGE_GENERIC_RX 0x33U
#define HID_USAGE_GENERIC_RY 0x34U
#define HID_USAGE_GENERIC_RZ 0x35U
#define HID_USAGE_GENERIC_SLIDER 0x36U
#define HID_USAGE_GENERIC_DIAL 0x37U
#define HID_USAGE_GENERIC_WHEEL 0x38U
#define HID_USAGE_GENERIC_HATSWITCH 0x39U
#define HID_USAGE_GENERIC_COUNTED_BUFFER 0x3AU
#define HID_USAGE_GENERIC_BYTE_COUNT 0x3BU
#define HID_USAGE_GENERIC_MOTION_WAKEUP 0x3CU
#define HID_USAGE_GENERIC_VX 0x40U
#define HID_USAGE_GENERIC_VY 0x41U
#define HID_USAGE_GENERIC_VZ 0x42U
#define HID_USAGE_GENERIC_VBRX 0x43U
#define HID_USAGE_GENERIC_VBRY 0x44U
#define HID_USAGE_GENERIC_VBRZ 0x45U
#define HID_USAGE_GENERIC_VNO 0x46U
#define HID_USAGE_GENERIC_SYSTEM_CTL 0x80U
#define HID_USAGE_GENERIC_SYSCTL_POWER 0x81U
#define HID_USAGE_GENERIC_SYSCTL_SLEEP 0x82U
#define HID_USAGE_GENERIC_SYSCTL_WAKE 0x83U
#define HID_USAGE_GENERIC_SYSCTL_CONTEXT_MENU 0x84U
#define HID_USAGE_GENERIC_SYSCTL_MAIN_MENU 0x85U
#define HID_USAGE_GENERIC_SYSCTL_APP_MENU 0x86U
#define HID_USAGE_GENERIC_SYSCTL_HELP_MENU 0x87U
#define HID_USAGE_GENERIC_SYSCTL_MENU_EXIT 0x88U
#define HID_USAGE_GENERIC_SYSCTL_MENU_SELECT 0x89U
#define HID_USAGE_GENERIC_SYSCTL_MENU_RIGHT 0x8AU
#define HID_USAGE_GENERIC_SYSCTL_MENU_LEFT 0x8BU
#define HID_USAGE_GENERIC_SYSCTL_MENU_UP 0x8CU
#define HID_USAGE_GENERIC_SYSCTL_MENU_DOWN 0x8DU
// ...
// Simulation Controls Page (0x02)
// ...
#define HID_USAGE_SIMULATION_RUDDER 0xBAU
#define HID_USAGE_SIMULATION_THROTTLE 0xBBU
// ...
// Virtual Reality Controls Page (0x03)
// ...
// Sport Controls Page (0x04)
// ...
// Game Controls Page (0x05)
// ...
// Generic Device Controls Page (0x06)
// ...
// Keyboard/Keypad Page (0x07)
// Keyboard Usage Keys
extern const unsigned char HID_KEYBOARD_ID_TO_ASCII[];
// Error "Keys"
#define HID_USAGE_KEYBOARD_NOEVENT 0x00U
#define HID_USAGE_KEYBOARD_ROLLOVER 0x01U
#define HID_USAGE_KEYBOARD_POSTFAIL 0x02U
#define HID_USAGE_KEYBOARD_UNDEFINED 0x03U
// Letters
#define HID_USAGE_KEYBOARD_aA 0x04U
#define HID_USAGE_KEYBOARD_zZ 0x1DU
// Numbers
#define HID_USAGE_KEYBOARD_ONE 0x1EU
#define HID_USAGE_KEYBOARD_ZERO 0x27U
#define HID_USAGE_KEYBOARD_RETURN 0x28U
#define HID_USAGE_KEYBOARD_ESCAPE 0x29U
#define HID_USAGE_KEYBOARD_DELETE 0x2AU
// Funtion Keys
#define HID_USAGE_KEYBOARD_F1 0x3AU
#define HID_USAGE_KEYBOARD_F12 0x45U
#define HID_USAGE_KEYBOARD_PRINT_SCREEN 0x46U
// Modifier Keys
#define HID_USAGE_KEYBOARD_LCTRL 0xE0U
#define HID_USAGE_KEYBOARD_LSHFT 0xE1U
#define HID_USAGE_KEYBOARD_LALT 0xE2U
#define HID_USAGE_KEYBOARD_LGUI 0xE3U
#define HID_USAGE_KEYBOARD_RCTRL 0xE4U
#define HID_USAGE_KEYBOARD_RSHFT 0xE5U
#define HID_USAGE_KEYBOARD_RALT 0xE6U
#define HID_USAGE_KEYBOARD_RGUI 0xE7U
#define HID_USAGE_KEYBOARD_SCROLL_LOCK 0x47U
#define HID_USAGE_KEYBOARD_NUM_LOCK 0x53U
#define HID_USAGE_KEYBOARD_CAPS_LOCK 0x39U
// Modifier Keys (values)
#define HID_USAGE_KEYBOARD_MOD_LCTRL 0x01U
#define HID_USAGE_KEYBOARD_MOD_LSHIFT 0x02U
#define HID_USAGE_KEYBOARD_MOD_LALTL 0x04U
#define HID_USAGE_KEYBOARD_MOD_LGUI 0x08U
#define HID_USAGE_KEYBOARD_MOD_RCTRL 0x10U
#define HID_USAGE_KEYBOARD_MOD_RSHIFT 0x20U
#define HID_USAGE_KEYBOARD_MOD_RALTL 0x40U
#define HID_USAGE_KEYBOARD_MOD_RGUI 0x80U
// ...
// LED Page (0x08)
#define HID_USAGE_LED_NUM_LOCK 0x01U
#define HID_USAGE_LED_CAPS_LOCK 0x02U
#define HID_USAGE_LED_SCROLL_LOCK 0x03U
#define HID_USAGE_LED_COMPOSE 0x04U
#define HID_USAGE_LED_KANA 0x05U
#define HID_USAGE_LED_POWER 0x06U
#define HID_USAGE_LED_SHIFT 0x07U
#define HID_USAGE_LED_DO_NOT_DISTURB 0x08U
#define HID_USAGE_LED_MUTE 0x09U
#define HID_USAGE_LED_TONE_ENABLE 0x0AU
#define HID_USAGE_LED_HIGH_CUT_FILTER 0x0BU
#define HID_USAGE_LED_LOW_CUT_FILTER 0x0CU
#define HID_USAGE_LED_EQUALIZER_ENABLE 0x0DU
#define HID_USAGE_LED_SOUND_FIELD_ON 0x0EU
#define HID_USAGE_LED_SURROUND_FIELD_ON 0x0FU
#define HID_USAGE_LED_REPEAT 0x10U
#define HID_USAGE_LED_STEREO 0x11U
#define HID_USAGE_LED_SAMPLING_RATE_DETECT 0x12U
#define HID_USAGE_LED_SPINNING 0x13U
#define HID_USAGE_LED_CAV 0x14U
#define HID_USAGE_LED_CLV 0x15U
#define HID_USAGE_LED_RECORDING_FORMAT_DET 0x16U
#define HID_USAGE_LED_OFF_HOOK 0x17U
#define HID_USAGE_LED_RING 0x18U
#define HID_USAGE_LED_MESSAGE_WAITING 0x19U
#define HID_USAGE_LED_DATA_MODE 0x1AU
#define HID_USAGE_LED_BATTERY_OPERATION 0x1BU
#define HID_USAGE_LED_BATTERY_OK 0x1CU
#define HID_USAGE_LED_BATTERY_LOW 0x1DU
#define HID_USAGE_LED_SPEAKER 0x1EU
#define HID_USAGE_LED_HEAD_SET 0x1FU
#define HID_USAGE_LED_HOLD 0x20U
#define HID_USAGE_LED_MICROPHONE 0x21U
#define HID_USAGE_LED_COVERAGE 0x22U
#define HID_USAGE_LED_NIGHT_MODE 0x23U
#define HID_USAGE_LED_SEND_CALLS 0x24U
#define HID_USAGE_LED_CALL_PICKUP 0x25U
#define HID_USAGE_LED_CONFERENCE 0x26U
#define HID_USAGE_LED_STAND_BY 0x27U
#define HID_USAGE_LED_CAMERA_ON 0x28U
#define HID_USAGE_LED_CAMERA_OFF 0x29U
#define HID_USAGE_LED_ON_LINE 0x2AU
#define HID_USAGE_LED_OFF_LINE 0x2BU
#define HID_USAGE_LED_BUSY 0x2CU
#define HID_USAGE_LED_READY 0x2DU
#define HID_USAGE_LED_PAPER_OUT 0x2EU
#define HID_USAGE_LED_PAPER_JAM 0x2FU
#define HID_USAGE_LED_REMOTE 0x30U
#define HID_USAGE_LED_FORWARD 0x31U
#define HID_USAGE_LED_REVERSE 0x32U
#define HID_USAGE_LED_STOP 0x33U
#define HID_USAGE_LED_REWIND 0x34U
#define HID_USAGE_LED_FAST_FORWARD 0x35U
#define HID_USAGE_LED_PLAY 0x36U
#define HID_USAGE_LED_PAUSE 0x37U
#define HID_USAGE_LED_RECORD 0x38U
#define HID_USAGE_LED_ERROR 0x39U
#define HID_USAGE_LED_SELECTED_INDICATOR 0x3AU
#define HID_USAGE_LED_IN_USE_INDICATOR 0x3BU
#define HID_USAGE_LED_MULTI_MODE_INDICATOR 0x3CU
#define HID_USAGE_LED_INDICATOR_ON 0x3DU
#define HID_USAGE_LED_INDICATOR_FLASH 0x3EU
#define HID_USAGE_LED_INDICATOR_SLOW_BLINK 0x3FU
#define HID_USAGE_LED_INDICATOR_FAST_BLINK 0x40U
#define HID_USAGE_LED_INDICATOR_OFF 0x41U
#define HID_USAGE_LED_FLASH_ON_TIME 0x42U
#define HID_USAGE_LED_SLOW_BLINK_ON_TIME 0x43U
#define HID_USAGE_LED_SLOW_BLINK_OFF_TIME 0x44U
#define HID_USAGE_LED_FAST_BLINK_ON_TIME 0x45U
#define HID_USAGE_LED_FAST_BLINK_OFF_TIME 0x46U
#define HID_USAGE_LED_INDICATOR_COLOR 0x47U
#define HID_USAGE_LED_RED 0x48U
#define HID_USAGE_LED_GREEN 0x49U
#define HID_USAGE_LED_AMBER 0x4AU
#define HID_USAGE_LED_GENERIC_INDICATOR 0x4BU
// Button Page (0x09)
// There is no need to label these usages.
// Ordinal Page (0x0A)
// There is no need to label these usages.
// Telephony Device Page (0x0B)
#define HID_USAGE_TELEPHONY_PHONE 0x01U
#define HID_USAGE_TELEPHONY_ANSWERING_MACHINE 0x02U
#define HID_USAGE_TELEPHONY_MESSAGE_CONTROLS 0x03U
#define HID_USAGE_TELEPHONY_HANDSET 0x04U
#define HID_USAGE_TELEPHONY_HEADSET 0x05U
#define HID_USAGE_TELEPHONY_KEYPAD 0x06U
#define HID_USAGE_TELEPHONY_PROGRAMMABLE_BUTTON 0x07U
// ...
// Consumer Page (0x0C)
#define HID_USAGE_CONSUMER_CONTROL 0x01U
// ...
// and others ...
// HID Report Item Macros
// Main Items
#define HID_Input(x) 0x81U,x
#define HID_Output(x) 0x91U,x
#define HID_Feature(x) 0xB1U,x
#define HID_Collection(x) 0xA1U,x
#define HID_EndCollection 0xC0U
// Data (Input, Output, Feature)
#define HID_Data 0U
#define HID_Constant 1U << 0
#define HID_Array 0U
#define HID_Variable 1U << 1
#define HID_Absolute 0U
#define HID_Relative 1U << 2
#define HID_NoWrap 0U
#define HID_Wrap 1U << 3
#define HID_Linear 0U
#define HID_NonLinear 1U << 4
#define HID_PreferredState 0U
#define HID_NoPreferred 1U << 5
#define HID_NoNullPosition 0U
#define HID_NullState 1U << 6
#define HID_NonVolatile 0U
#define HID_Volatile 1U << 7
// Collection Data
#define HID_Physical 0x00U
#define HID_Application 0x01U
#define HID_Logical 0x02U
#define HID_Report 0x03U
#define HID_NamedArray 0x04U
#define HID_UsageSwitch 0x05U
#define HID_UsageModifier 0x06U
// Global Items
#define HID_UsagePage(x) 0x05U,x
#define HID_UsagePageVendor(x) 0x06U,x,0xFFU
#define HID_LogicalMin(x) 0x15U,x
#define HID_LogicalMinS(x) 0x16U,(x&0xFFU),((x>>8)&0xFFU)
#define HID_LogicalMinL(x) 0x17U,(x&0xFFU),((x>>8)&0xFFU),((x>>16)&0xFFU),((x>>24)&0xFFU)
#define HID_LogicalMax(x) 0x25U,x
#define HID_LogicalMaxS(x) 0x26U,(x&0xFFU),((x>>8)&0xFFU)
#define HID_LogicalMaxL(x) 0x27U,(x&0xFFU),((x>>8)&0xFFU),((x>>16)&0xFFU),((x>>24)&0xFFU)
#define HID_PhysicalMin(x) 0x35U,x
#define HID_PhysicalMinS(x) 0x36U,(x&0xFFU),((x>>8)&0xFFU)
#define HID_PhysicalMinL(x) 0x37U,(x&0xFFU),((x>>8)&0xFFU),((x>>16)&0xFFU),((x>>24)&0xFFU)
#define HID_PhysicalMax(x) 0x45U,x
#define HID_PhysicalMaxS(x) 0x46U,(x&0xFFU),((x>>8)&0xFFU)
#define HID_PhysicalMaxL(x) 0x47U,(x&0xFFU),((x>>8)&0xFFU),((x>>16)&0xFFU),((x>>24)&0xFFU)
#define HID_UnitExponent(x) 0x55U,x
#define HID_Unit(x) 0x65U,x
#define HID_UnitS(x) 0x66U,(x&0xFFU),((x>>8)&0xFFU)
#define HID_UnitL(x) 0x67U,(x&0xFFU),((x>>8)&0xFFU),((x>>16)&0xFFU),((x>>24)&0xFFU)
#define HID_ReportSize(x) 0x75U,x
#define HID_ReportSizeS(x) 0x76U,(x&0xFFU),((x>>8)&0xFFU)
#define HID_ReportSizeL(x) 0x77U,(x&0xFFU),((x>>8)&0xFFU),((x>>16)&0xFFU),((x>>24)&0xFFU)
#define HID_ReportID(x) 0x85U,x
#define HID_ReportCount(x) 0x95U,x
#define HID_ReportCountS(x) 0x96U,(x&0xFFU),((x>>8)&0xFFU)
#define HID_ReportCountL(x) 0x97U,(x&0xFFU),((x>>8)&0xFFU),((x>>16)&0xFFU),((x>>24)&0xFFU)
#define HID_Push 0xA4U
#define HID_Pop 0xB4U
// Local Items
#define HID_Usage(x) 0x09U,x
#define HID_UsageMin(x) 0x19U,x
#define HID_UsageMax(x) 0x29U,x
----
接下來是usbd_customhid.h
我們要修改一些define的大小
#define CUSTOM_HID_EPIN_ADDR 0x81U
#define CUSTOM_HID_EPIN_SIZE 64U
#define CUSTOM_HID_EPOUT_ADDR 0x02U
#define CUSTOM_HID_EPOUT_SIZE 64U
#define USB_CUSTOM_HID_CONFIG_DESC_SIZ 41U
#define USB_CUSTOM_HID_DESC_SIZ 9U
#ifndef CUSTOM_HID_HS_BINTERVAL
#define CUSTOM_HID_HS_BINTERVAL 0x05U
#endif /* CUSTOM_HID_HS_BINTERVAL */
#ifndef CUSTOM_HID_FS_BINTERVAL
#define CUSTOM_HID_FS_BINTERVAL 0x05U
#endif /* CUSTOM_HID_FS_BINTERVAL */
#ifndef USBD_CUSTOMHID_OUTREPORT_BUF_SIZE
#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE 0x02U
#endif /* USBD_CUSTOMHID_OUTREPORT_BUF_SIZE */
#ifndef USBD_CUSTOM_HID_REPORT_DESC_SIZE
#define USBD_CUSTOM_HID_REPORT_DESC_SIZE 163U
#endif /* USBD_CUSTOM_HID_REPORT_DESC_SIZE */
#define CUSTOM_HID_DESCRIPTOR_TYPE 0x21U
#define CUSTOM_HID_REPORT_DESC 0x22U
#define CUSTOM_HID_REQ_SET_PROTOCOL 0x0BU
#define CUSTOM_HID_REQ_GET_PROTOCOL 0x03U
#define CUSTOM_HID_REQ_SET_IDLE 0x0AU
#define CUSTOM_HID_REQ_GET_IDLE 0x02U
#define CUSTOM_HID_REQ_SET_REPORT 0x09U
#define CUSTOM_HID_REQ_GET_REPORT 0x01U
/**
----本文尚未完成,修改中 2021/03/15 23:30----