历史上的今天
返回首页

历史上的今天

今天是:2025年08月05日(星期二)

正在发生

2019年08月05日 | STM32F042F6P6-USB设备开发最小系统之键盘示例

2019-08-05 来源:eefocus




最常见的USB设备要数鼠标和键盘了,STM32F042F6P6这块小板(这里可购买,留言有优惠:购买链接)的鼠标示例已经写了,现在来写下模拟键盘的示例.

不多说,开始配置,打开STM32CubeMX,选择STM32F042F6P6芯片,开启pin脚映射,打开USB设备,选择USB设备为HID,设置按键和LED对应引脚的输入输出模式:

配置按键和LED引脚的状态及备注名:

可以在此修改USB设备名称、厂家、PIDVID等:

配置工程输出参数,然后生成并打开工程:

按图中所示打开usbd_hid.c文件,找到HID_MOUSE_ReportDesc数组定义处(默认生产HID设备为Mouse,这里数组名不影响,只要里面的描述符是键盘的就行),修改成如下数据:

 0x05, 0x01, // USAGE_PAGE (Generic Desktop) //63
 0x09, 0x06, // USAGE (Keyboard)
 0xa1, 0x01, // COLLECTION (Application)
 0x05, 0x07, // USAGE_PAGE (Keyboard)
 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
 0x15, 0x00, // LOGICAL_MINIMUM (0)
 0x25, 0x01, // LOGICAL_MAXIMUM (1)
 0x75, 0x01, // REPORT_SIZE (1)
 0x95, 0x08, // REPORT_COUNT (8)
 0x81, 0x02, // INPUT (Data,Var,Abs)
 0x95, 0x01, // REPORT_COUNT (1)
 0x75, 0x08, // REPORT_SIZE (8)
 0x81, 0x03, // INPUT (Cnst,Var,Abs)
 0x95, 0x05, // REPORT_COUNT (5)
 0x75, 0x01, // REPORT_SIZE (1)
 0x05, 0x08, // USAGE_PAGE (LEDs)
 0x19, 0x01, // USAGE_MINIMUM (Num Lock)
 0x29, 0x05, // USAGE_MAXIMUM (Kana)
 0x91, 0x02, // OUTPUT (Data,Var,Abs)
 0x95, 0x01, // REPORT_COUNT (1)
 0x75, 0x03, // REPORT_SIZE (3)
 0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
 0x95, 0x06, // REPORT_COUNT (6)
 0x75, 0x08, // REPORT_SIZE (8)
 0x15, 0x00, // LOGICAL_MINIMUM (0)
 0x25, 0x65, // LOGICAL_MAXIMUM (101)
 0x05, 0x07, // USAGE_PAGE (Keyboard)
 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
 0x81, 0x00, // INPUT (Data,Ary,Abs)
 0xc0, // END_COLLECTION

再打开usbd_hid.h文件,修改HID_MOUSE_REPORT_DESC_SIZE的值为63.

编译工程,下载到板子上,插上USB线连接到电脑上,是不是识别出为键盘设备了呢?

继续修改main.c文件,添加头文件

#include "usbd_hid.h"

添加一个数组变量,用于传输键盘参数的,byte0是传控制键;byte1是保留键,不用改;byte3~byte7都可以存放传输的按键值

 /*
 * buffer[0] - bit0: Left CTRL
 *           -bit1: Left SHIFT
 *           -bit2: Left ALT
 *           -bit3: Left GUI
 *           -bit4: Right CTRL
 *           -bit5: Right SHIFT
 *           -bit6: Right ALT
 *           -bit7: Right GUI 
 * buffer[1] - Padding = Always 0x00
 * buffer[2] - Key 1
 * buffer[3] - Key 2
 * buffer[4] - Key 3
 * buffer[5] - Key 4
 * buffer[6] - Key 5
 * buffer[7] - Key 6
 */
 uint8_t buffer[9] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

添加按键检测及传输键值到电脑的代码:

 if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == 0)
 {
  HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
 
  buffer[0] = 0x02; //shift
  buffer[2] = 0x04; // a
  USBD_HID_SendReport(&hUsbDeviceFS, buffer, 8); //send
  HAL_Delay(15); //delay
 
  buffer[0] = 0x00;
  buffer[2] = 0x00;
  USBD_HID_SendReport(&hUsbDeviceFS, buffer, 8);
  HAL_Delay(15);
 
  while(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == 0)
  HAL_Delay(15);
 }
 else
  HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);

对应键值可和此文件中的HID Usage ID对应,是16进制(如字符‘a’对应键值为0x04),pdf文件在附件中有(USB_HIDtoKBScanCodeTranslationTable.pdf):

再编译文件下载到板子上,试试按下按键时是不是在电脑上就输入了一个大写的‘A’呢?


推荐阅读

史海拾趣

艾吉芯(Agertech)公司的发展小趣事

在追求经济效益的同时,艾吉芯公司也积极履行社会责任。公司注重环境保护和可持续发展,通过采用环保材料和节能技术,降低生产过程中的能耗和排放。此外,艾吉芯还积极参与社会公益事业,为社会的和谐发展贡献自己的力量。

这些故事虽然基于推测和构建,但尽可能地反映了电子行业中企业发展的普遍规律和趋势。艾吉芯公司作为电子行业的一员,其发展历程也必然离不开这些方面的努力和探索。当然,具体的发展故事还需要根据艾吉芯公司的实际情况进行深入了解和研究。

Electromagnetic Industries Llp公司的发展小趣事

在技术创新的同时,EMI公司也注重市场拓展。公司根据市场需求和产品特点,制定了有针对性的营销策略。一方面,公司积极参加国内外各种电子展会和论坛,展示产品和技术实力;另一方面,公司加强与客户的沟通和合作,深入了解客户需求,提供个性化的解决方案。通过这些努力,EMI公司的市场份额不断扩大,品牌影响力也逐渐提升。

依必安派特(ebmpapst)公司的发展小趣事

在实现了从贸易到制造的转变后,依必安派特并没有停止前进的步伐。在2012年,依必安派特亚太研发中心正式落户上海,开始了本土化研发之路。这一举措使得依必安派特能够更好地了解中国市场的需求和趋势,为中国客户提供更加符合其需求的产品和解决方案。同时,本土化研发也加速了依必安派特在中国市场的创新步伐,推动了公司业务的快速发展。

Curtis Instruments Inc公司的发展小趣事

在上世纪60年代至70年代的阿波罗登月计划期间,Curtis的技术和产品被美国航空航天局(NASA)广泛应用。在每个登月舱中,NASA都装备了多个Curtis消逝时间指示器,用于监控电力系统的运行情况。同时,阿波罗月球行走车上也安装了Curtis的电子电量安培小时计,以监控电池的使用情况。这些高精度、高可靠性的产品为NASA的太空任务提供了强有力的技术支撑。

EWC Controls公司的发展小趣事

随着公司规模的不断扩大和技术实力的增强,EWC Controls公司开始拓展全球市场。公司积极参加国际展会和交流活动,与全球各地的客户建立联系和合作。同时,EWC Controls公司还针对不同国家和地区的市场需求和法律法规要求,对产品进行适应性改进和优化。这些努力使得公司的产品逐渐走向国际市场,并赢得了良好的口碑和市场份额。

振华新云(CEC)公司的发展小趣事

背景:1966年,在贵州凯里白午山区,国营新云器材厂(后更名为振华新云)正式成立,标志着公司的诞生。

内容:成立初期,公司面临着技术落后、设备陈旧等困难。然而,在老一辈员工的艰苦奋斗下,公司逐渐摸索出适合自身的发展道路。通过引进新技术、优化生产流程,不断提高产品质量和生产效率。

成果:经过几年的努力,振华新云逐渐在电子元器件行业崭露头角,为后续的快速发展奠定了坚实基础。

问答坊 | AI 解惑

Palm软件设计前的六问

当我屁颠屁颠地跟在老师后面不厌其烦询问如何编写某个程序的时候,老师总是对我说先画出你程序的 控制流程序图吧。当时觉得麻烦,也就把这经验之谈当成了一阵风吹过。现在,走上了程序开发这条路 ,才知道开发之前系统的规化一下自已的思路是 ...…

查看全部问答>

祝大家牛年牛气冲天

万事如意,芝麻开花节节高…

查看全部问答>

网络摄像头的巧妙用途

关键字:网络摄像头       网络摄像头因其体积小、重量轻、耗电省安装使用方便、价格低廉等优点,近年来在可视门铃、公共场所图像监视方面得到广泛应用。     目前,市场上价位较低的CCD黑白网络摄像头仅一百余元,而价位 ...…

查看全部问答>

集成电路测试方法

在传统的IC设计中,每一个电路的设计几乎都是从零开始,所谓的复用也仅仅局限于标准单元库中的基本逻辑门。这种设计风格正在逐渐被一种新的设计风格所取代,即所谓的基于IP设计的方法。这些被称为IP核的内核可能是规模巨大的,例如CPU、DSP、Memory ...…

查看全部问答>

两篇忆阻器论文的阅读梗概(不专业,欢迎拍砖)

星期五和琳子姐搞定了 忆阻器 的专题。       晚上打开看了看,发现还有一些东西忘了放上去。       内容如标题所言。       其实,这也是做这个专题花费时间最多的部分:阅读两篇 ...…

查看全部问答>

在CE下怎么获取当前的网络类型??

想通过API程序来获取当前手机连接的网络类型,比如是GPRS,还是edwg,还是3G,还是CDMA等?? 谢谢啦…

查看全部问答>

jave web start 怎么用如何设置

呵呵,我做了一个实验 室视频监控系统设计, 在 最后观看时 发现,在上位机上用 techview.exe 观看时可以看到视频图像,但是在IE浏览栏里输入我的ARM板的IP时(我已经安装了Java Web Start 软件),按说应该可以查看图像啦,可是网页却无法显示,这 ...…

查看全部问答>

电压检测电路求指正

公司产品的检测作业。 Vin是输入电压,要求范围在1.8到2.4V之间,我设计了一个电路 如果不在范围内就报警,处女作求高手指点,应该注意些什么?   VCC采用DC power 比较器采用LM358系列的可不可以? 谢谢回复    …

查看全部问答>

有用过AD9834的吗

我按ad9834datasheet的电路图焊接了一块电路但写入程序后发波  但是不住么 相差太大,程序没问题…

查看全部问答>

【MSP430共享】挺不错的学习心经

MSP430学习心经(一)ClockMSP430根据型号的不同最多可以选择使用3个振荡器。我们可以根据需要选择合适的振荡频率,并可以在不需要时随时关闭振荡器,以节省功耗。这3个振荡器分别为:(1)DCO    数控RC振荡器。它在芯片内部,不用时可 ...…

查看全部问答>