GD32E230C8T6 개발보드 핸즈온 (feat. GD-Link V3)

Cover Image

최근 저렴한 MCU가 필요하게 되어 중국의 저렴이 MCU들을 테스트해 보고 있습니다.

코로나 시기 반도체 수급 불안정으로 STM32F103의 가격이 몇백 배 뛰어오를 당시, 대체제로 GD32가 주목받았던 기억이 있는데요, 이런 이유로 그나마 자주 본 GD32부터 시작해 보기로 했습니다.

260408_224336
LCSC - GigaDevice MCU 카테고리 낮은 가격순 [링크]

LCSC에서 GigaDevice의 MCU 카테고리로 들어가 낮은 가격순으로 정렬하면 제일 먼저 나오는 녀석..

260408_224616
GD32E230 너로 정했다!

260408_225544

가급적이면 GigaDevice의 정품 보드를 구하고 싶었지만, 공식 개발보드인 GD32E230x-START를 구매할 수 있는 곳이 없더라고요. 알리에서 검색했을 때 가장 많이 나오는 게 이렇게 흰색 배경에 컬러 프린팅된 보드라 이걸로 구매했습니다.

GD32E230 시리즈 #

공식 홈페이지의 설명을 읽어봤습니다.

The GD32E23x series of MCUs incorporates the ARM® Cortex®-M23 32-bit processor core operating at up to 72 MHz frequency with Flash accesses with 0 to 2 wait states to obtain maximum efficiency. It provides up to 128KB embedded Flash and up to 16KB SRAM. An extensive range of enhanced I/Os and on-chip peripherals are connected to two APB buses. The MCU series offers one 12-bit ADC and one comparator, five general 16-bit timers, a basic timer, a PWM advanced timer, as well as standard and advanced communication interfaces: up to two SPIs, two I2Cs, two USARTs, and one I2S. It operates from 1.8V to 3.6V power supply and work in the -40℃ to 85℃ temperature range. This series offers three power saving modes for optimal balance between wakeup latency and power consumption, which is an important consideration for low-power applications.

GigaDevice - GD32E23x Series Overview 중 일부 [링크]

Cortex-M23, 처음 사용해 보는 프로세서입니다. RP2040에서 봤던 Cortex-M0+의 업그레이드 버전으로 ARMv8-M Baseline 아키텍처를 사용한 비교적 최신의 프로세서라 합니다. 가장 큰 차이점은 TrustZone이긴 한데.. GD32E230은 TrustZone 지원이 빠져있습니다. 그냥 저렴한 비교적 최신 MCU라 하면 되겠네요.

Flash는 내장, ADC, 타이머, SPI, I2C, UART 등 필요한 Peripheral들은 다 달려있고, 작동전압은 1.8~3.6V로 STM32C0(2.0~3.6V)와 비교했을 때 큰 의미는 없는 것 같습니다.

The GD32E230 product line has a main frequency of up to 72MHz, and it supports up to 64KB Flash and 8KB SARM. It also integrates USART, I2C, SPI, I2S, Comparator as well as other digital and analog peripheral resources.

GigaDevice - GD32E230 Overview 중 일부 [링크]

그 중 GD32E230 시리즈는 Flash와 SRAM을 둘 다 잘라낸 라인입니다.

GD32E230xx 데이터시트 중 일부

데이터시트에서 구매한 개발보드에 박힌 MCU를 찾아봤습니다. 그나저나 C8T6.. 어디서 많이 본 네이밍.. 아무튼..

260409_210001
260409_210100

분명 처음 보는 데이터시트인데 이상하게 눈에 쏙쏙 들어옵니다 ㅋㅋ..

GD32E230C8T6 개발보드 #

이제 개발보드를 살펴봅시다.

GD32E230C8T6 개발보드 전면

LCSC로고와 GD32 로고가 보입니다.

오잉 하며 찾아보니 LCSC에서 설계해서 오픈소스로 배포한 개발보드인것 같습니다. 자회사인 JLCPCB의 멀티 컬러 실크스크린으로 꾸며진 모습입니다. 실크스크린이라 이야기하긴 하지만, 일반적인 실크스크린과 다르게 오돌토돌한 텍스쳐가 느껴집니다.

부팅모드를 선택하는 BOOT0핀은 점퍼로 뽑혀있었습니다. MCU 내장 ROM으로 부팅하면 UART로 펌웨어 Flashing이 가능합니다.

GD32E230C8T6 개발보드 후면

뒤쪽에는 LDO 같은 녀석과 CH340 IC가 박혀있습니다.

납땜한 GD32E230C8T6 개발보드

핀헤더를 납땜한 뒤 다시 한번 찍어봤습니다. 알록달록하니 이뻐 보이긴 하네요.

GD32E230C8T6 MCU
260409_212329

디버깅을 위해 공식 디버거를 같이 구매했습니다. 그나저나 GD-Link ㅋㅋ.. 컨셉 확실한 것 같습니다.

그리고 도착했는데..

GD-Link V3 포장박스 앞면
GD-Link V3 포장박스 뒷면

메직으로 전부 지워서...? 이게 뭐지... 더 뜯어보니..

GD-Link V3 포장

생긴 게 다른 제품이 왔습니다..?

알리에서 수년간 물건을 사보면서 다른 게 온 적은 처음이라 당황한 와중에 그걸 또 뜯어봤습니다.

GD-Link V3 분해

뭔가 로고가 박혀있고 GD32 MCU로 만든 걸 보니 짝퉁은 아닌 것 같은데요, 조금 검색해 보니 GD-Link V3가 새로 나온 것 같습니다.

260409_213332
GD-Link V3 Adapter 데이터시트 중 일부

공식 홈페이지에 외형 사진은 없고 데이터시트 중 뜯어놓은 사진이 똑같네요. 공식 디버거 맞나봅니다.

GD-Link V3를 사용하는 장면

개발보드에 꽂아봤습니다. 디버거에 꽂을 수 있는 확장보드를 구성품으로 챙겨준 건 좋은데, SWD 핀이 어떤 건지 적혀있지 않더라고요 ㅋㅋㅋ.. 데이터시트에 있는 내용을 찾아서 스티커를 붙여뒀습니다.

Hello, GD32E230C8T6! #

260409_213933
GigaDevice - GD32E230 Firmware Library [링크]

STM32와 호환을 겨냥하고 만든 MCU다 보니 GD32F103같은건 STM32 펌웨어가 그대로(!!!) 들어간다고 하는데요, GD32E230은 1:1로 호환되는 MCU가 없는 것 같습니다. 대신 펌웨어 라이브러리를 제공해 레지스터에 직접 손을 댈 필요는 없었습니다.

260409_214412

개발환경은 Codex가 만들어줬습니다. 느낌적으로 핀 번호만 살짝 바꿔치기를.. 신기하고 편한걸 넘어 이제는 무섭기까지 합니다 🫠

c
#include "gd32e23x.h"
#include "systick.h"

#define BLINK_GPIO_CLK RCU_GPIOB
#define BLINK_GPIO_PORT GPIOB
#define BLINK_GPIO_PIN GPIO_PIN_11

static void s_gpio_init(void) {
  rcu_periph_clock_enable(BLINK_GPIO_CLK);
  gpio_mode_set(BLINK_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, BLINK_GPIO_PIN);
  gpio_output_options_set(BLINK_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, BLINK_GPIO_PIN);
  gpio_bit_reset(BLINK_GPIO_PORT, BLINK_GPIO_PIN);
}

int main(void) {
  s_gpio_init();
  systick_config();

  while (1) {
    gpio_bit_toggle(BLINK_GPIO_PORT, BLINK_GPIO_PIN);
    delay_1ms(1000U);
  }
}

rcu_periph_clock_enable..? 처음보는 함수들이 있는 게, 라이브러리는 그래도 STM32의 HAL이나 LL과는 다른 느낌입니다. 최소한의 양심일까요 ㅋㅋ.. 함수를 열어보니 레지스터를 바로 호출하고 있었습니다. 레지스터를 wrapping한 간단한 구조인가 봅니다. 그나저나 함수 이름에 snakecase를 사용해서 이건 호감입니다.

마무리 #

STM32, RP2, nRF처럼 굵직한 회사의 MCU를 사용하다가 처음으로 중국의 저렴이 MCU를 사용해봤습니다.

공식 SDK를 제공하는 것들과는 다르게 간단한 라이브러리만을 제공하는 걸 보니 뭔가 내던져진 기분입니다. 몇백 페이지짜리 데이터시트 던져주고 레지스터 직접 제어하라는 게 아니어서 다행인가 싶긴 하네요.