1. 环境准备与工具安装
第一次接触RISC-V开发板的朋友可能会被一堆专业术语吓到,其实搭建CH32V103C开发环境比想象中简单。我去年刚开始用这款板子时也走了不少弯路,现在把最顺手的配置方案分享给大家。
必备工具清单:
- MounRiver Studio(最新版V1.80以上)
- WCH-Link调试器(建议用原厂版本)
- CH32V103C开发板(带Type-C接口的EVT板最佳)
- 杜邦线若干(建议选用彩色线方便区分)
注意:WCH官网提供的CH32V103EVT.ZIP压缩包一定要下载,里面包含原理图、例程等关键资料,解压后建议单独建个文件夹存放。
安装MounRiver Studio时有个小技巧:路径不要有中文和空格!我遇到过因为安装路径含中文导致编译失败的情况。安装完成后记得勾选"Add to PATH"选项,这样后续命令行操作会方便很多。第一次启动时可能会提示安装Java环境,按照指引操作即可。
2. 硬件连接实战技巧
很多新手在连接WCH-Link时容易搞错线序,这里我用实际接线图说明。拿出你的杜邦线,按这个顺序连接:
WCH-Link引脚 → 开发板接口 SWCLK → P8的PA14(时钟线) SWDIO → P8的PA13(数据线) GND → P8的GND(地线) 5V → P8的5V(供电线) TX → P9的PA10(串口发送) RX → P9的PA9(串口接收)实测发现用彩色杜邦线可以大幅降低接错概率:比如红色接5V,黑色接GND,黄色接信号线。接好后建议拍照留存,下次调试时就不用反复查手册了。
开发板上的LED1默认连接PA0引脚,我们需要再找个LED接PA1引脚实现双灯控制。如果没有额外LED,用万用表测量PA1引脚电压变化也能验证效果。我常用这种带鳄鱼夹的测试线,比直接插杜邦线更稳固。
3. 工程配置关键步骤
打开MounRiver Studio后,按Ctrl+Shift+N导入GPIO_Toggle例程。这里有个容易踩的坑:例程路径不能有中文!我遇到过因为桌面文件夹名为"桌面"导致编译报错的情况。
编译前必查三项:
- 项目属性 → C/C++ Build → Tool Chain路径是否正确
- 项目属性 → Debugger → WCH-Link配置是否选择RISC-V模式
- 项目属性 → Target → 芯片型号是否为CH32V103C8T6
第一次下载程序时可能会弹出固件升级提示,这是正常现象。我测试过不同版本的WCH-Link固件,建议升级到最新版(当前是V2.5)。升级过程中不要断开USB连接,整个过程约1分钟。
4. 双LED控制代码详解
原始例程只能控制单LED,我们通过修改GPIO初始化代码实现双灯控制。关键改动点在GPIO_Toggle_INIT函数:
void GPIO_Toggle_INIT(void) { GPIO_InitTypeDef GPIO_InitStructure = {0}; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 修改点:同时配置PA0和PA1两个引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); }主循环里的控制逻辑也要相应调整。我推荐这种写法,可读性更好:
while(1) { // 第一种状态:LED1亮,LED2灭 GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET); printf("LED状态: ● ○\r\n"); Delay_Ms(1000); // 第二种状态:LED1灭,LED2亮 GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET); printf("LED状态: ○ ●\r\n"); Delay_Ms(1000); }串口打印用●○符号可以直观显示LED状态,调试时一眼就能看出问题。如果发现LED亮灭状态与预期相反,检查开发板LED电路是共阳还是共阴接法,必要时对Bit_SET/Bit_RESET取值取反。
5. 调试技巧与常见问题
问题1:下载失败提示"No target connected"
- 检查WCH-Link模式指示灯是否为红色(RISC-V模式)
- 重新插拔USB线试试
- 在MounRiver Studio的Flash → Download Configuration里重置调试器
问题2:串口打印乱码
- 确认波特率设置为115200
- 检查TX/RX线是否接反
- 尝试更换串口工具(推荐使用Tera Term)
问题3:LED不亮但代码已下载成功
- 用万用表测量PA0/PA1引脚电压是否变化
- 检查LED限流电阻是否合适(1KΩ较稳妥)
- 确认LED正负极没有接反
我习惯在代码里添加版本信息,这样通过串口就能确认运行的是最新程序:
printf("双LED控制程序 v1.2\r\n"); printf("编译时间: %s %s\r\n", __DATE__, __TIME__);6. 进阶功能拓展
掌握基础控制后,可以尝试更复杂的效果。比如用PWM实现呼吸灯:
// 在初始化中添加TIM1配置 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure = {0}; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); TIM_TimeBaseStructure.TIM_Period = 255; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // PWM输出配置 TIM_OCInitTypeDef TIM_OCInitStructure = {0}; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM1, &TIM_OCInitStructure); TIM_CtrlPWMOutputs(TIM1, ENABLE); TIM_Cmd(TIM1, ENABLE);然后在主循环中修改占空比就能看到灯光渐变效果。通过这个案例,你会发现RISC-V开发其实和STM32有很多相似之处,关键是掌握外设配置方法。