我的 STC 单片机开发工作流

本文主要用作记录开发过程中使用的不同工具。主要也是课程导向的,所以可能并不会使用实际上更好的方法。设备是 STC15F2P60S2。

添加设备库

先安装 Arm Keil uVision 5。由于课程需要,使用 Keil 的开发工具链,主要是懒得去学 SDCC 的语法差异,也懒得移植学校给的 BSP 库。

使用十分复古的 STC-ISP 来添加设备库。直接点击 “添加型号和头文件……” 即可。

添加设备库

创建项目

需要首先新建项目目录、一个 C 文件(空不空都行),以及所需的头文件和库文件(.lib),文件都放在项目文件夹中。这里我将 C 文件和库文件放到 source/ 目录,将 头文件放到 inc/ 目录。

在 uVision 主界面顶部点击 Project - New uVision Project 来创建一个项目文件。由于 Keil 松散的文件管理,这个文件并不必须与源代码同目录同名,但为了遵循其他 IDE 的惯例,最好还是保持相同。

选择设备时可以在下拉栏里找到 STC MCU database,然后选择你的 STC 芯片。

之后询问的 STARTUP.A51 没必要复制进来。

然后找到左边项目浏览器中的 Target,如果没有下属 Group 就先创建一个,有了之后直接双击它,打开添加文件界面。将你的库文件和 C 代码添加进来。如果在这里添加头文件,要指定好目录,但如果是某种库的话可以留到后面添加,所以这里只添加了两个文件。

添加文件

正常情况下 C 文件包含的头文件是会自动显示在 C 源代码下属的,就像上图这样。但是刚添加进文件的时候是没有的。

之后找到顶部 Project 菜单,选择 Options for Target xxx,点击 C51,找到 Include Paths,在这里添加额外的包含目录。我的库文件在项目文件夹 inc/ 目录,故添加完成如图。

添加完成

编写与构建项目

Keil 本身是一个完善的 IDE,那么对于写代码,我们自然是…… 用 VS Code!

只是为了自动识别 Keil 的项目,需要再装一个插件。该插件的信息如下。

text
1
名称: Keil AssistantID: cl.keil-assistant 说明: An assistant for Keil uVision 版本: 1.7.0 发布者: CLVS Marketplace 链接: https://marketplace.visualstudio.com/items?itemName=CL.keil-assistant

在插件设置中指定 Keil 工具链 UV4.exe 的路径,就可以用 VS Code 打开工作区的同时自动识别 Keil 项目了。

编辑代码

VS Code 自带的 C language server 能够完美地契合我们的需求,体验比 Keil 高到不知哪里去了。将鼠标移至特定 Target 上,甚至可以直接构建项目。

如果没有 hex 文件输出,可以修改 uvproj 文件中的一行,在 tag 之间加一个 1,如下。或者在前面 Target Options 页面里找到 Output,选上 Create HEX file。

xml
1
          <CreateHexFile>1</CreateHexFile>

区分多种编译选项

有时由于方便调试的原因,我们需要添加调试输出,如 RS485 难以调试,则在开发时也输出到 USB 串口;同时我们也不希望最终使用时带有这种调试信息,那么在 C 语言中常用 #define 语句来区分:

c
1
2
3
4
    Uart2Print(buf2, 8);
#ifdef DEBUG
    Uart1Print(buf2, 8);
#endif

可以使用多 build target 的方式,对每个 target 设定不同的 define 选项。从刚刚找到的 Options for Target 右边,点击 File Extensions, … 按钮,然后新建一个 target,并选择其为当前 target。然后打开之前 P3 提到过的 C51 选项,在 define 里设置想提前声明的内容即可。

编译器选项

刷写项目

这里仍然不使用 STC-ISP,而使用开源的 stcgal。

grigorig/stcgal

命令很简单,一般来说只需要一把梭:

bash
1
stcgal some-program.hex -p COMx

由于程序似乎是为 Linux 设计的,在 Windows 下必须指定 COM 号。一般这个号和特定 USB 接口有对应关系,用 STC-ISP 看一下就行了。

刷写程序

这样我们可以将工作流与 vscode 深度融合,直接在其终端中操作,编辑、构建、刷写一体化,此时基本不需要 Keil。

参考文献