前面对板卡的基本信息进行了介绍,板载的按键使用的是PC13引脚,本章节主要是对按键采集的处理。
我们采用外部中断的方式进行按键采集,每当按键按下的时候处理一次:
使用STM32Cube直接对引脚进行操作,配置为“GPIO_EXTI 13”;
进行引脚的具体配置,本次不用更改,这个需要是硬件情况决定,本板卡上的按键是上升沿出发的,已经外部下拉的电阻;
在“NVIC”中开启外部中断;
可以看到,在MX_GPIO_Init(void)中已经开启了响应的中断;
接下来我们就要编写中断处理函数了,HAL库使用的方式都是通过回调函数处理的且这些回调函数都是若定义的,我们需要找到正确的回调函数在main中重新编写就可以了:
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == GPIO_PIN_13) {/* KEY */ if(uesr_key_state == 0) uesr_key_state = 1; } } }
接下来是通过USB发送键值的命令,我们就通过板载按键来模拟PgDn。
我们首先设计键值命令程序:
UINT uesr_key_cnt; static VOID GetPointerData(UX_SLAVE_CLASS_HID_EVENT *hid_event) { ux_utility_memory_set(&hid_event, 0, sizeof(UX_SLAVE_CLASS_HID_EVENT)); hid_event->ux_device_class_hid_event_length = 8; hid_event->ux_device_class_hid_event_buffer[0] = 0; hid_event->ux_device_class_hid_event_buffer[1] = 0; switch(uesr_key_cnt) { case 4: hid_event->ux_device_class_hid_event_buffer[2] = 0x04; break; case 5: hid_event->ux_device_class_hid_event_buffer[2] = 0x4B; break; case 6: hid_event->ux_device_class_hid_event_buffer[2] = 0x4E; break; default: hid_event->ux_device_class_hid_event_buffer[2] = 0; break; } }
我们通过uesr_key_cnt进行键值的判断,通过ux_device_class_hid_event_buffer[2]的赋值修改就可以实现不同按键的实现,在这里我暂时添加了3个键值(0x04对应a,0x4B对应PgDn,0x4E对应PgUp,其他键值可参考键值编码表)。
接下来编写按键处理程序,我们在中断中将uesr_key_state标志位进行了更改,这个时候我们在tx_app_thread_entry(ULONG thread_input)中进行状态的处理,这个是我们之前建立的一个应用处理线程:
void tx_app_thread_entry(ULONG thread_input) { /* USER CODE BEGIN tx_app_thread_entry */ UX_SLAVE_CLASS_HID_EVENT hid_event; ux_utility_memory_set(&hid_event, 0, sizeof(UX_SLAVE_CLASS_HID_EVENT)); while(1) { if(uesr_key_state == 1) { uesr_key_cnt = 6; GetPointerData(&hid_event); ux_device_class_hid_event_set(hid_keyboard, &hid_event); uesr_key_state = 2; } else if(uesr_key_state == 2) { uesr_key_state = 0; uesr_key_cnt = 0; GetPointerData(&hid_event); ux_device_class_hid_event_set(hid_keyboard, &hid_event); } tx_thread_sleep(1); } /* USER CODE END tx_app_thread_entry */ }
注意我们发送完对应的键值后要再发送一次空,不然会一直处于按下的状态。可以看到每按下一次按键就能实现一次向下翻页的效果,按键实现翻页功能成功。