保姆级教程:用MounRiver Studio和WCH-Link点亮你的第一块CH32V103C开发板

张开发
2026/4/15 21:31:24 15 分钟阅读

分享文章

保姆级教程:用MounRiver Studio和WCH-Link点亮你的第一块CH32V103C开发板
从零开始用MounRiver Studio和WCH-Link玩转CH32V103C开发板刚拿到CH32V103C开发板和WCH-Link调试器时面对一堆陌生的硬件和软件工具很多嵌入式新手都会感到无从下手。本文将带你一步步完成开发环境搭建、硬件连接、程序下载和调试最终实现LED闪烁的效果。整个过程不需要任何嵌入式开发经验只需要一台Windows电脑和一点耐心。1. 准备工作软件安装与环境配置在开始硬件操作之前我们需要先准备好开发所需的软件工具。MounRiver Studio是沁恒微电子官方推荐的集成开发环境(IDE)专为RISC-V架构微控制器设计。1.1 下载并安装MounRiver Studio访问MounRiver Studio官网下载最新版本。安装过程与普通Windows软件类似但有几个关键点需要注意安装路径不要包含中文或空格建议使用默认路径安装过程中会提示安装USB驱动务必勾选此项安装完成后首次启动可能会较慢这是正常现象提示如果遇到杀毒软件拦截请暂时关闭或添加信任这是开发工具常见的误报情况。1.2 获取开发板资料包从沁恒官网下载CH32V103C开发板的完整资料包包含以下重要内容文件类型说明下载位置原理图开发板电路设计图CH32V103EVT.ZIP例程代码官方提供的示例程序EXAM文件夹数据手册芯片详细规格说明Doc文件夹下载后解压到本地建议放在专门的开发文件夹中方便后续查找。2. 硬件连接与WCH-Link配置2.1 认识你的开发板和调试器CH32V103C开发板核心是一颗基于RISC-V架构的32位微控制器板载资源包括1个用户LED连接至PA0引脚1个复位按钮1个用户按钮USB转串口芯片所有IO口引出至排针WCH-Link是沁恒推出的多功能调试器支持SWD和JTAG调试接口同时具备串口功能。它有两种工作模式WCH-LinkRV模式用于调试RISC-V内核芯片红灯亮WCHDapLink模式用于调试ARM内核芯片红蓝灯亮我们的CH32V103C是RISC-V架构因此需要确保WCH-Link处于RV模式。2.2 连接开发板与WCH-Link使用杜邦线按照以下方式连接WCH-Link引脚开发板引脚功能说明SWCLKP8 PA14时钟线SWDIOP8 PA13数据线GNDP8 GND地线5VP8 5V电源RXP9 PA9串口接收TXP9 PA10串口发送连接完成后将WCH-Link通过USB线接入电脑。如果这是第一次使用Windows可能会自动安装驱动程序等待安装完成即可。3. 创建第一个工程LED闪烁3.1 导入GPIO_Toggle例程打开MounRiver Studio按照以下步骤导入示例工程点击菜单栏File → Import选择General → Existing Projects into Workspace浏览到之前下载的资料包中的EXAM/GPIO/GPIO_Toggle文件夹点击Finish完成导入导入后在项目资源管理器中可以看到GPIO_Toggle工程的结构GPIO_Toggle ├── User │ ├── main.c # 主程序文件 │ └── debug.c # 调试相关函数 ├── Obj # 编译输出目录 └── Ld # 链接脚本目录3.2 编译与下载程序在下载程序前我们需要先检查几个关键配置目标芯片选择右键项目 → Properties → C/C Build → Settings → Target Processor确认选择的是ch32v103调试器配置点击工具栏上的Download Configuration按钮确保Debugger选项卡中选择了WCH-LinkRV确认无误后按照以下步骤操作点击工具栏上的Build按钮或按F7编译工程编译成功后点击Download按钮或按F8下载程序到开发板首次下载可能会提示升级WCH-Link固件按照提示操作即可如果一切顺利你应该能看到开发板上的LED开始以0.5秒的间隔闪烁。4. 进阶实验双LED交替闪烁现在我们已经成功实现了基本的LED控制接下来让我们修改代码实现更复杂的功能——让两个LED交替闪烁。4.1 硬件准备首先我们需要连接第二个LED。开发板上通常只有一个用户LED我们可以使用面包板和额外LED或者利用开发板上的其他可控制引脚假设我们使用PA0和PA1两个引脚控制两个LED硬件连接如下LED1正极 → PA0LED2正极 → PA1两个LED负极 → 各串联220Ω电阻 → GND4.2 修改代码打开main.c文件找到GPIO初始化部分修改为同时控制两个引脚void GPIO_Toggle_INIT(void) { GPIO_InitTypeDef GPIO_InitStructure {0}; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin GPIO_Pin_0 | GPIO_Pin_1; // 同时配置PA0和PA1 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); Delay_Ms(500); // LED1灭LED2亮 GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET); Delay_Ms(500); }4.3 添加串口输出为了更好的调试我们可以添加串口输出功能实时显示LED状态int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); Delay_Init(); USART_Printf_Init(115200); printf(SystemClk:%d\r\n, SystemCoreClock); printf(Dual LED Toggle Test\r\n); GPIO_Toggle_INIT(); while(1) { printf(LED1:ON, LED2:OFF\r\n); GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET); Delay_Ms(500); printf(LED1:OFF, LED2:ON\r\n); GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET); Delay_Ms(500); } }编译并下载修改后的程序除了LED交替闪烁外还可以在串口调试助手中看到状态输出信息。5. 常见问题与解决方案在实际操作过程中可能会遇到各种问题。以下是几个常见问题及其解决方法5.1 WCH-Link无法识别现象连接WCH-Link后电脑没有反应或提示无法识别的设备。可能原因及解决驱动未正确安装重新安装MounRiver Studio自带的驱动或手动安装设备管理器 → 右键未知设备 → 更新驱动 → 手动指定驱动位置WCH-Link模式错误确保处于WCH-LinkRV模式仅红灯亮如需切换模式可短接TX和GND后重新上电5.2 程序下载失败现象点击下载按钮后提示各种错误。排查步骤检查硬件连接确认SWD接口连接正确SWCLK、SWDIO、GND确认电源连接正常检查WCH-Link固件版本过旧的固件可能导致兼容性问题通过MounRiver Studio的Flash → Download Configuration → Debugger → Update Firmware升级检查芯片选项确认工程配置中选择的是正确的芯片型号CH32V103C5.3 串口无输出现象LED正常工作但串口调试助手没有收到任何数据。解决方法检查串口线连接确认WCH-Link的TX接开发板RXRX接TX注意这是交叉连接检查串口配置波特率设置为115200数据位8停止位1无校验检查代码初始化确认调用了USART_Printf_Init(115200)确认printf重定向正确6. 深入探索理解代码工作原理现在我们已经实现了基本功能让我们深入了解一下代码的工作原理为后续更复杂的开发打下基础。6.1 时钟系统初始化CH32V103C的时钟系统由以下几个部分组成内部8MHz RC振荡器HSIPLL锁相环系统时钟分频器在启动代码中默认使用内部HSI作为时钟源通过PLL倍频到72MHzvoid SystemInit(void) { RCC-CTLR | (uint32_t)0x00000001; RCC-CFGR0 (uint32_t)0xF8FF0000; RCC-CTLR (uint32_t)0xFEF6FFFF; RCC-CTLR (uint32_t)0xFFFBFFFF; RCC-CFGR0 (uint32_t)0xFF80FFFF; RCC-INTR 0x009F0000; SetSysClockTo72(); }6.2 GPIO工作原理GPIO通用输入输出是微控制器最基础的外设之一。CH32V103C的GPIO具有以下特点每个IO口可独立配置为输入或输出输出模式支持推挽和开漏输入模式支持上拉、下拉和浮空最大翻转速度2MHz在我们的LED控制代码中配置GPIO为推挽输出模式GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; // 推挽输出 GPIO_InitStructure.GPIO_Speed GPIO_Speed_2MHz; // 最大速度2MHz6.3 延时函数实现例程中的Delay_Ms()函数基于系统时钟计数实现void Delay_Init(void) { SysTick-SR ~(1 0); SysTick-CMP SystemCoreClock / 1000 - 1; SysTick-CNT 0; SysTick-CTLR 0xF; } void Delay_Ms(uint32_t n) { SysTick-CNT 0; while(n--) { while(!(SysTick-SR (10))); SysTick-SR ~(10); } }这个实现利用了SysTick定时器每毫秒产生一次中断通过循环计数实现精确延时。7. 项目扩展与进阶学习掌握了基础LED控制后你可以尝试以下扩展实验来巩固学习成果7.1 按键控制LED添加一个按键实现以下功能按下按键时LED亮松开时LED灭或按键切换LED状态按一次亮再按一次灭硬件连接按键一端接PA2另一端接GND代码中配置PA2为输入模式使用GPIO_ReadInputDataBit()读取状态7.2 PWM调光使用定时器产生PWM信号实现LED亮度调节配置定时器为PWM模式设置周期和占空比通过改变占空比调节亮度7.3 串口命令控制扩展串口功能实现通过串口命令控制LED发送ON打开LED发送OFF关闭LED发送BLINK x设置闪烁频率x为毫秒数实现思路使用串口中断接收数据解析接收到的字符串根据命令执行相应操作7.4 使用中断检测按键将按键检测改为中断方式提高系统响应速度配置GPIO中断编写中断服务函数在中断中改变LED状态void EXTI2_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line2) ! RESET) { // 切换LED状态 GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0))); EXTI_ClearITPendingBit(EXTI_Line2); } }通过这些扩展实验你可以逐步掌握CH32V103C的更多功能和外设使用方法为开发更复杂的嵌入式应用打下坚实基础。

更多文章