455|4

6891

帖子

9

TA的资源

版主

楼主
 

【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;
  • }
  • /* Create the usbx_hid_thread_entry */
  • 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;
  • }
  • /* Create the event flags group */
  • 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));
  • }
  • }

        请注意,在发送完相应的键值之后,务必再次发送一个空值,否则将会导致按键持续处于被按下的状态。观察可知,每当按下一次按键,便能顺利实现一次页面的向下翻动单键操作。

这里我们可通过网页版键盘测试工具查看:https://www.zfrontier.com/lab/keyboardTester,效果如下:

此帖出自stm32/stm8论坛

最新回复

这样再做一个按键,就可以做成CTRL+CV键盘了,很实用啊   详情 回复 发表于 2025-2-9 17:01
点赞 关注
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 

回复
举报

7196

帖子

11

TA的资源

版主

沙发
 

这是需要移植USB驱动的前题下,才能实现键盘的功能吧。

此帖出自stm32/stm8论坛

点评

上一片先实现USB的枚举,直接就识别成键盘   详情 回复 发表于 2025-2-1 08:24
 
 

回复

6891

帖子

9

TA的资源

版主

板凳
 
lugl4313820 发表于 2025-1-30 08:22 这是需要移植USB驱动的前题下,才能实现键盘的功能吧。

上一片先实现USB的枚举,直接就识别成键盘 

此帖出自stm32/stm8论坛
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 

回复

196

帖子

1

TA的资源

一粒金砂(高级)

4
 

这样再做一个按键,就可以做成CTRL+CV键盘了,很实用啊

此帖出自stm32/stm8论坛

点评

电子森林的活动我就准备做这个,换一种按键操作方式,一个手势实现CTRL+C,另一个手势CTRL+V  详情 回复 发表于 2025-2-10 09:25
 
个人签名

没用比没有强

 
 

回复

6891

帖子

9

TA的资源

版主

5
 
电子烂人 发表于 2025-2-9 17:01 这样再做一个按键,就可以做成CTRL+CV键盘了,很实用啊

电子森林的活动我就准备做这个,换一种按键操作方式,一个手势实现CTRL+C,另一个手势CTRL+V

此帖出自stm32/stm8论坛
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播 | AI之眼——安森美图像传感器 报名中
直播时间:2025年4月25日(周五)上午10:00-11:30
直播主题:AI之眼——安森美图像传感器
报名观看直播、直播间提问、填写问卷均有机会获得精美礼品!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 12

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表