前言
此章將客製HID的report用來控制 音量大/小聲,靜音等..
1. STM32CubeMX
一開始的步驟是先建立HID project(預設的是一個endporint 3鍵4個bytes的滑鼠)
勾選USB功能
勾選USB Role Device(FS)。有的MCU型號支援HOST/Device/OTG
設定不做修改
勾選USB_DEVICE,選擇Human Interface Device Class(HID)
- HID_FS_BINTERVAL:主機讀取設備的時間間隔
- USBD_MAX_NUM_INTERFACE:支援的endpointer數量
- 這些參數都將存在 usbd_conf.h
Clock Configuration裡,F072的USB時脈使用APB1,改為48Mhz
2. HID Descriptor
Usage Page設為Consumer 0x0C,
Usage分別加入 增加音量/減少音量/靜音/播放或暫停/下一首/上一首/播放/暫停 8個功能
把新的descriptor覆蓋HID_MOUSE_ReportDesc[]內容
usbd_hid.c
0x05, 0x0C, // Usage Page (Consumer)
0x09, 0x01, // Usage (Consumer Control)
0xA1, 0x01, // Collection (Application)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x09, 0xE9, // Usage (Volume Increment)
0x09, 0xEA, // Usage (Volume Decrement)
0x09, 0xE2, // Usage (Mute)
0x09, 0xCD, // Usage (Play/Pause)
0x09, 0xB5, // Usage (Scan Next Track)
0x09, 0xB6, // Usage (Scan Previous Track)
0x09, 0xB0, // Usage (Play)
0x09, 0xB7, // Usage (Stop)
0x75, 0x01, // Report Size (1)
0x95, 0x08, // Report Count (16)
0x81, 0x42, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,Null State)
0xC0, // End Collection
修改interface protocol USBD_HID_CfgFSDesc[]為 0:none
usbd_hid.c
__ALIGN_BEGIN static uint8_t USBD_HID_CfgFSDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_END =
{
0x00, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
}
usbd_hid.h
#define HID_EPIN_SIZE 1U
#define HID_MOUSE_REPORT_DESC_SIZE 33U
main.c
應用功能,接下User button(PA0)時 增加音量Volume Up
1 byte 8個bit的功能定義
- bit 0:音量增加
- bit 1:音量減少
- bit 2:靜音
- bit 3:播放/暫停
- bit 4:下一首
- bit 5:上一首
- bit 6:播放
- bit 7:暫停
#include "usbd_hid.h"
int main(void)
{
extern USBD_HandleTypeDef hUsbDeviceFS;
uint8_t data[2];
while(1)
{
if(HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin) == 1)
{
// Volume +1
data[0] = 0x01;
USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&data, 1);
HAL_Delay(15);
data[0] = 0x00;
USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&data, 1);
HAL_Delay(300);
}
}
}