본문 바로가기

WCH/CH32V307

CH32V307 개발환경 설정 및 GPIO 성능 테스트

CH32V307는 저렴하면서 Ethernet PHY 칩을 내장한 MCU로 Ethernet이 필요한 여러 어플리케이션에 적용하기 좋을것 같다.

 

 

우선 개발환경은 RISC-V 코어로 MounRiver용 예제코드를 사용하면 된다.

 

예제코드

https://github.com/openwch/ch32v307

 


GPIO 제어 예제 코드를 수정해서 GPIO 레지스터를 제어 해보자

MCU 성능 측정에 있어 GPIO 토글 속도를 측정하는 이유는 FTFLCD 제어 속도 테스트와 같은 GPIO로 제어 하는 주변 장치를 사용할 때 주요 성능 지표가 되기 때문이다.

void GPIO_Toggle_INIT(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

int main(void)
{
    u8 i = 0;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    SystemCoreClockUpdate();
    Delay_Init();
    
    USART_Printf_Init(115200);	
    printf("SystemClk:%d\r\n", SystemCoreClock);
    printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
    printf("GPIO Toggle TEST\r\n");
    
    GPIO_Toggle_INIT();
    while(1)
    {
        //Delay_Ms(250);

        //GPIO_SetBits(GPIOA, GPIO_Pin_0); 
        //GPIO_ResetBits(GPIOA, GPIO_Pin_0);
        GPIOA->BSHR = GPIO_Pin_0;
        GPIOA->BCR = GPIO_Pin_0;
    }
}

 

 

30ns로 측정이 된다.

 

 

약간 아쉬운 운데...

클럭 설정을 보니 96Mhz로 되어 있다.

 

CH32V307의 최대 클럭인 144Mhz 로 설정해 보자

//#define SYSCLK_FREQ_HSE    HSE_VALUE
//#define SYSCLK_FREQ_48MHz_HSE  48000000
//#define SYSCLK_FREQ_56MHz_HSE  56000000
//#define SYSCLK_FREQ_72MHz_HSE  72000000
//#define SYSCLK_FREQ_96MHz_HSE  96000000
//#define SYSCLK_FREQ_120MHz_HSE  120000000
#define SYSCLK_FREQ_144MHz_HSE  144000000

 

 

CH32V307의 GPIO 토글 속도는 20ns, 루프 수행 속도는 40ns로 측정이 된다.

 

160Mhz로 구동되는 RISC-V 코어 MCU인 ESP32-C3의 GPIO 토글 속도 110ns와 비교해 보면 상당히 빠르지만 

비슷한 가격대의 Cortex-M0코어 RP2040의 15ns(@125Mhz)와 비교하면 아쉬움이 있다.

그리고 또하나의 비슷한 가격대의 ST짝퉁(?)이라고 부르는 GigaDevice의 GD32F303 (Cortex-M4 120Mhz) 의 15ns와도 비교 하면 조금 느리다.

 

 

 

반응형