基于STM32的键盘程序

一.背景

最近黑神话悟空很火,奈何手残,躲白衣躲不过,手边正好有个STM32F407VET6,准备用脚踏开关做一个简易键盘,用脚踩shift键加速,这样同时按shift+A时就不感到别扭了。

二.需要硬件

1.ST-Link+杜邦线(烧录用)。

2.STM32(需要带USB硬件和数据线),我用的STM32F407VET6。

3.一台电脑。

4.一个脚踏开关。

三.需要软件

1.STM32CUBEIDE

四.硬件图纸和接线

1.我的STM32核心原理图用到部分如下图所示:

fe0f6d225828439da306181d45fc3fdb.png这里可以看到,外接高速晶振频率为8MHZ,低速时钟晶振频率为32.768KHZ。

2.脚踏开关接线如图:

2d87587ae6b242aab7d61e2fa94ad58a.png

这里假设PE4接的K0为脚踏开关。

3.调试接口如图:

eb392ec9b6944ca4aa4ad7cc04385e17.png

我用的ST-LINK v2,SWD模式下只需接4根线,接线方式为:

ST-LINK V2STM32
SWCLKPA14/TCK
SWDIOPA13/TMS
3.3V3.3V
GNDGND

五.STM32CUBEIDE配置

1.GPIO配置

首先找到PE4(可以手输查找)即脚踏开关的接的位置,配置如图:

bdbc6945d8614d8b8f7479411c764387.png

即上拉输入(不输入时默认为高电平),定义为KEY0。

2.RCC配置

3.SYS配置

这里显示与PE4冲突,后期开关可以接在其它口。

4.USB配置

如下面两张图即可

USB_OTG_FS:

31933de40b8344189aa9add6bcd884d2.png

USB_DEVICE:

95832ae2a67d4301b356fedcef1283aa.png

5.时钟配置

2e23bdff190045db8d32f28d349b290e.png

六.程序部分

1.main.c

/* USER CODE BEGIN Includes */
#include "usbd_hid.h"
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
extern USBD_HandleTypeDef hUsbDeviceFS;
/* USER CODE END PV */
  /* USER CODE BEGIN 2 */
  uint8_t report_press[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  /* USER CODE END 2 */
while (1)
  {
	  if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==GPIO_PIN_RESET)//如果K0按下
	  {
		  report_press[0]=0x02;
	  }
	  else
	  {
		  report_press[0]=0x00;
	  }

	  USBD_HID_SendReport(&hUsbDeviceFS,(uint8_t*)&report_press,8);
	  HAL_Delay(15);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

2.usbd_hid.c

 0x01,                              /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */

键盘描述符,从USB官网可以下载:

__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END =
{
		//键盘描述符
		0x05, 0x01,  // Usage Page (Generic Desktop)
		0x09, 0x06,  // Usage (Keyboard)
		0xA1, 0x01,  // Collection (Application)
		0x05, 0x07,  // Usage Page (Key Codes)
		0x19, 0xE0,  // Usage Minimum (224)
		0x29, 0xE7,  // Usage Maximum (231)
		0x15, 0x00,  // Logical Minimum (0)
		0x25, 0x01,  // Logical Maximum (1)
		0x75, 0x01,  // Report Size (1)
		0x95, 0x08,  // Report Count (8)
		0x81, 0x02,  // Input (Data, Variable, Absolute); Modifier byte
		0x95, 0x01,  // Report Count (1)
		0x75, 0x08,  // Report Size (8)
		0x81, 0x01,  // Input (Constant); Reserved byte
		0x95, 0x05,  // Report Count (5)
		0x75, 0x01,  // Report Size (1)
		0x05, 0x08,  // Usage Page (Page# for LEDs)
		0x19, 0x01,  // Usage Minimum (1)
		0x29, 0x05,  // Usage Maximum (5)
		0x91, 0x02,  // Output (Data, Variable, Absolute); LED report
		0x95, 0x01,  // Report Count (1)
		0x75, 0x03,  // Report Size (3)
		0x91, 0x01,  // Output (Constant); LED report padding
		0x95, 0x06,  // Report Count (6)
		0x75, 0x08,  // Report Size (8)
		0x15, 0x00,  // Logical Minimum (0)
		0x25, 0x65,  // Logical Maximum (101)
		0x05, 0x07,  // Usage Page (Key Codes)
		0x19, 0x00,  // Usage Minimum (0)
		0x29, 0x65,  // Usage Maximum (101)
		0x81, 0x00,  // Input (Data, Array); Key arrays (6 bytes)
		0xC0        // End Collection
};

3.usbd_hid.h

#define HID_EPIN_SIZE                              0x08U
#define HID_MOUSE_REPORT_DESC_SIZE                 63U

最后,编译并下载到单片机,运行试试吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值