【MCU】【CH32】基于CH32F103C8T6离线固件库和MDK环境下的工程模板搭建(纯手动)
一、简介
CH32F103C8T6 是南京沁恒微电子(WCH)推出的一款 32 位微控制器,兼容 STM32F103C8T6(意法半导体的经典型号),采用 ARM Cortex-M3 内核,性能与成本平衡,适合替代 STM32 在各类嵌入式项目中的应用。以下是其核心特性和应用场景:
(1)核心参数
-
内核与性能
- 32 位 ARM Cortex-M3 内核,最高 72MHz 主频,支持 Thumb-2 指令集。
- 1.25DMIPS/MHz,内置硬件乘法器和除法器。
-
存储与外设
- 64KB Flash(支持 ICP/IAP)、20KB SRAM。
- 丰富通信接口:3 个 USART、2 个 SPI、2 个 I2C、1 个 USB 2.0 全速(12Mbps)、CAN 2.0B。
- 1 个 12 位 ADC(16 通道,最高 1MHz 采样率)、2 个 12 位 DAC。
- 7 个定时器(包括高级定时器),支持 PWM 输出和编码器接口。
-
工作条件
- 供电电压:2.0V~3.6V,工作温度:-40°C~+85°C(工业级)。
- 低功耗模式:睡眠、停止、待机。
(2)与 STM32F103C8T6 的兼容性
- 硬件引脚兼容:完全兼容 STM32F103C8T6 的 LQFP48 封装,可直接替换。
- 软件兼容:支持标准库(需使用 WCH 提供的固件库)和 HAL 库,大部分 STM32 代码可无缝移植。
- 工具链支持:
- 开发环境:Keil MDK、IAR、GCC(如 OpenOCD)。
- 调试接口:支持 SWD/JTAG(与 STM32 相同)。
(3)应用场景
- 工业控制:电机控制、传感器数据采集、PLC 模块。
- 消费电子:智能家居设备、手持设备、无线充电。
- 通信设备:串口转 USB/CAN 转换器、网关。
- 替代方案:在 STM32 缺货或成本敏感场景中作为直接替代品。
(4)优势与注意事项
-
优势
- 成本更低:价格通常低于 STM32F103C8T6。
- 国产支持:供货稳定,技术支持响应快。
- 扩展特性:部分型号增加了 USB 和 CAN 等接口(如 CH32F103xC 系列)。
-
注意事项
- 固件库差异:虽然 API 与 STM32 类似,但细节可能不同,需参考 WCH 官方文档。
- 生态资源较少:第三方库和教程不如 STM32 丰富。
- 性能微调:部分外设(如 ADC)的精度和稳定性可能略逊于 STM32。
(5)开发资源
- 官方资源:
- 沁恒官网(www.wch.cn)提供固件库、数据手册和开发工具(如 WCH-Link)。
- 支持标准的 ARM 开发工具链(如 Keil、GCC)。
- 社区支持:国内开源社区(如 STM32 论坛)有部分 CH32 移植经验分享。

安装CH32F103C8T6的MDK支持包

二、工程搭建
1.新建文件夹CH32_Example,然后再在其内新建文件夹


2.\CH32资料\CH32F103\GPIO_PC13LED Project下的ch32f10x_conf.h放到我们的工程文件夹下的config文件夹下
使用了商家给的示例工程方便来移植整理,官方的其实也可以,但是外设源码是分开的需要自己整理,所以这里我就使用了商家给的来移植。


3.将.s启动文件放到startup文件夹下

4.将\CH32资料\CH32F103\GPIO_PC13LED Project\SRC\CMSIS下的内核文件放到cmsis文件夹下


5.将\CH32资料\CH32F103\GPIO_PC13LED Project下的system_ch32f10x.h/c系统文件放到system文件夹下


6.将\CH32资料\CH32F103\GPIO_PC13LED Project\SRC\StdPeriphDriver下的外设头文件和c文件放到firmware下

7.将\CH32资料\CH32F103\GPIO_PC13LED Project下的ch32f10x_it.h/c和main.c的文件放到user下

8.打开MDK新建工程在Project下,并选择CH32的支持包


9.重新建立工程结构

10.添加文件






11.添加商家给的额外的库




12.添加文件路径

13.移去ch32f10x_usb_host.c


14.编译完成

三、代码编写
/********************************** (C) COPYRIGHT *******************************
* File Name : main.c
* Author : WCH
* Version : V1.0.0
* Date : 2019/10/15
* Description : Main program body.
*******************************************************************************/
#include "debug.h"
/* Global define */
/* Global Variable */
/*******************************************************************************
* Function Name : GPIO_Toggle_INIT
* Description : Initializes GPIOA.0
* Input : None
* Return : None
*******************************************************************************/
void GPIO_Toggle_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
/*******************************************************************************
* Function Name : main
* Description : Main program.
* Input : None
* Return : None
*******************************************************************************/
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Delay_Init();
//USART_Printf_Init(115200);
GPIO_Toggle_INIT();
//printf("SystemClk:%d\r\n",SystemCoreClock);
//printf("GPIO Toggle TEST\r\n");
while(1)
{
Delay_Ms(1000);
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
Delay_Ms(1000);
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
}
}
四、实验效果

示例工程链接:
https://github.com/Molesidy/CH32.git
https://github.com/Molesidy/CH32.git

浙公网安备 33010602011771号