前几天脑袋一热,买了个STC89C52RC芯片的单片机,打算点个灯。
又在wzt的影响下使用vsc和sdcc的编写模式。
2024-08更新
犯蠢了,直到今天重新拿起来单片机学习才发现,下文中的代码和8052.h
的头文件是sdcc提供的,不需要从stc-isp
里下载头文件再手动转换,可以直接写。但是可能只有比较基础的定义,缺少一些stc89c52的特殊功能,所以还是保留转换的方式了。
2022-08更新
有大佬实现了将c51和头直接转换为sdcc代码的网页,这是链接在网页中,把你的 Keil C51 C 代码转换成 SDCC 格式 - VeriMake
需要好好打出来分隔符,不然没法转换不带分隔符的例如A=B
这种格式
所以我自己写了个自己使用的
SDCC
sdcc Windows amd64 mingw32环境安装包下载地址。
同样,你可以在这里查询所有供windows下载的版本。SDCC - Snapshot Builds (sourceforge.net)
启动安装包,随后一路next安装即可。
安装成功后在命令行输入sdcc
以验证是否安装成功。
vsc配置
安装vsc
为vsc安装插件
- 安装
C/C++
插件 - Chinese (Simplified) Language Pack for Visual Studio Code(可选)
获取sdcc适用的STC89C52RC头文件
实际上,STC89C52RC
可以使用8052.h
头文件(位于include/mcs51/
,该头文件内include了8051头文件,这个头文件是定义的主体),简单检查后发现寄存器等的定义几乎相同,但是对寄存器的使用语法和定义风格发生了变化。
由于stc-isp软件导出的该芯片的头文件不被sdcc识别,所以我们也可自行转换导出的头文件。
突然要用 STC 写个东西,但是发现没有SDCC头文件,写个工具转… (amobbs.com 阿莫电子论坛)
9楼以将转换器封装为exe可执行文件,可以根据层主使用方法直接使用。
但是可能会在编译步骤在此头文件中报错,可将报错行注释掉。也可自行尝试解决
程序编写之前
为了让vsc能够识别并辅助编写代码,需要对vsc进行配置。
在vsc界面按下Ctrl+Shift+P
,选择c/c++编辑配置
包含路径项(includePath)
在此项中填写SDCC安装路径\include\msc51
来让vsc可以查找到8052.h
例:C:\Program Files\SDCC\include\mcs51
lint.h
这是一个位于SDCC\include\mcs51\lint.h
的兼容头,写在文件中可以让vsc识别sdcc的语法。
第一个程序
新建一个名为helloworld.c
的文件。输入
1 |
|
保存。
在vsc中输入sdcc helloworld.c
来编译它,随后会生成一堆文件。随后使用packihx .\helloworld.ihx >.\helloworld.hex
将ihx文件转化为hex文件。然后在
stc-isp中选中STC89C52RC/LE52RC
芯片,在安装驱动情况下选中串口,点击打开程序文件
,随后点击下载/编程
。开始需要检测mcu选项,需要冷启动。我购买的是完整的开发板,按下开关重启即可。正常来说,05口已经可以持续输出低电平,连接一个led到vcc和05口,可以发现正常使用。
踩坑
2024年更新:似乎现在的stc-isp已经支持intel hex格式的文件了
我通过packihx
生成的hex在下载到单片机上后无法发挥作用,检查后发现packihx打包的hex文件不是标准二进制格式,而是intel hex的文本描述格式,因而无法正常烧录。查阅资料后发现可以通过sdobjcopy
打包生成的bin文件可正常通过stc-isp下载,这是指令:sdobjcopy.exe -I ihex -O binary .\helloworld.ihx .\helloworld.bin