Ch32x033 Arduino 环境USB 键盘开发

2024-02-155366
AI 快速预览详细 收起
本文介绍了如何在Ch32X033板子上实现USB键盘每隔一段时间输入字符的功能。首先需要安装ch32x035的Arduino支持,然后编写代码并加入官方示例代码来实现USB功能。通过将按键数据放置在Buffer中,并使用USBFS_Endp_DataUp()函数发送出去,可以实现USB键盘功能。这个Demo还并不完善,最好的状态是类似Arduino Leonardo,用面向对象的方法将所需要的完整封装起来,更便于使用。
目前已经有 Ch32x035 Arduino 开发环境,在 https://github.com/openwch/arduino_core_ch32可以看到。美中不足的是这套环境中没有提供 USB 的支持。经过研究可以在代码中加入官方示例代码来实现 USB 功能。这次演示的是在 Ch32X033 板子上实现USB键盘每隔一段时间输入字符的功能。
第一步,按照上面提到的方法安装ch32x035Arduino支持;
第二步,编写代码。这里参考了Ch55xduino的方法,创建了 src 目录,然后在这个目录中再创建userUsbKB目录,对于 USB 支持的代码都在其中。基本上相当于将 WCH 官方例子文件都放置在此。
最后,编写Arduino代码。基本想法是:将按键数据放置在 Buffer 中,然后使用USBFS_Endp_DataUp()函数即可发送出去。
  1. #include "src\\userUsbKB\\usbdKBMS.h"
  2. uint8_t  Buffer[ 8 ];
  3. long int Elsp;
  4. boolean Flag=true;
  5. void setup() {
  6.   Serial2.begin(115200);
  7.   delay(500);
  8.   /* Usb Init */
  9.   USBFS_RCC_Init();
  10.   USBFS_Device_Init( ENABLE , PWR_VDD_SupplyVoltage( ));
  11.   USB_Sleep_Wakeup_CFG( );
  12.   Elsp=millis();
  13. }
  14. void loop() {
  15.   /* Determine if enumeration is complete, perform data transfer if completed */
  16. //Serial.println(millis());
  17.   if ( USBFS_DevEnumStatus )
  18.   {
  19.     //Serial.println(millis());
  20.     /* Handle keyboard scan data */
  21.     KB_Scan_Handle(  );
  22.     /* Handle keyboard lighting */
  23.     KB_LED_Handle( );
  24.     /* Handle mouse scan data */
  25.     MS_Scan_Handle( );
  26.     /* Handle USART2 receiving data */
  27.     USART2_Receive_Handle( );
  28.     if ((millis()-Elsp>5000)&&(Flag)) {
  29.         Buffer[2]=0x0F; //"L"
  30.         Buffer[3]=0x04; //"A"
  31.         Buffer[4]=0x05; //"B"
  32.         Buffer[5]=0x2D; //"-"
  33.         Buffer[6]=0x1D; //"Z"
  34.         
  35.         USBFS_Endp_DataUp( DEF_UEP1, Buffer, sizeof( Buffer ), DEF_UEP_CPY_LOAD );
  36.         memset(Buffer,0,sizeof(Buffer));
  37.         Serial2.println("Send press");
  38.         Flag=false;
  39.       }
  40.     if (millis()-Elsp>5010) {
  41.         USBFS_Endp_DataUp( DEF_UEP1, Buffer, sizeof( Buffer ), DEF_UEP_CPY_LOAD );
  42.         Serial2.println("Send Release");
  43.         Elsp=millis();
  44.         Flag=true;
  45.       }
  46.   }
  47. }
复制代码
这个只是一个简单的Demo还并不完善,最好的状态是类似 Arduino Leonardo ,用面向对象的方法将所需要的完整封装起来这样才更便于使用。



创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(1)
zoologist
zoologist
作者
- 没有更多了 -