代码地址:nucleo-stm32h503rb
在上一篇开发贴,已经实现了手势检测。
进一步开发USB,实现手势控制PPT翻页。
STM32CUBE已经配置了一路USB:
至此USB底层的读写便已经被配置好了,接下来就是选择用哪一个USB协议栈。在STM32CUBE上可以选择,前提是需要勾选THREADX。
目前代码里面有BabyOS, 再添加一个THREADX感觉乱七八糟的。还是将工程整的精简点,使用TinyUSB。
最新的TinyUSB mater分支的代码支持了STM32H5,岂不正好。
BabyOS增加第三方代码TinyUSB和USB软件模块,这里对代码不详细介绍,感兴趣的可以看源码:
为了让TinyUSB使用更加简单,便封装了两个接口。下面看mian.c里面的实现:
逻辑比较单一:
任务A: 每500ms检测一次手势,当有left和right手势时,告诉任务B发送键盘信息HID_KEY_ARROW_LEFT和HID_KEY_ARROW_RIGHT
任务B:等着任务A的消息,然后发送键盘按键指令给电脑,用于给PPT翻页。
检测手势:
PT_THREAD(GestureTask)(struct pt *pt, void *arg) { uint16_t result = 0; uint8_t msg = 0; static uint8_t led_f = 0; static int bGestureFd = -1; B_TASK_INIT_BEGIN(); bGestureFd = bOpen(bPAJ7620U2, BCORE_FLAG_R); B_TASK_INIT_END(); PT_BEGIN(pt); while (1) { bTaskDelayMs(pt, 500); bHalGpioWritePin(B_HAL_GPIOA, B_HAL_PIN5, led_f); led_f = led_f ? 0 : 1; if (bRead(bGestureFd, (uint8_t *)&result, 2) == 2) { if (result & PAJ7620U2_READ_GESTURE_LEFT) { msg = 0; b_log("PAJ7620U2_READ_GESTURE_LEFT \r\n"); bQueuePutNonblock(bMsgQId, &msg); } else if (result & PAJ7620U2_READ_GESTURE_RIGHT) { msg = 1; b_log("PAJ7620U2_READ_GESTURE_RIGHT \r\n"); bQueuePutNonblock(bMsgQId, &msg); } } } PT_END(pt); }
发送键盘消息:
extern tusb_desc_device_t const desc_device; extern uint8_t *desc_hid_report_table[]; extern uint8_t *desc_config_table[]; PT_THREAD(USBTask)(struct pt *pt, void *arg) { uint8_t msg = 0; uint8_t keycode[6] = {0}; B_TASK_INIT_BEGIN(); bUSBInit((uint8_t *)&desc_device, &desc_config_table[0], 1, NULL, 0); bUSBHidSetReportDescrip(&desc_hid_report_table[0], 1); B_TASK_INIT_END(); PT_BEGIN(pt); while (1) { if (bQueueGetCount(bMsgQId) > 0) { if (0 == bQueueGetNonblock(bMsgQId, &msg)) { keycode[0] = (msg == 0) ? HID_KEY_ARROW_LEFT : HID_KEY_ARROW_RIGHT; tud_hid_keyboard_report(0, 0, keycode); bTaskDelayMs(pt, 200); tud_hid_keyboard_report(0, 0, NULL); bTaskDelayMs(pt, 200); } } bTaskDelayMs(pt, 5); } PT_END(pt); }
另外TinyUSB已经对USB的中断进行了处理,所以STM32CUBEMX生成的代码,USB中断服务函数需要屏蔽,然后增加如下代码:
void USB_DRD_FS_IRQHandler(void) { bHalItInvoke(B_HAL_IT_USB, 0, NULL); }
至此便可以上电体验:
演示视频:
【通过手势控制PPT切换页面】 https://www.bilibili.com/video/BV19t421w7et/?share_source=copy_web&vd_source=358f4f81f2c6b5f79b885e03eb3b1bbc