代码地址: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
我要赚赏金
