单片机(一):VScode+SDCC+Make的Windows下51(CH552)单片开发环境搭建

这篇具有很好参考价值的文章主要介绍了单片机(一):VScode+SDCC+Make的Windows下51(CH552)单片开发环境搭建。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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可在https://code.visualstudio.com/下载到exe的安装包。

VScode可在https://code.visualstudio.com/docs查看使用指导。

点击exe进行安装,安装完成之后需要安装C/C++插件。

visual studio code单片机开发,单片机,51单片机,vscode,Powered by 金山文档

图x VScode界面

visual studio code单片机开发,单片机,51单片机,vscode,Powered by 金山文档

图x 搜索插件,并安装

1.3项目文件组织

VScode不像其它的IDE,VScode不是打开项目,而是打开文件夹。在这里我们新建一个CH522的文件夹作为项目文件夹,项目文件夹下采用如下目录结构。

编号

文件名

说明

备注

1

.vscode

存放项目的配置文件

2

App

存放存放一些应用代码,如main.c

3

build

存放编译之后生成的文件,包括hex等

4

Doc

存放芯片手册、编译器手册等说明指导文档

5

Example

存放官方给的驱动或者应用代码

6

Libraries

存放芯片的驱动、头文件、启动文件等

7

source

支持的应用的源文件代码

8

tools

存放编译器安装包、编辑器安装包、下载器等

9

其它

存放Makefile、readm等文件

表x 文件组织结构

visual studio code单片机开发,单片机,51单片机,vscode,Powered by 金山文档

图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可在https://sourceforge.net/projects/sdcc/files/下载到exe的安装包。

SDCC可在https://sdcc.sourceforge.net/doc/sdccman.pdf下载到pdf的指导手册。

使用exe的安装包进行SDCC安装,安装完成之后需要将安装路径下的bin文件路径添加到系统环境变量。

visual studio code单片机开发,单片机,51单片机,vscode,Powered by 金山文档

图x 添加环境变量

添加环境变量之后就可以通过sdcc -v命令查看到sdcc的版本信息。

visual studio code单片机开发,单片机,51单片机,vscode,Powered by 金山文档

图x 查看sdcc版本信息

2.3头文件处理

官方给的CH552.h头文件是Keil C51使用的格式,与SDCC的格式不同,主要的区别于:

SDCC格式

Keil格式

说明

__data

data

这是小内存模式的默认(通用)地址空间,声明的变量将被放在 8051内核的直接寻址 RAM中。

__idata

idata

这个地址空间中的变量将被分配到8051的内部 RAM的间接可寻址部分。

__pdata

pdata

存储类型pdata用于访问分页的外部数据存储器。

__xdata

xdata

这个地址空间中的变量将被放在外部RAM中。

__code

code

存放程序代码的内存地址空间。

__bit

bit

bit = 1位,相当于BOOL。

__sbit __at(0x90) P1_7;

sbit SCK = P1^7;

可位寻址空间的一个位。

__sfr __at (0x90) P1;

sfr P1 = 0x90;

用于描述8051的特殊函数寄存器和特殊位变量。

__at

=

绝对寻址。

__asm和__endasm

asm和endasm

内嵌汇编,起始标记。

void DeviceInterrupt( void ) __interrupt(INT_NO_USB) __using(1)

void DeviceInterrupt( void ) interrupt(INT_NO_USB) using(1)

中断服务函数

表x SDCC与keil 51的区别

由于SDCC的格式与Keil的格式有一些不同,所以需要进行一些转化。可以使用https://csy-tvgo.github.io/Keil-C51-C-to-SDCC-C-Converter/的在线工具进行转换。

visual studio code单片机开发,单片机,51单片机,vscode,Powered by 金山文档

图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-w64.org/downloads/下载。

Bash使用Git中的,可在https://git-scm.com/download下载

Makefile中的编译规则的大致思路为,首先将所的.s和.c文件编译为.s.rel和.c.rel,然后将所有的.rel文件链接为.Ihx,最后通过packihx工具拷贝.ihx并去除无关信息,生成可用于下载的.hex文件。

TARGET = downloadfile
BUILD_DIR = build
PREFIX = 
 
CC = $(PREFIX)sdcc 
AS = $(PREFIX)sdas8051 
 
RM = -rm -rf
MAKE = make 
 
# 小内存 code-代码 iram-内部RAM xram-外部RAM
MCU_MODEL = -mmcs51
MODEL  = --model-small
CODE_SIZE = --code-size 16384
IRAM_SIZE = --iram-size 256
XRAM_SIZE = --xram-size 1024
 
AS_DEFS = 
C_DEFS = 

# includes,头文件必须包含在以下文件中
AS_INCLUDES = 
C_INCLUDES =  \
-IApp \
-ILibraries/Device/Include \
-ILibraries/StdDriver/inc \
-Iinclude\
-Isource
 
# libraries
LIBS = 
LIBDIR = 
 
# source,源文件必须包含在以下文件中
SRCDIR = App
LIB_SRC = 
USER_SRC = source
 
C_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.rel
ASM_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 -s
CFLAGS = $(MCU_MODEL) $(C_DEFS) $(C_INCLUDES) $(MODEL) --out-fmt-ihx --debug
LDFLAGS = $(LIBDIR) $(LIBS) $(MCU_MODEL) $(MODEL) $(CODE_SIZE) $(IRAM_SIZE) $(XRAM_SIZE) --out-fmt-ihx
 
# -----------编译的目标all------------------
.PHONY: all
all: $(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: clean
clean:
    $(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。

visual studio code单片机开发,单片机,51单片机,vscode,Powered by 金山文档

图x VScode中使用bash的命令行

文件三:tasks.json

{
    // See https://go.microsoft.com/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。

visual studio code单片机开发,单片机,51单片机,vscode,Powered by 金山文档
visual studio code单片机开发,单片机,51单片机,vscode,Powered by 金山文档

图x VScode中使用task进行打包文章来源地址https://www.toymoban.com/news/detail-789314.html

到了这里,关于单片机(一):VScode+SDCC+Make的Windows下51(CH552)单片开发环境搭建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CH340进行STM32单片机程序烧录

    目录 代码: 接法: 结束: 刚写完32点灯程序,接下来打算用CH340进行烧录 一个main.c实现点灯,即PA2出低电位 放个仿真图  接下来就是烧录了 用的是CH340进行烧录 CH340usb转ttl CH340 STM32 TXD RXD RXD TXD 3V3 3V3 GND GND 注意这里TXD和RXD是反接的 然后打开flymcu进行配置 port看设备管理器选

    2024年02月05日
    浏览(38)
  • 单片机 | 51单片机原理

    【金善愚】 单片机应用原理篇 笔记整理 课程视频 :https://space.bilibili.com/483942191/channel/collectiondetail?sid=51090 三类 电源及晶振引脚(共4只) 控制引脚(共4只) 端口引脚(共32只) Vcc(40脚):电源端,接+5V电源。 Vss(20脚):接地端。 XTAL1(19脚):接外部晶振和微调电容的一端。 XTAL2(18脚):

    2024年02月02日
    浏览(46)
  • 51单片机项目(9)——基于51单片机的电子琴设计

    简易电子琴设计设计内容: 1.用矩阵键盘代表琴键,至少能弹出8个音符,分别是:音符1.23.4.,5,6,  2.键按下的时间长短表征节拍的长短,用蜂鸣器发出声音 3.数码管显示出当前音符 4.音量可调 (代码及其工程文件放在最后) 电路图如下: 51单片机电子琴是一种基于51单片机(

    2024年02月09日
    浏览(38)
  • 51单片机项目(7)——基于51单片机的温湿度测量仿真

    本次做的设计,是利用DHT11传感器,测量环境的温度以及湿度,同时具备温度报警的功能:利用两个按键,设置温度阈值的加和减,当所测温度大于温度阈值的时候,蜂鸣器就会响起,进行报警提示。 同时系统还有一个LCD1602屏幕,用于显示实时的温度湿度,还可以显示温度阈

    2024年02月10日
    浏览(40)
  • CH32V307VCT6单片机程序写入教程

    之前在沁恒微电子官网上申请了块互连型的单片机,芯片的型号是 CH32V307 ,之前在论坛上看到他们说这一块单片机和 stm32 系列的单片机差不多,正好今天板子到了我试了一下,发现真的和 stm32 差不多。 很多没有接触过stm32单片机但是白嫖到板子的朋友可能不会用这块板子,

    2024年02月01日
    浏览(30)
  • 51单片机:设计一单片机双机通信电路

    鱼弦:CSDN内容合伙人、CSDN新星导师、全栈领域优质创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen) 设计一单片机双机通信电路。要求编程实现:甲单片机系统中的按键可以控制乙单片机系统中的数码管(MPX8)动

    2024年02月20日
    浏览(43)
  • 51单片机实现贪吃蛇(清翔单片机)

    目录 一、创作背景 二、实现过程 1.一些声明与定义 2.键盘扫描 3.定时器中断 5.蛇的初始化 6.蛇体的移动 7.食物的创建 8.食物的检测和身体的增长 9.检测死亡 10.总代码 总结 由于大一的一个小作业,花了10天完成了这个小项目,中途克服了很多困难,发此文章以作纪念。 这些

    2024年02月08日
    浏览(36)
  • 51单片机的基础知识——单片机简介

    仅用于学习交流!!! 仅用于学习交流!!! 仅用于学习交流!!! 单片机,即单片微型计算器,简称为单片机。用专业术语来讲单片机就是在一块硅片上集成了微处理器、存储器以及各种输入/输出(I/O,I指的是input,O指的是output)口的芯片。通俗点讲,单片机是一块集

    2024年02月03日
    浏览(47)
  • 沁恒CH32V307单片机入门(01):基础说明与流程体验

    工作这几年单片机主要就接触过 Atmel、Renesas、Microchip、ST 这些厂家的,最近几年因为内部外部的各种因素单片机的价格和供应都挺不稳定的,将来会发生什么也不好说。另外这些年国内的单片机发展也挺快的。所以准备试试国产的单片机。 这里准备使用南京沁恒的CH32V307为基

    2024年01月25日
    浏览(44)
  • 【单片机】51单片机串口的收发实验,串口程序

    这段代码是使用C语言编写的用于8051单片机的串口通信程序。它实现了以下功能: 引入必要的头文件,包括reg52.h、intrins.h、string.h、stdio.h和stdlib.h。 定义了常量FSOC和BAUD,分别表示系统时钟频率和波特率。 定义了一个发送数据的函数send,该函数将数据发送到串口,等待数据

    2024年02月14日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包