CH32V208 BLE Development Guide

WCH MCU · 74 views · Updated 2026-08-07

CH32V208 BLE Development Guide

Overview

The CH32V208 is a RISC-V MCU with integrated BLE 5.3:

  • Core: QingKe V4C (RV32IMAC) @ 144 MHz
  • Flash/RAM: 128KB / 64KB
  • Wireless: BLE 5.3
  • Wired: 10M Ethernet, USB OTG, CAN
  • Price: $1.00

BLE Architecture

The CH32V208 uses the WCH BLE stack with a simple API:

Application Layer
    ↓
WCH BLE Library (libble.a)
    ↓
RF PHY (2.4G)

Peripheral Example: BLE UART

#include "ch32v20x.h"
#include "ble.h"

// BLE service UUID
#define SERVICE_UART    0xFFE0
#define CHAR_TX         0xFFE1
#define CHAR_RX         0xFFE2

void BLE_Init() {
    BLE_Config_t cfg = {
        .device_name = "Open-RISCV-UART",
        .appearance = 0x0000,
        .conn_interval_min = 6,
        .conn_interval_max = 12,
    };
    BLE_Start(&cfg);
    
    // Register UART service
    BLE_AddService(SERVICE_UART);
    BLE_AddCharacteristic(CHAR_TX, CHAR_PROP_NOTIFY);
    BLE_AddCharacteristic(CHAR_RX, CHAR_PROP_WRITE);
}

// Called when data received from BLE
void BLE_OnWrite(uint16_t char_uuid, uint8_t *data, uint8_t len) {
    if (char_uuid == CHAR_RX) {
        // Forward to hardware UART
        for (int i = 0; i < len; i++) {
            USART_SendData(USART1, data[i]);
            while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
        }
    }
}

BLE Scanner Example

void BLE_Scan() {
    BLE_StartScan(1000); // 1 second scan
    while(1) {
        BLE_Device_t *dev = BLE_GetScanResult();
        if (dev) {
            printf("Found: %s, RSSI: %d, Addr: %02X:%02X:%02X:%02X:%02X:%02X\n",
                dev->name, dev->rssi,
                dev->addr[5], dev->addr[4], dev->addr[3],
                dev->addr[2], dev->addr[1], dev->addr[0]);
        }
    }
}

10M Ethernet Setup

#include "ch32v20x_eth.h"

void ETH_Init() {
    ETH_InitTypeDef ETH_InitStruct = {0};
    ETH_InitStruct.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
    ETH_InitStruct.ETH_Mode = ETH_Mode_TxRx;
    ETH_Init(&ETH_InitStruct);
    
    // Enable MAC address filter
    uint8_t mac[6] = {0x02, 0x00, 0x00, 0x00, 0x00, 0x01};
    ETH_MACAddressConfig(ETH_MAC_Address0, mac);
}

Resources

Buy CH32V208

Contact us for samples
Request Hardware Ask in Forum