CH552芯片是一款兼容 MCS51 指令集的增强型 E8051 内核单片机。CH552既然是51单片机,按照以前的惯例都是用Keil来进行开发。但是本次决定抛弃Keil的开发环境,主要原因是Keil为商业软件,普通用户难以支撑,并且Keil软件本身的界面丑、编辑器不智能等,这导致软件的使用体验非常差。
本次采用VScode+SDCC+Make组合的方式来开发51单片机,免费开源,功能强大。同时适用所有51内核的单片机开发。如果嫌开发环境搭建麻烦的可以下载我配置好的项目文件。
一、编辑器VScode
1.1介绍
Visual Studio Code是一个轻量级但功能强大的源代码编辑器,可在您的桌面上运行,可用于Windows,macOS和Linux。它内置了对JavaScript,TypeScript和Node的支持.js并具有针对其他语言和运行时(如C++,C#,Java,Python,PHP,Go,.NET)的丰富扩展生态系统。
1.2下载和安装
VScode可在/下载到exe的安装包。
VScode可在/docs查看使用指导。
点击exe进行安装,安装完成之后需要安装C/C++插件。
图x VScode界面
图x 搜索插件,并安装
1.3项目文件组织
VScode不像其它的IDE,VScode不是打开项目,而是打开文件夹。在这里我们新建一个CH522的文件夹作为项目文件夹,项目文件夹下采用如下目录结构。
表x 文件组织结构
图x 文件组织结构
二、编译链工具SDCC
2.1介绍
编译链工具采用开源的SDCC,SDCC套件是一系列工具的总称,全称是Small Device C Compiler,即“小型设备C语言编译器”。
官网资料显示,SDCC是一个可重定向目标的、优化的标准C编译器套件(支持ANSI C89,ISO C99和ISO C11),支持:
1、英特尔MCS51(8031,8032,8051,8052等);
2、Maxim(原Dallas)的DS80C390系列;
3、Freescale(原摩托罗拉)的HC08系列(hc08,s08);
4、Zilog的Z80系列(z80,z180,gbz80,Rabbit 2000/3000,Rabbit 3000A,TLCS-90);
5、Padauk(pdk14、pdk15);
6、意法半导体的STM8。
2.2下载和安装
SDCC可在/projects/sdcc/files/下载到exe的安装包。
SDCC可在/doc/sdccman.pdf下载到pdf的指导手册。
使用exe的安装包进行SDCC安装,安装完成之后需要将安装路径下的bin文件路径添加到系统环境变量。
图x 添加环境变量
添加环境变量之后就可以通过sdcc -v命令查看到sdcc的版本信息。
图x 查看sdcc版本信息
2.3头文件处理
官方给的CH552.h头文件是Keil C51使用的格式,与SDCC的格式不同,主要的区别于:
表x SDCC与keil 51的区别
由于SDCC的格式与Keil的格式有一些不同,所以需要进行一些转化。可以使用https://csy-tvgo.github.io/Keil-C51-C-to-SDCC-C-Converter/的在线工具进行转换。
图x 转换前后
转化完成之后,任然有问题。一个是我们的VScode也是采用Keil的识别格式,SDCC的格式会使得VScode报错,红色的波浪下划线看起来很不舒服,也屏掩盖了真正的错误。二个是,还没有真正的转化为我们想要的SDCC的格式。所以这里还需要进一步的处理,这里主要是通过C语言的宏定义来处理,下面表格注释中已经解释了其中的原理。
c_cpp_properties.json文件
/* .vscode里面添加c_cpp_properties.json文件,并录入如下内容,主要是给VScode宏定义NotKeil,包含头文件的路径,指定编译器的路径*/{"configurations": [{"name": "C51","includePath": [ // 你的工程中存放 include的文件夹路径"C:/Program Files/SDCC/include","${workspaceFolder}/App","${workspaceFolder}/source","${workspaceFolder}/Libraries/Device/Include"],"defines": ["NotKeil" ],"compilerPath": "C:\\Program Files\\SDCC\\bin\\sdcc.exe", // sdcc bin路径"cStandard": "c99","cppStandard": "gnu++14","intelliSenseMode": "msvc-x64"}],"version": 4}
ch552.h头文件中添加如下宏定义
/* ch552.h头文件中添加如下宏定义 -----------------------------------------由于VScode宏定义了NotKeil,VScode中使用Keil的格式实际编译的时候没有NotKeil的宏定义,所以是使用SDCC的格式*/#ifndef NotKeil#define SFR(reg, addr) __sfr __at(addr) reg#define SFR16(reg, addr) __sfr16 __at(addr) reg#define SBIT(reg, addr, offset) __sbit __at(addr+offset) reg#define AT(addr) __at (addr)#else#define __xdata#define __idata#define __data#define __pdata#define __code const#define __bit char#define __interrupt(num)#define __using(num)#define SFR(reg, addr) unsigned char reg#define SFR16(reg, addr) unsigned short reg#define SBIT(reg, addr, offset) BOOL reg#define AT(addr);#endif
三、编译规则Makefile
想要在windows上使用make,需要安装MinGW和bash。MinGW的全称是:Minimalist GNU on Windows。可以将源代码编译为可在 Windows 中运行的可执行程序,而且还可以使用一些Windows不具备的,Linux平台下的开发工具。Bash是一个命令处理器,通常运行于文本窗口中,并能执行用户直接输入的命令,能够处理Makefile文件中的shell命令。
MinGW可在https://www.mingw-/downloads/下载。
Bash使用Git中的,可在https://git-/download下载
Makefile中的编译规则的大致思路为,首先将所的.s和.c文件编译为.s.rel和.c.rel,然后将所有的.rel文件链接为.Ihx,最后通过packihx工具拷贝.ihx并去除无关信息,生成可用于下载的.hex文件。
TARGET = downloadfileBUILD_DIR = buildPREFIX = CC = $(PREFIX)sdcc AS = $(PREFIX)sdas8051 RM = -rm -rfMAKE = make # 小内存 code-代码 iram-内部RAM xram-外部RAMMCU_MODEL = -mmcs51MODEL = --model-smallCODE_SIZE = --code-size 16384IRAM_SIZE = --iram-size 256XRAM_SIZE = --xram-size 1024AS_DEFS = C_DEFS = # includes,头文件必须包含在以下文件中AS_INCLUDES = C_INCLUDES = \-IApp \-ILibraries/Device/Include \-ILibraries/StdDriver/inc \-Iinclude\-Isource# librariesLIBS = LIBDIR = # source,源文件必须包含在以下文件中SRCDIR = AppLIB_SRC = USER_SRC = sourceC_SOURCES := $(wildcard $(SRCDIR)/*.c $(LIB_SRC)/*.c)C_SOURCES += $(wildcard $(USER_SRC)/*.c)ASM_SOURCES = $(wildcard $(SRCDIR)/*.asm)C_SRC_FILE = $(notdir $(C_SOURCES))C_OBJ_FILE = $(C_SRC_FILE:%.c=%.c.rel) # xxx.c -> xxx.c.relASM_SRC_FILE = $(notdir $(ASM_SOURCES))ASM_OBJ_FILE = $(ASM_SRC_FILE:%.asm=%.asm.rel)OBJECTS = $(addprefix $(BUILD_DIR)/,$(C_OBJ_FILE))OBJECTS += $(addprefix $(BUILD_DIR)/,$(ASM_OBJ_FILE))# 编译和链接参数ASFLAGS = -l -sCFLAGS = $(MCU_MODEL) $(C_DEFS) $(C_INCLUDES) $(MODEL) --out-fmt-ihx --debugLDFLAGS = $(LIBDIR) $(LIBS) $(MCU_MODEL) $(MODEL) $(CODE_SIZE) $(IRAM_SIZE) $(XRAM_SIZE) --out-fmt-ihx# -----------编译的目标all------------------.PHONY: allall: $(BUILD_DIR)/$(TARGET).hex# 将.c和.s编译为.rel的中间文件,不支持多个.c一起编译,所以分开编译$(BUILD_DIR)/%.c.rel: $(SRCDIR)/%.c$(CC) -o $@ $(CFLAGS) -c $^$(BUILD_DIR)/%.c.rel: $(LIB_SRC)/%.c$(CC) -o $@ $(CFLAGS) -c $^$(BUILD_DIR)/%.c.rel: $(USER_SRC)/%.c$(CC) -o $@ $(CFLAGS) -c $^$(BUILD_DIR)/%.asm.rel: $(SRCDIR)/%.asm$(AS) $(ASFLAGS) -o $@ $^ # 将上一步生成的所有的.rel连接生成download.ihx$(BUILD_DIR)/%.ihx: $(OBJECTS)$(CC) -o $@ $(LDFLAGS) $^# 拷贝download.ihx去除无关信息,生成download.hex$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.ihx | $(BUILD_DIR)packihx $^ > $@$(BUILD_DIR):mkdir $@# -----------编译的目标clean------------------.PHONY: cleanclean:$(RM) $(BUILD_DIR)/*
四、项目配置
.Vscode下面的三个文件进行项目配置:
文件一:c_cpp_properties.json
{"configurations": [{"name": "C51","includePath": [ // 你的工程中存放 include的文件夹路径"C:/Program Files/SDCC/include","${workspaceFolder}/App","${workspaceFolder}/source","${workspaceFolder}/Libraries/Device/Include"],"defines": ["NotKeil"],"compilerPath": "C:\\Program Files\\SDCC\\bin\\sdcc.exe",// sdcc bin路径"cStandard": "c99","cppStandard": "gnu++14","intelliSenseMode": "msvc-x64"}],"version": 4}
文件二:settings.json
{"files.encoding": "gb2312","files.autoGuessEncoding": true,"C_Cpp.errorSquiggles": "Enabled","files.associations": {"main.h": "c","ch552.h": "c","hc.c": "c","cdc.c": "c","com.c": "c","adc.c": "c","UsbToUart.C": "cpp","Compound.C": "cpp","Touch_Key.C": "cpp","CH554.H": "cpp"},"terminal.integrated.shell.windows": "C:\\Program Files\\Git\\bin\\bash.exe",}
这里制指定了bash的路径,需要安装GIT,我这里使用的是Git下面的bash。注意这里不是使用windows的CMD。
图x VScode中使用bash的命令行
文件三:tasks.json
{// See /fwlink/?LinkId=733558// for the documentation about the tasks.json format"version": "2.0.0","tasks": [{"type": "shell","label": "bulid","command": "make","args": ["all"],"group":{"kind": "build","isDefault": true}},{"label": "clean","command": "make","args": ["clean"],"type": "shell","group":{"kind": "build","isDefault": true}}]}
这里创建了两个task,这样可以在VScode中通过点击鼠标就可以make。
图x VScode中使用task进行打包