SDCC+vscode+make搭建开源stc8g开发环境
帮助你用scode+sdcc+make开发stc8g
为什么选择SDCC+vscdoe+make
相较于传统的keil5开发有以下优点:
1、SDCC完全开源,做产品时没有被keil5警告的商业风险
2、vscode体验远远好于keil
3、可以学习一下交叉编译的流程。主流芯片开发如,esp32,树莓派pico等,甚至stm32都有使用make/cmake的
4、有linux方案,可以在linux下运行。
缺点:
1、编译后文件会大一些
2、sdcc语法有一些小小的出入这点网上也开始有更多人使用这个方案了,相关问题搜索一下就应该有答案。stc官方甚至还有推出sdcc标准的头文件
3、上手难度比keil5大,毕竟keil5是老牌
4、不支持调试或者麻烦不是因为我不会,这个可以通过别的调试方法解决。不过stc8g居然支持keil5下单芯片调试,还是有点厉害的。
本教程非新手入门,windows环境
准备
请参考网上另外的教程安装vscode和make环境,如果有问题,请问AI。做不到就说明你更适合keil开发。
SDCC
SDCC官网下载
选择对应平台安装包
接下来基本就是一路next

这里选择安装的组件,可以只选择和51相关的组件,体积会大大减小。
注意最后的添加环境变量不要取消,要不然无法编译
开始编译

STC-ISP这里头文件选择SDCC格式复制保存为一个头文件,后续有用上。
最后的文件结构是
.vscode
Build
Library
System
STC8G.H
User
main.c
其中.vscode的主要配置文件c_cpp_properties.ison
/* .vscode里面添加c_cpp_properties.json文件,并录入如下内容,
主要是给VScode宏定义NotKeil,包含头文件的路径,指定编译器的路径*/
{
"configurations": [
{
"name": "C51",
"includePath": [ // 你的工程中存放 include的文件夹路径
"${workspaceFolder}/**",
"${workspaceFolder}/Library",
"${workspaceFolder}/System",
"${workspaceFolder}/User"
],
"defines": [
// "NotKeil",
"__sfr=unsigned char",
"__sbit=int",
"__at(a)= ",
"__data= ",
"__xdata= ",
"__using= ",
"__interrupt(n)= ",
"SDCC"
],
"compilerPath": "D:\\Toolchain\\sdcc\\bin\\sdcpp.exe", // sdcc bin路径
"cStandard": "c11",
"cppStandard": "gnu++14",
"intelliSenseMode": "gcc-x64"
}
],
"version": 4
}
注意defines,这里面定义了一些变量,可以让vscode的IntelliSense忽略一些特有的标识符,例如"__interrupt(n)= ",就是将__interrupt(n),既sdcc的中断标号替换为空,这样就不会有误报的波浪线了。
main.c的内容为:
#include "STC8G.H"
// 定义串口1中断服务程序
void Uart1_Isr(void) __interrupt(4)
{
if (RI) // 检查接收中断标志
{
RI = 0; // 清除接收中断标志
SBUF = SBUF; // 将接收到的数据回显发送
}
if (TI) // 检查发送中断标志
{
TI = 0; // 清除发送中断标志
}
}
// 初始化串口1
void Uart1_Init(void)
{
SCON = 0x50; // 8位数据,可变波特率
AUXR |= 0x40; // 定时器时钟1T模式
AUXR &= 0xFE; // 串口1选择定时器1为波特率发生器
TMOD &= 0x0F; // 设置定时器模式
TL1 = 0xE0; // 设置定时初始值
TH1 = 0xFE; // 设置定时初始值
ET1 = 0; // 禁止定时器中断
TR1 = 1; // 定时器1开始计时
ES = 1; // 使能串口1中断
EA = 1;
}
void main(void)
{
Uart1_Init(); // 初始化串口1
while (1)
{
// 主循环可以执行其他任务
}
}
这是一个简单的回显程序,可以测试你的串口好坏。
Makefile文件内容为
CC = sdcc
ihx2hex = packihx
# 定义输出目录变量
BUILD_DIR = Build
# 编译选项
# 输出详细编译过程
# 内部存储空间大小 12k
# 内部RAM大小 256字节
# 内部拓展RAM大小 1024字节 相当于内部集成51的外部RAM拓展
CFLAGS = -V \
--code-size 0x2FFF \
--iram-size 0xFF \
--xram-size 0x400 \
-mmcs51 \
--model-medium
all:
${CC} -I System ${CFLAGS} User/main.c -o ${BUILD_DIR}/project.ihx
${ihx2hex} ${BUILD_DIR}/project.ihx > ${BUILD_DIR}/project.hex
make show
.PHONY: clean show
clean:
del /q ${BUILD_DIR}
show:
powershell -Command "$$file_data = Get-Content Build/project.mem; \
$$file_data | Select-Object -Last 10"
由于sdcc没有代码占用信息输出,取而代之的是将信息输出到.mem文件,这里的伪目标show,将.mem文件内容直接显示了内容到终端中。芯片内存定义也根据手册了修改。
最后再vscode终端里输入,make就可以开始编译啦
结束
欢迎在评论区指出错误,提出疑问( ̄︶ ̄*))
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)