zoologist 发表于 2024-2-15 10:37:58

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_tBuffer[ 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=0x0F; //"L"
      Buffer=0x04; //"A"
      Buffer=0x05; //"B"
      Buffer=0x2D; //"-"
      Buffer=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 ,用面向对象的方法将所需要的完整封装起来这样才更便于使用。


zoologist 发表于 2024-2-15 17:22:47

工作的测试视频在

【CH32X035/33 Arduino USB 支持测试】
https://www.bilibili.com/video/BV15F4m1M7CV/?share_source=copy_web&vd_source=5ca375392c3dd819bfc37d4672cb6d54
页: [1]
查看完整版本: Ch32x033 Arduino 环境USB 键盘开发