这篇介绍如何使用 Arduino 在Ch32V305上编写代码,不过需要明确的一点是:目前对于Ch32V30X系列 Arduino 支持还并不完善,在使用时会遇到各种各样的问题。
项目地址在 https://github.com/openwch/arduino_core_ch32 。
首先,将这个项目加入到"Additional Boards Managers URLs" 中:
接下来在 Board Manger 中搜索安装这个板子:
之后就可以进行使用了。
原始的库并不支持 USB 设备,这里需要我们直接编程:
#include "src\\userUsbKB\\ch32v30x_usbhs_device.h"
#include "src\\userUsbKB\\usbd_composite_km.h"
uint8_t KeyPress[8] = {0x08, 0, 0, 0, 0, 0, 0, 0};
uint8_t KeyRelease[8] = {0, 0, 0, 0, 0, 0, 0, 0};
void setup() {
Serial.begin(115200);
Serial.println("Start");
pinMode(D18, INPUT_PULLUP);
/* Initialize system configuration */
SystemCoreClockUpdate( );
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 );
//Delay_Init( );
/* Initialize USBHS interface to communicate with the host */
USBHS_RCC_Init( );
USBHS_Device_Init( ENABLE );
USB_Sleep_Wakeup_CFG( );
}
unsigned long PressElsp = 0;
unsigned long ReleaseElsp = 0;
void loop() {
if ( USBHS_DevEnumStatus )
{
/* Handle keyboard lighting */
KB_LED_Handle( );
if ((digitalRead(D18) == LOW) && (PressElsp == 0) &&(millis()-ReleaseElsp>100)) {
USBHS_Endp_DataUp( DEF_UEP1, KeyPress, sizeof( KeyPress ), DEF_UEP_CPY_LOAD );
PressElsp = millis();
Serial.println("a");
}
if ((PressElsp != 0) && (millis() - PressElsp > 1000)) {
USBHS_Endp_DataUp( DEF_UEP1, KeyRelease, sizeof( KeyRelease ), DEF_UEP_CPY_LOAD );
PressElsp = 0;
ReleaseElsp=millis();
Serial.println("b");
}
}
}
关键的代码如下,简单的说就是如果D18 触发,那么就发送键盘数据给PC,相当于按下了 Win键;1秒之后,再发送全为0的数据包,这个相当于发送抬起信息:
if ((digitalRead(D18) == LOW) && (PressElsp == 0) &&(millis()-ReleaseElsp>100)) {
USBHS_Endp_DataUp( DEF_UEP1, KeyPress, sizeof( KeyPress ), DEF_UEP_CPY_LOAD );
PressElsp = millis();
Serial.println("a");
}
if ((PressElsp != 0) && (millis() - PressElsp > 1000)) {
USBHS_Endp_DataUp( DEF_UEP1, KeyRelease, sizeof( KeyRelease ), DEF_UEP_CPY_LOAD );
PressElsp = 0;
ReleaseElsp=millis();
Serial.println("b");
}
有兴趣的朋友不妨尝试一下这个芯片,主要的优点是:速度足够快(最高 144Mhz),资源比较多(128KB Flash,32K 内存),体积小(TSSOP20封装),内置了USB High Speed (真 2.0)。目前的缺点是 Arduino开发环境并不完善,很多需要自己摸索。