CH32V307 Industrial Gateway Guide

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

CH32V307 Industrial Gateway Guide

Overview

The CH32V307 is an industrial-grade RISC-V MCU:

  • Core: QingKe V4F (RV32IMACF) @ 144 MHz (with FPU)
  • Flash/RAM: 256KB / 64KB
  • Gigabit Ethernet MAC + 10M PHY
  • USB 2.0 HS (480 Mbps)
  • Dual CAN bus
  • 8x UART, DVP camera, FSMC
  • Price: $3.00

Gigabit Ethernet Setup

#include "ch32v30x_eth.h"

void ETH_Gigabit_Init() {
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    
    // Enable RGMII pins
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ETH_MAC, ENABLE);
    
    // Configure RGMII pins (PA0-PA3, PC1-PC5)
    // ... (see reference manual for pin mapping)
    
    ETH_InitTypeDef ETH_InitStruct = {0};
    ETH_InitStruct.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
    ETH_InitStruct.ETH_Speed = ETH_Speed_1000M;
    ETH_InitStruct.ETH_Mode = ETH_Mode_TxRx;
    ETH_Init(&ETH_InitStruct);
}

Dual CAN Bus

void CAN1_Init() {
    CAN_InitTypeDef CAN_InitStruct = {0};
    CAN_InitStruct.CAN_TTCM = DISABLE;
    CAN_InitStruct.CAN_ABOM = ENABLE;
    CAN_InitStruct.CAN_Mode = CAN_Mode_Normal;
    CAN_InitStruct.CAN_SJW = CAN_SJW_1tq;
    CAN_InitStruct.CAN_BS1 = CAN_BS1_5tq;
    CAN_InitStruct.CAN_BS2 = CAN_BS2_3tq;
    CAN_InitStruct.CAN_Prescaler = 4;
    CAN_Init(CAN1, &CAN_InitStruct);
    
    // Filter: accept all
    CAN_FilterInitTypeDef filter = {0};
    filter.CAN_FilterNumber = 0;
    filter.CAN_FilterMode = CAN_FilterMode_IdMask;
    filter.CAN_FilterScale = CAN_FilterScale_32bit;
    filter.CAN_FilterIdHigh = 0x0000;
    filter.CAN_FilterIdLow = 0x0000;
    filter.CAN_FilterMaskIdHigh = 0x0000;
    filter.CAN_FilterMaskIdLow = 0x0000;
    filter.CAN_FilterFIFOAssignment = CAN_FIFO0;
    filter.CAN_FilterActivation = ENABLE;
    CAN_FilterInit(&filter);
}

void CAN_Send(uint32_t id, uint8_t *data, uint8_t len) {
    CanTxMsg msg = {0};
    msg.StdId = id;
    msg.IDE = CAN_Id_Standard;
    msg.RTR = CAN_RTR_Data;
    msg.DLC = len;
    for (int i = 0; i < len; i++) msg.Data[i] = data[i];
    CAN_Transmit(CAN1, &msg);
}

USB 2.0 High Speed (480 Mbps)

#include "ch32v30x_usbhs.h"

// USB CDC (virtual serial port) at 480 Mbps
void USBHS_CDC_Init() {
    USBHS_InitTypeDef init = {0};
    init.USBHS_Speed = USBHS_SPEED_HIGH;
    init.USBHS_Mode = USBHS_MODE_DEVICE;
    USBHS_Init(&init);
    
    // Configure CDC endpoints
    USBHS_ConfigEP(1, USBHS_EP_BULK, 512, USBHS_EP_TX);
    USBHS_ConfigEP(2, USBHS_EP_BULK, 512, USBHS_EP_RX);
}

Multi-Protocol Gateway Architecture

  CAN Bus 1 ──┐
              ├── CH32V307 ── Gigabit Ethernet ── Cloud
  CAN Bus 2 ──┤     │
              │     ├── USB HS ── Local PC
  RS485 ──────┘     │
                    ├── UART ── Modbus RTU
                    └── DVP ── Camera

Resources

Buy CH32V307

Request samples and volume pricing
Request Hardware Ask in Forum