본문 바로가기

WCH/CH32V003

CH32V003 SSM - Arduino 개발환경 설정 및 MCU 성능 테스트

CH32V003은 RISC-V 코어로 다양한 라이브러리를 제공하는 Arduino 환경도 지원하고 있다. 저렴한 중국 칩이지만 나름 개념 있게 만들고 있는것 같다.

물론 아직 몇가지 지원이 안되는 라이브라리가 있는 것이 아쉬운점이긴 하지만...( 테스트 해본 결과 V1.03 기준으로 I2C, PWM은 정상 동작을 하지 않는것 같다.)

 

우선 하기 사이트에서 Arduino Core Code를 제공한다.

 

 

이후 CH32를 검색하면 CH32 MCU EVT Board를 설치 할 수 있다.

 

 

 

설치 완료후 Board 파일에서 CH3200x를 선택하면 된다.

 

 


CH32V003 GPIO 토글 속도 테스트
CH32V003의 Arduino IDE 개발환경 설정이 끝났다면 GPIO 토글 속도 측정으로 성능 측정을 해 보자
 
CH32V003 은 STM32 API 코드와 거의 유사하게 작성되어 있다. 호환성이라고 해야 하려나 배꼈다고 해야 하려나...
아무튼  기존 ST MCU 사용자 입장에서는 편리한것 같다.
 
먼저 Arduino에서 제공하는 GPIO 토글함수로 GPIO 속도를 측정해 보면

 

#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
 
반응형