一.背景
最近黑神话悟空很火,奈何手残,躲白衣躲不过,手边正好有个STM32F407VET6,准备用脚踏开关做一个简易键盘,用脚踩shift键加速,这样同时按shift+A时就不感到别扭了。
二.需要硬件
1.ST-Link+杜邦线(烧录用)。
2.STM32(需要带USB硬件和数据线),我用的STM32F407VET6。
3.一台电脑。
4.一个脚踏开关。
三.需要软件
1.STM32CUBEIDE
四.硬件图纸和接线
1.我的STM32核心原理图用到部分如下图所示:
这里可以看到,外接高速晶振频率为8MHZ,低速时钟晶振频率为32.768KHZ。
2.脚踏开关接线如图:
这里假设PE4接的K0为脚踏开关。
3.调试接口如图:
我用的ST-LINK v2,SWD模式下只需接4根线,接线方式为:
ST-LINK V2 | STM32 |
---|---|
SWCLK | PA14/TCK |
SWDIO | PA13/TMS |
3.3V | 3.3V |
GND | GND |
五.STM32CUBEIDE配置
1.GPIO配置
首先找到PE4(可以手输查找)即脚踏开关的接的位置,配置如图:
即上拉输入(不输入时默认为高电平),定义为KEY0。
2.RCC配置
3.SYS配置
这里显示与PE4冲突,后期开关可以接在其它口。
4.USB配置
如下面两张图即可
USB_OTG_FS:
USB_DEVICE:
5.时钟配置
六.程序部分
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
最后,编译并下载到单片机,运行试试吧。