CH32V003은 RISC-V 코어로 다양한 라이브러리를 제공하는 Arduino 환경도 지원하고 있다. 저렴한 중국 칩이지만 나름 개념 있게 만들고 있는것 같다.
물론 아직 몇가지 지원이 안되는 라이브라리가 있는 것이 아쉬운점이긴 하지만...( 테스트 해본 결과 V1.03 기준으로 I2C, PWM은 정상 동작을 하지 않는것 같다.)
우선 하기 사이트에서 Arduino Core Code를 제공한다.
Arduino Board 파일을 설치
먼저 보드 메이저에서 URL을 등록해 준다.
이후 CH32를 검색하면 CH32 MCU EVT Board를 설치 할 수 있다.
설치 완료후 Board 파일에서 CH3200x를 선택하면 된다.
#define PIN_OUT PD4
void setup()
{
pinMode(PIN_OUT, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
digitalWrite(LED_BUILTIN, LOW);
}
5us로 측정된다.
최대 속도르 측정하기 위해 GPIO 레지스터 제어를 해보면
void loop() {
GPIOD->BSHR = GPIO_Pin_4;
GPIOD->BCR = GPIO_Pin_4;
}
83ns로 측정되며 메인루프 수행 시간은 600ns로 측정이 된다.
48Mhz로 구동되는 STM32F0와 비교해 보면 좀 느린것 같은데...
CH32V003 MounRiver 개발환경에서 테스트 한 결과로 비교해도 느리다.
Arduino 코드를 좀더 들여다 보니 시스템 클럭 설정이 HSE 48Mhz로 되어 있다. HSE 를 사용하지 않으면 디폴트로 HSI 24Mhz로 구동이 된다고 한다.
\AppData\Local\Arduino15\packages\WCH\hardware\ch32v\1.0.3\system\CH32V00x\USER\system_ch32v00x.c 파일에서 HSI 48Mhz로 설정을 해 보자.
//#define SYSCLK_FREQ_8MHz_HSI 8000000
//#define SYSCLK_FREQ_24MHZ_HSI HSI_VALUE
#define SYSCLK_FREQ_48MHZ_HSI 48000000
//#define SYSCLK_FREQ_8MHz_HSE 8000000
//#define SYSCLK_FREQ_24MHz_HSE HSE_VALUE
//#define SYSCLK_FREQ_48MHz_HSE 48000000
HSI 48Mhz로 설정후 토글 속도가 80ns에서 40ns로 빨라졌다.
CH32V003 Arduino Variant 파일(variant_CH32V003F4.h)
디폴트로 SPI, ADC, PWM이 사용하지 않는것으로 되어 있다.
아직 테스트가 안된것인가? 플래시 메모리 용량 때문이가?
테스트결과 V1.03 기준으로 SPI, ADC는 동작 한다. 하지만 I2C나 PWM은 정상 동작을 하지 않고 있다.
/* ENABLE Peripherals */
// #define ADC_MODULE_ENABLED
#define UART_MODULE_ENABLED
// #define SPI_MODULE_ENABLED
#define I2C_MODULE_ENABLED
/* CH32V003F4 Pins */
#define PA1 PIN_A1
#define PA2 PIN_A0
#define PC0 2
#define PC1 3
#define PC2 4
#define PC3 5
#define PC4 PIN_A2
#define PC5 7
#define PC6 8
#define PC7 9
#define PD0 10
#define PD1 11
#define PD2 PIN_A3
#define PD3 PIN_A4
#define PD4 PIN_A7
#define PD5 PIN_A5
#define PD6 PIN_A6
#define PD7 17
// Alternate pins number
#define PD5_ALT1 (PD5 | ALT1)
#define PD6_ALT1 (PD6 | ALT1)
#define NUM_DIGITAL_PINS 18
#define NUM_ANALOG_INPUTS 8
// #define ADC_CTLR_ADCAL
#define ADC_RESOLUTION 10
// On-board LED pin number
#ifndef LED_BUILTIN
#define LED_BUILTIN PNUM_NOT_DEFINED
#endif
// On-board user button
#ifndef USER_BTN
#define USER_BTN PNUM_NOT_DEFINED
#endif
// UART Definitions
#ifndef SERIAL_UART_INSTANCE
#define SERIAL_UART_INSTANCE 1
#endif
// Default pin used for generic 'Serial' instance
// Mandatory for Firmata
#ifndef PIN_SERIAL_RX
#define PIN_SERIAL_RX PD6
#endif
#ifndef PIN_SERIAL_TX
#define PIN_SERIAL_TX PD5
#endif
// SPI definitions
#ifndef PIN_SPI_SS
#define PIN_SPI_SS PC4
#endif
#ifndef PIN_SPI_MOSI
#define PIN_SPI_MOSI PC6
#endif
#ifndef PIN_SPI_MISO
#define PIN_SPI_MISO PC7
#endif
#ifndef PIN_SPI_SCK
#define PIN_SPI_SCK PC5
#endif
// I2C definitions
#ifndef PIN_WIRE_SDA
#define PIN_WIRE_SDA PC1
#endif
#ifndef PIN_WIRE_SCL
#define PIN_WIRE_SCL PC2
#endif
/*----------------------------------------------------------------------------
* Arduino objects - C++ only
*----------------------------------------------------------------------------*/
#ifdef __cplusplus
// These serial port names are intended to allow libraries and architecture-neutral
// sketches to automatically default to the correct port name for a particular type
// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN,
// the first hardware serial port whose RX/TX pins are not dedicated to another use.
//
// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor
//
// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial
//
// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library
//
// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins.
//
// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX
// pins are NOT connected to anything by default.
#ifndef SERIAL_PORT_MONITOR
#define SERIAL_PORT_MONITOR Serial
#endif
#ifndef SERIAL_PORT_HARDWARE
#define SERIAL_PORT_HARDWARE Serial
#endif
#endif