The CH32V208 is a RISC-V MCU with integrated BLE 5.3:
The CH32V208 uses the WCH BLE stack with a simple API:
Application Layer
↓
WCH BLE Library (libble.a)
↓
RF PHY (2.4G)
#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);
}
}
}
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]);
}
}
}
#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);
}