Ch32x033 Arduino 环境USB 键盘开发

目前已经有 Ch32x035 的 Arduino 开发环境,在 https://github.com/openwch/arduino_core_ch32 可以看到。美中不足的是这套环境中没有提供 USB 的支持。经过研究可以在代码中加入官方示例代码来实现 USB 功能。这次演示的是在 Ch32X033 板子上实现USB 键盘每隔一段时间输入字符的功能。

第一步,按照上面提到的方法安装 ch32x035的Arduino 支持;

第二步,编写代码。这里参考了Ch55xduino 的方法,创建了 src 目录,然后在这个目录中再创建userUsbKB 目录,对于 USB 支持的代码都在其中。基本上相当于将 WCH 官方例子文件都放置在此。

最后,编写Arduino 代码。基本想法是:将按键数据放置在 Buffer 中,然后使用USBFS_Endp_DataUp() 函数即可发送出去。

#include "src\\userUsbKB\\usbdKBMS.h"

uint8_t  Buffer[ 8 ];
long int Elsp;
boolean Flag=true;

void setup() {
  Serial2.begin(115200);
  delay(500);
  /* Usb Init */
  USBFS_RCC_Init();
  USBFS_Device_Init( ENABLE , PWR_VDD_SupplyVoltage( ));
  USB_Sleep_Wakeup_CFG( );
  Elsp=millis();
}



void loop() {
  /* Determine if enumeration is complete, perform data transfer if completed */
//Serial.println(millis());
  if ( USBFS_DevEnumStatus )
  {
    //Serial.println(millis());
    /* Handle keyboard scan data */
    KB_Scan_Handle(  );

    /* Handle keyboard lighting */
    KB_LED_Handle( );

    /* Handle mouse scan data */
    MS_Scan_Handle( );

    /* Handle USART2 receiving data */
    USART2_Receive_Handle( );
    if ((millis()-Elsp>5000)&&(Flag)) {
        Buffer[2]=0x0F; //"L"
        Buffer[3]=0x04; //"A"
        Buffer[4]=0x05; //"B"
        Buffer[5]=0x2D; //"-"
        Buffer[6]=0x1D; //"Z"
        
        USBFS_Endp_DataUp( DEF_UEP1, Buffer, sizeof( Buffer ), DEF_UEP_CPY_LOAD );
        memset(Buffer,0,sizeof(Buffer));
        Serial2.println("Send press");
        Flag=false;
      } 
    if (millis()-Elsp>5010) {
        USBFS_Endp_DataUp( DEF_UEP1, Buffer, sizeof( Buffer ), DEF_UEP_CPY_LOAD );
        Serial2.println("Send Release");
        Elsp=millis();
        Flag=true;
      } 

  }
}

这个只是一个简单的Demo 还并不完善,最好的状态是类似 Arduino Leonardo ,用面向对象的方法将所需要的完整封装起来这样才更便于使用。