wsadnm55 发表于 2018-12-30 13:15:07

用STM32Cube简单实现自定义USB HID通信(实现步骤,无理论。)


本帖最后由 icevel 于 2015-8-20 12:50 编辑

简单的用HID通信,本人不懂USB协议,只是想在一个项目中用HID代替串口,在网上找了一些例子,都需要搞懂USB协议,于是尝试用STM32Cube实现,适合拿过来就用。

0、开发环境:
      自己做的STM32F072RB的板子
      STM32CubeMX4.9.0+STM32CubeF0 Firmware Package V1.3.0
      IAR 7.2
1、建立、配置工程:
      打开STM32Cube,选择好器件
      打开USB Device(FS)
      选择要使用的其它功能,我打开了USART1用于输出数据
      在Middlewares里面选择Custom HID
      
      

      配置好时钟,我选择的时钟源是HSI48

      配置USB:      设备描述页默认即可,需要修改"Parameter Settings",将USBD_CUSTOM_HID_REPORT_DESC_SIZE 设置为33(此处33和程序中设备描述符对应)
                        USBD_CUSTOMHID_OUTREPORT_BUF_SIZE 修改为64 ,输出节点的buffer大小,也就是每次发送数据的最大字节数。
      
2、生成代码
      用STM32Cube生成代码。      
3、修改代码实现发送
      修改usbd_custom_hid_if.c:
      在__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS __ALIGN_END =    下面输入报告描述符:
      设置中的“USBD_CUSTOM_HID_REPORT_DESC_SIZE”与此处对应。


[*]__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS __ALIGN_END =
[*]{
[*]/* USER CODE BEGIN 0 */
[*]//#ifdef 0
[*]0x05, 0x8c, /* USAGE_PAGE (ST Page) */
[*]0x09, 0x01, /* USAGE (Demo Kit) */
[*]0xa1, 0x01, /* COLLECTION (Application) */
[*]/* 6 */
[*]
[*]// The Input report
[*]0x09,0x03, // USAGE ID - Vendor defined
[*]0x15,0x00, // LOGICAL_MINIMUM (0)
[*]0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255)
[*]0x75,0x08, // REPORT_SIZE (8)
[*]0x95,0x40, // REPORT_COUNT (40)
[*]0x81,0x02, // INPUT (Data,Var,Abs)
[*]//19
[*]// The Output report
[*]0x09,0x04, // USAGE ID - Vendor defined
[*]0x15,0x00, // LOGICAL_MINIMUM (0)
[*]0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255)
[*]0x75,0x08, // REPORT_SIZE (8)
[*]0x95,0x40, // REPORT_COUNT (40)
[*]0x91,0x02, // OUTPUT (Data,Var,Abs)
[*]//32
[*]/* USER CODE END 0 */
[*]0xC0    /*   END_COLLECTION                     */
[*]
[*]};

复制代码


Stm32CUBE提供的API函数为“USBD_CUSTOM_HID_SendReport” ,直接调用即可:

[*]int main(void)
[*]{
[*]
[*]/* USER CODE BEGIN 1 */
[*]uint8_t HID_Buffer[]={"Hello,HID!~"};
[*]/* USER CODE END 1 */
[*]
[*]/* MCU Configuration----------------------------------------------------------*/
[*]
[*]/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
[*]HAL_Init();
[*]
[*]/* Configure the system clock */
[*]SystemClock_Config();
[*]
[*]/* Initialize all configured peripherals */
[*]MX_GPIO_Init();
[*]MX_USART1_UART_Init();
[*]MX_USB_DEVICE_Init();
[*]
[*]/* USER CODE BEGIN 2 */
[*]printf("init_OK!\r\n");
[*]/* USER CODE END 2 */
[*]
[*]/* Infinite loop */
[*]/* USER CODE BEGIN WHILE */
[*]while (1)
[*]{
[*]/* USER CODE END WHILE */
[*]
[*]/* USER CODE BEGIN 3 */
[*]USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, HID_Buffer,65);
[*]HAL_Delay(500);
[*]}
[*]/* USER CODE END 3 */
[*]
[*]}

复制代码


下载、调试:

已经有输出了。

4、修改代码实现接收:
      修改文件“usbd_custom_hid_if.c”,在函数“CUSTOM_HID_OutEvent_FS” 内加入数据处理代码即可:

[*]static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state)
[*]{
[*]/* USER CODE BEGIN 6 */
[*]USBD_CUSTOM_HID_HandleTypeDef   *hhid;
[*]hhid = (USBD_CUSTOM_HID_HandleTypeDef*) hUsbDeviceFS.pClassData;
[*]uint8_t rx_buf;
[*]printf("%s",hhid->Report_buf);
[*]switch(event_idx)
[*]{
[*]case 1: /* LED1 */
[*]    (state == 1) ? LED(1) : LED_off(1);
[*]    break;
[*]case 2: /* LED2 */
[*]    (state == 1) ? LED(2) : LED_off(2);
[*]    break;
[*]case 3: /* LED3 */
[*]    (state == 1) ? LED(3) : LED_off(3);
[*]    break;
[*]case 4: /* LED4 */
[*]    (state == 1) ? LED(4) : LED_off(4);
[*]    break;
[*]
[*]default:
[*]    LED_all(0x00);
[*]    break;
[*]}

复制代码


      下载、调试:
      
      可以用BusHound查看数据:
      


不是专职开发软件的,有时候玩玩,STM32Cube还是很方便的,只是有时候资料和文档不全,需要自己慢慢摸索。

STM1024 发表于 2018-12-30 20:08:48

你这配色简直丧心病狂

wsadnm55 发表于 2018-12-30 13:15:58

:lol:lol

LN 发表于 2018-12-30 21:05:57

颜色配的不友好,灰色看不清

middle1102 发表于 2019-8-26 10:50:13

签到,签到

你不想去那儿 发表于 2020-3-18 00:00:33

配色感人:(

waiman 发表于 2020-3-18 23:34:46

是不是患有异常三色视觉?

icevel 发表于 2022-5-12 13:31:06

大哥你转贴也不说一下的。。。。
页: [1]
查看完整版本: 用STM32Cube简单实现自定义USB HID通信(实现步骤,无理论。)