我的 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。

参考文献