Arduino on Ch32V305

这篇介绍如何使用 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开发环境并不完善,很多需要自己摸索。