【NUCLEO H533RE测评】通过按键实现键盘单键功能
[复制链接]
前面对板卡的基本基本功能测试中我们基本使用了按键的的板载外设,这里我们就用这个按键模拟键盘的中的其中一个按键,以一知百,其他只要不断增加按键,理论上就可以了,板载的按键使用的是PC13引脚,本章节主要是对按键采集后的USB上传数据的处理。
我们采用外部中断的方式进行按键采集,每当按键按下的时候处理一次:
使用STM32Cube直接对引脚进行操作,配置为“GPIO_EXTI 13”;
进行引脚的具体配置,本次不用更改,这个需要是硬件情况决定,本板卡上的按键是上升沿触发的,已经外部下拉的电阻;
在“NVIC”中开启外部中断;
上面可以是我们正常配置的基本流程,不过这个开发板已经都配置完成了,我们只要处理一下回调函数就可以了:
- void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
- {
- if(GPIO_Pin == GPIO_PIN_13)
- {/* KEY */
- if(Button_State == 0)
- Button_State = 1;
- }
- }
接下来是通过USB发送键值的命令,我们就通过板载按键来模拟PgDn。
我们首先设计键值命令程序:
- uint8_t keyboard[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
-
- void GetKeyboardData(UX_SLAVE_CLASS_HID_EVENT *hid_event,uint8_t key)
- {
- uint32_t i;
- keyboard[2] = key;
- hid_event->ux_device_class_hid_event_length = 8;
- for(i=0;i<8;i++)
- {
- hid_event->ux_device_class_hid_event_buffer[i] = keyboard[i];
- }
- }
-
- void ClearKeyboardData(UX_SLAVE_CLASS_HID_EVENT *hid_event)
- {
- uint32_t i;
- hid_event->ux_device_class_hid_event_length = 8;
- for(i=0;i<8;i++)
- {
- hid_event->ux_device_class_hid_event_buffer[i] = 0;
- }
- }
我们创建了两个幅值程序,主要通过keyboard[]数组的修改,进而写入ux_device_class_hid_event_buffer[2]来实现按键上报的数据结构,主要修改的是keyboard[2],最终实现修改的内容如下:
- GetKeyboardData(&hid_event,0x4B);
- ux_device_class_hid_event_set(hid_keyboard, &hid_event);
- HAL_Delay(20);
- ClearKeyboardData(&hid_event);
- ux_device_class_hid_event_set(hid_keyboard, &hid_event);
- Button_State = 0;
在这里我们实现的是PgUp按键的实现,对应数据为0x4B,相关键值编码可以查看键值编码表,通过中断采集到按键后进行处理,这里我们可以添加一个线程去单独处理,也可以在自动生成的tx_app_thread_entry线程中处理,这里我们从新建立了一个新的线程:
- if (tx_byte_allocate(byte_pool, (VOID **) &pointer, UX_DEVICE_APP_THREAD_STACK_SIZE,
- TX_NO_WAIT) != TX_SUCCESS)
- {
- return TX_POOL_ERROR;
- }
-
- if (tx_thread_create(&ux_hid_thread, "hid_usbx_app_thread_entry", usbx_hid_thread_entry,
- 1, pointer, UX_DEVICE_APP_THREAD_STACK_SIZE, 20,
- 20, 1,TX_AUTO_START) != TX_SUCCESS)
- {
- return TX_THREAD_ERROR;
- }
-
- if (tx_event_flags_create(&EventFlag, "Event Flag") != TX_SUCCESS)
- {
- return TX_GROUP_ERROR;
- }
-
然后在对应的usbx_hid_thread_entry进行处理:
- VOID usbx_hid_thread_entry(ULONG thread_input)
- {
- UX_SLAVE_DEVICE *device;
- UX_SLAVE_CLASS_HID_EVENT hid_event;
- TX_PARAMETER_NOT_USED(thread_input);
- device = &_ux_system_slave->ux_system_slave_device;
-
- while(1)
- {
- if(device->ux_slave_device_state == UX_DEVICE_CONFIGURED && hid_keyboard != UX_NULL)
- {
- tx_thread_sleep(MS_TO_TICK(10));
-
- if(Button_State == 1)
- {
- GetKeyboardData(&hid_event,0x4B);
- ux_device_class_hid_event_set(hid_keyboard, &hid_event);
- HAL_Delay(20);
- ClearKeyboardData(&hid_event);
- ux_device_class_hid_event_set(hid_keyboard, &hid_event);
- Button_State = 0;
- }
- }
- else
- {
- tx_thread_sleep(MS_TO_TICK(10));
- }
-
- }
请注意,在发送完相应的键值之后,务必再次发送一个空值,否则将会导致按键持续处于被按下的状态。观察可知,每当按下一次按键,便能顺利实现一次页面的向下翻动单键操作。
|