DIY USB 电流表(5):使用 VSCode + PlatformIO 搭建固件开发环境
在前一篇 《DIY USB 电流表(4):PCB 焊接与调试》 中,我们已经完成了 USB 电流表的焊接,有了硬件之后,就可以开始给它注入灵魂——开发固件了。
首先完成开发环境的搭建,由于我平时都是使用的 MacBook 作为开发机,因此这里以 macOS 作为开发平台来介绍开发环境的搭建。当然 Visual Studio、PlatformIO 这些本身也都是跨平台的,在其他系统配置这一套开发环境的步骤也类似,也可以参考。
PS. 我也还是一个初学者,如果文章中有一些错误或不足,还请多多指教。
开发环境介绍
Visual Studio Code
项目地址:https://code.visualstudio.com/
Visual Studio Code 是一款由微软开发且跨平台的免费源代码编辑器。该软件以扩展的方式支持语法高亮、代码自动补全、代码重构功能,并且内置了命令行工具和 Git 版本控制系统。用户可以更改主题和键盘快捷方式实现个性化设置,也可以通过内置的扩展程序商店安装其他扩展以拓展软件功能。
一般来说,做嵌入式固件开发工作,通常会在 Windows 系统上完成,并且有完整的 IDE 可以使用,例如像 Keil。或者像在这个项目中所使用的 MCU CH32V003,沁恒也提代了一个 IDE MounStudio。
但是因为现在很多嵌入式开发相关的工具链都提供了跨平台的平台,编译器、烧录程序等都可以直接在 macOS 平台上使用,因此现在使用 macOS 来作为嵌入式开发平台也并没有太大的阻碍。
我在 macOS 上使用的编辑器是 Visual Studio Code,相信这个编辑器也不用过多介绍,它现在已经是世界上最流行的编辑器之一了,通过完善的插件扩展机制,我们可以很方便地在 Visual Studio Code 进行各种 MCU 固件的开发工作。
PlatformIO
项目地址:https://platformio.org/
PlatformIO is a cross-platform, cross-architecture, multiple framework, professional tool for embedded systems engineers and for software developers who write applications for embedded products.
PlatformIO 是一个开源的嵌入式开发工具链管理系统,通过它可以很方便的安装各种 MCU 平台进行固件开发工作所需要的工具链,例如编译器、烧录工具等,如果是使用 Arduino 框架,还提供了完善的三方库管理机制,可以很方便地将第三方库集成到项目中,提升开发速度。
Platform-CH32
项目地址:https://github.com/Community-PIO-CH32V/platform-ch32v
PlatformIO platform for CH32V RISC-V chips (CH32V003, CH32V103, CH32V20x, CH32V30x, CH32X035) and CH56x, CH57x, CH58x, CH59x
PlatformIO 目前还没有集成 CH32 系列 MCU 的平台支持,但是已经有爱好者制作好了兼容 PlatformIO 的套件,可以直接通过 PlatformIO 的平台安装功能添加到 PlatformIO 中来使用。
目前在 platform-ch32v 中,对于 CH32V003 提供了 None OS、Arduino 等多种开发框架的支持,可以根据实际需要自行选择。
不过在经过简单测试之后发现对于 CH32V003 来说,Arduino 框架有点重,稍微加一点功能,编译出来固件的大小,以及内存的使用,就超过 CH32V003 的限制了,这个 MCU 只有 16KB Flash 和 2KB RAM,资源相当紧张。
安装 PlatformIO 和 platform-ch32v
安装 PlatformIO
直接在 VSCode 的扩展市场中,搜索 platformio
就可以找到对应的扩展,直接点击安装即可。
安装 platform-ch32v
安装完 PlatformIO IDE 扩展后,可以在侧边栏看到对应的图标,通过它可以打开 PlatformIO 的侧边栏。
在侧边栏的 Quick Access 中,就可以看到 PlatformIO 常用的功能了:
我们在这里需要添加一个新的平台支持能力,可能通过 Platforms 菜单,进入到 PlatformIO 的平台管理页面。
在这里可以看到已经安装的 MCU 平台支持,通过 Advanced Installation
按钮,可以手动安装 PlatformIO 尚未集成的 MCU 平台,对于 CH32V003 来说,就需要手动安装。
在打开 Advanced Installation
窗口后,将 platform-ch32v
的仓库地址 https://github.com/Community-PIO-CH32V/platform-ch32v.git
填入到输入框中,点击安装,慢慢等待安装完成即可。
在安装完成之后,就可以在前面的平台列表中看到 WCH CH32V
了。
创建项目
安装和配置完开发环境之后,先来创建一个简单的项目将整个开发流程测试一下吧。
在 PlatformIO 的侧边栏菜单中,通过 PIO Home > Open
可以打开 PlatformIO 的首页,通过首页的 New Project
可以快速创建一个项目。
在这个 USB 电流表中,我们使用的芯片是 CH32V003F4P6,并且使用 None OS SDK 进行开发,因此项目配置如下:
Name:CH32V003USBMeter
Board:Generic CH32V003F4P6 (WCH)
Framework:Noneos-sdk
Location: Use default location
对于项目位置,默认存放项目的文件夹是 ~/Documents/PlatformIO/Projects
,如果不喜欢这个位置,可以去掉勾选使用默认位置,再选择一个自己喜欢的目录。
当然也可以参考社区的帖子,将默认项目地址更改为自己需要的地址:https://community.platformio.org/t/how-to-change-default-new-project-location/2828 。
最后点击完成,坐等项目创建完成即可。
编写测试代码
在创建完项目后,PlatformIO 就为我们生成了整体项目的结构,并且生成了一个 platformio.ini
配置文件,用于配置在编译、烧录等使用的参数。
在使用 Noneos-sdk 时,默认是没有创建源文件的,可以在 src
目录中新建一个 main.cpp
,开始编写我们的测试代码。
测试代码 main.cpp
#include <ch32v00x.h>
#include <debug.h>
extern "C" void NMI_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
extern "C" void HardFault_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
SystemCoreClockUpdate();
Delay_Init();
USART_Printf_Init(115200);
Delay_Ms(1000); // give serial monitor time to open
printf("SystemClk: %u\r\n", (unsigned)SystemCoreClock);
printf("DeviceID: %08x\r\n", (unsigned)DBGMCU_GetDEVID());
int loop_count = 0;
while (1) {
Delay_Ms(1000);
printf("loop %d\n", loop_count);
loop_count++;
}
}
void NMI_Handler(void) {}
void HardFault_Handler(void)
{
while (1)
{
}
}
在测试代码中,只做了最简单的初始化工作,在启动时打印了设备的时钟频、设备 ID,然后每隔 1 秒打印当前已经循环了几次。
编译测试代码
保存完编写的代码,使用底部工具栏上的编译按钮就可以进行编译代码操作了,如果代码没有问题,在输出窗口就可以看到编译结果了。
示例代码相当简单,很快就编译完成了:
在输出窗口可以看到,这个测试代码编译后需要占用 7012 字节的 Flash,使用 444 字节的内存。
烧录固件
注意:CH32V003 系列 MCU 需要使用沁恒的 WCH-LnikE 仿真器才可以烧录固件,因此需要额外注意一下,在购买仿真器时不要买错。
将仿真器的 3V3、GND、SWDIO 三个引脚使用杜邦线连接到 USB 电流表的对应引脚上:
执行 Upload 操作,就可以将固件烧录到 USB 电流表的 CH32V003 上了:
烧录完成后就可以看到输出窗口显示成功的信息了:
查看日志
烧录完固件之后,就可以将仿真器的 TX、RX 连接到 USB 电流表 PCB 的 TXD、RXD 引脚上来查看通过串口输出的日志了。
注意:这里需要将仿真器的 RX 连接到 PCB 的 TXD,仿真器的 TX 连接到 PCB 的 RXD。
这里顺便推荐一下沁恒出的 macOS 串口查看工具,在一众串口工具中,算是比较简洁好用的,可以通过以下链接前往 Mac App Store 安装:https://apps.apple.com/us/app/wchserialport/id1580700717?mt=12
。
将 TX、RX 引脚连接完成后,在串口工具中连接到仿真器的串口,并且给 USB 电流表供电,就可以在串口工具中看到 MCU 打印出来的日志了:
小结
Visual Studio Code + PlatformIO 的整体开发体验感觉还不错,比较轻量,但是像一些代码静态分析能力可能还是比不上比较完整的 IDE,不过能在 macOS 上有这个开发体验也算可以接受了。
目前我们只完成了开发环境的搭建,后面就可以开始编写 USB 电流表的固件了。
USB 电流表开源地址
这个 USB 电流表已经在立创开源平台开源,访问以下地址即可查看相关文件:
https://oshwhub.com/wandaeda/ji-yu-ch32v003-de-usb-dian-liu-biao
DIY USB 电流表系列
参考资料
https://github.com/Community-PIO-CH32V/platform-ch32v
https://platformio.org/
https://code.visualstudio.com/
https://community.platformio.org/t/how-to-change-default-new-project-location/2828
https://github.com/wagiminator/CH32V003-GameConsole
https://apps.apple.com/us/app/wchserialport/id1580700717?mt=12