这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【Let'sDo第1期任务手势翻页笔】虚拟键盘枚举的实现

共5条 1/1 1 跳转至

【Let'sDo第1期任务手势翻页笔】虚拟键盘枚举的实现

工程师
2024-07-13 17:14:10     打赏

首先硬件准备工作,需要你有两个USB-TypeC的数据线,一个用于下载使用,另一个用于USB的功能使用,下载使用的是板子的stlinkV3的芯片,和H503没有直接连在一起,所以不可能公用一个数据线,

    然后软件工作,我使用的是Carnac.exe软件,这个软件可以显示和记录键盘按下的按键动作和组合键,非常好用直观。image.png

然后最重要的就是配置USB的枚举了

  1. 配置系统时钟,SYS->TIM6


    image.png

  2. 打开USB功能,打开中断

    image.png

  3. 打开THREADX操作系统配置

    image.png

  4. 配置ThreadX的USB库

    image.png

  5. 编译生产代码ARM工程

  6. 使用keil打开工程

  7. 修改ux_device_keyboard.c代码


  1. 增加定义,并在.h里面进行声明
  2. UX_SLAVE_CLASS_HID * hid_keyboard;   //键盘设备句柄
  3. 修改USBD_HID_Keyboard_Activate()
  4. VOID USBD_HID_Keyboard_Activate(VOID *hid_instance)
    {
      /* USER CODE BEGIN USBD_HID_Keyboard_Activate */
      //UX_PARAMETER_NOT_USED(hid_instance);
    	hid_keyboard = (UX_SLAVE_CLASS_HID*)hid_instance;  //保存濿活的实例句柄
      /* USER CODE END USBD_HID_Keyboard_Activate */
    
      return;
    }

8.修改app_usbx_device.c代码:

1.增加头文件
/* USER CODE BEGIN Includes */
#include "usb.h"  
#include "paj7620.h"  
/* USER CODE END Includes */
2.增加参数定义和函数声明
/* Private variables ---------------------------------------------------------*/
static ULONG hid_keyboard_interface_number;
static ULONG hid_keyboard_configuration_number;
static UX_SLAVE_CLASS_HID_PARAMETER hid_keyboard_parameter;
static TX_THREAD ux_device_app_thread;

/* USER CODE BEGIN PV */
static TX_THREAD ux_hid_read_thread;    //添加线程的定乿

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
static VOID app_ux_device_thread_entry(ULONG thread_input);

/* USER CODE BEGIN PFP */
static VOID usbx_hidkeyboard_thread_entry(ULONG thread_input);    //函数定义
VOID USBX_APP_Device_Init(VOID); 
/* USER CODE END PFP */
3.在MX_USBX_Device_Init中增加任务
  /* USER CODE BEGIN MX_USBX_Device_Init1 */
  
  /* Allocate the stack for usbx hid  thread */  //分配栈
  if (tx_byte_allocate(byte_pool, (VOID **) &pointer, 1024, TX_NO_WAIT) != TX_SUCCESS)  
  {  
    return TX_POOL_ERROR;  
  }  
  /* Create the usbx hid thread */  
  if (tx_thread_create(&ux_hid_read_thread, "hid_acm_read_usbx_app_thread_entry",  
                       usbx_hidkeyboard_thread_entry, 1, pointer,  
                       1024, 20, 20, TX_NO_TIME_SLICE,  
                       TX_AUTO_START) != TX_SUCCESS)  
  {  
    return TX_THREAD_ERROR;  
  }  
    
  /* USER CODE END MX_USBX_Device_Init1 */
  4.增加初始化任务
  static VOID app_ux_device_thread_entry(ULONG thread_input)
{
  /* USER CODE BEGIN app_ux_device_thread_entry */
  //TX_PARAMETER_NOT_USED(thread_input);	
  //初始化USB设备  
  USBX_APP_Device_Init();  
	
  /* USER CODE END app_ux_device_thread_entry */
}
5.USBX初始化
VOID USBX_APP_Device_Init(VOID)  
{  
  /* USER CODE BEGIN USB_Device_Init_PreTreatment_0 */  
    
  /* USER CODE END USB_Device_Init_PreTreatment_0 */  
    
  /* initialize the device controller HAL driver */  
  MX_USB_PCD_Init();  
    
  /* USER CODE BEGIN USB_Device_Init_PreTreatment_1 */  
  HAL_PCDEx_PMAConfig(&hpcd_USB_DRD_FS, 0x00, PCD_SNG_BUF, 0x14);  
  HAL_PCDEx_PMAConfig(&hpcd_USB_DRD_FS, 0x80, PCD_SNG_BUF, 0x54);  
  HAL_PCDEx_PMAConfig(&hpcd_USB_DRD_FS, 0x81, PCD_SNG_BUF, 0x94);  
  HAL_PCDEx_PMAConfig(&hpcd_USB_DRD_FS, 0x01, PCD_SNG_BUF, 0xD4);  
  HAL_PCDEx_PMAConfig(&hpcd_USB_DRD_FS, 0x82, PCD_SNG_BUF, 0x114);  
    
  /* USER CODE END USB_Device_Init_PreTreatment_1 */  
    
  /* Initialize and link controller HAL driver */  
  ux_dcd_stm32_initialize((ULONG)USB_DRD_FS, (ULONG)&hpcd_USB_DRD_FS);  
    
  /* Start the USB device */  
  HAL_PCD_Start(&hpcd_USB_DRD_FS);  
    
  /* USER CODE BEGIN USB_Device_Init_PostTreatment */  
    
  /* USER CODE END USB_Device_Init_PostTreatment */  
}  
6.实现usbx hidkeyboard线程入口的函数

static VOID usbx_hidkeyboard_thread_entry(ULONG thread_input)  
{  
  /* USER CODE BEGIN app_ux_device_thread_entry */  
  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;  
  ux_utility_memory_set(&hid_event, 0, sizeof(UX_SLAVE_CLASS_HID_EVENT));  
  while(1)  
    {  
        
        hid_event.ux_device_class_hid_event_buffer[2] = 0x4B;  
        ux_device_class_hid_event_set(hid_keyboard, &hid_event);  
            
        HAL_Delay(100);  
        HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);  
    }  
    /* USER CODE END app_ux_device_thread_entry */  
}

9,编译下载,连接TypeC

在电脑设备管理器中,键盘,多出来一个设备,说明,USB功能初始化成功,因为测试一直发送0x4B,所以会一直会不停的有上翻的信号

image.png





关键词: Nucleo-64     DigiKey     手势     USB    

高工
2024-07-13 17:42:35     打赏
2楼

谢谢分享


专家
2024-07-13 18:27:21     打赏
3楼

谢谢分享


院士
2024-07-14 07:57:44     打赏
4楼

谢谢楼主的分享~!


专家
2024-07-14 09:00:21     打赏
5楼

谢谢分享


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]