目前已经有 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 ,用面向对象的方法将所需要的完整封装起来这样才更便于使用。