你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
wsadnm55 提问时间:2018-12-30 13:15 /
本帖最后由 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[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =    下面输入报告描述符:
        设置中的“USBD_CUSTOM_HID_REPORT_DESC_SIZE”  与此处对应。

  • __ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __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                     */
  • };

[color=rgb(51, 102, 153) !important]复制代码



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 */
  • }

[color=rgb(51, 102, 153) !important]复制代码



下载、调试:

已经有输出了。

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[65];
  •   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;
  •   }

[color=rgb(51, 102, 153) !important]复制代码



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


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

收藏 2 评论7 发布时间:2018-12-30 13:15

举报

7个回答
STM1024 回答时间:2018-12-30 20:08:48
你这配色简直丧心病狂
wsadnm55 回答时间:2018-12-30 13:15:58
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

大哥你转贴也不说一下的。。。。

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版