2022-2023-1 成为点灯大师-搭建SDCC+USB下载环境
背景
目的是为了巩固硬件方面的理论知识,摸了那么多年coding,自己还没好好做点东西玩。这学期本来也是有机会玩的,可惜不巧碰到自己的抑郁期一直摆烂没有心力,就这样不知不觉就到寒假来,寒假总是寻思着要搞点好玩的东西,就这样决定从点灯大师开始入手了。(以及给某电信专业天天叫苦的超级打工人沈某制造危机氛围)
在硬件材料上,在纠结钱多的STM32和C51之后选择了一块Arduino系列的ESP32-S3,和一块沁恒CH549,点灯大师就从CH549开始了。CH549是VeriMake教程推荐的,但是不管是VeriMake还是其他的STM32,STC51平台,他们推出的教程无一例外都是紧紧跟Windows绑定在一起,而我却偏爱Linux/Mac,这对我来说实在是非常痛苦的事情。难道我的点灯之路就要在虚拟机里开始?
所幸在群友推荐下我入了对跨平台支持比较好的ESP32,而沁恒这边,则是经过我的资料搜寻,终于找到了在Linux下独立完成代码烧录的方法。(在此吐嘈:沁恒的文档真是太乱了)
预备事项
以下操作在Deepin Community 20.8中实验完成
需要材料: 1.实验所需代码 2.ISP烧录工具 3.CH549.INI 4.头文件
1.下载烧录工具的压缩包解压
shell进入/Linux/driver
文件夹 ,执行sudo make install
电脑接入CH549,然后按它上面的Download键进入Boot模式,在终端查找设备有没有连接上ch37x0的设备
在/Linux/Bin目录里有编译好的工具,把它复制到项目文件夹,然后测试WCHISPTool_CMD工具能不能正常执行
如果报错缺失libwch55xisp.so的话,可以在压缩包/Linux/lib/里找到,把它移动到/usr/lib/
2.安装SDCC
直接用apt安装就可以:sudo apt install sdcc
安装完以后把前面下载的头文件移到sdcc目录下:/usr/share/sdcc/include/
测试一下sdcc编译:
lins@lins-PC:~/Documents/Test1$ mv ./1_gpio输出-led闪烁 ./gpio
lins@lins-PC:~/Documents/Test1$ cd gpio
lins@lins-PC:~/Documents/Test1/gpio$ sudo make clean
lins@lins-PC:~/Documents/Test1/gpio$ sudo make
下载BIN到CH549
这一步要用沁恒给出官方的CMD工具,但是比较坑的就是配置文件需要从windows版的ISPTools上保存,在上面已经放出来为保存的文件,如果你想对配置做什么改变也可以自己从win上保存一份。
mv ~/Downloads/CH549.INI ./
sudo ./WCHISPTool_CMD -p /dev/ch37x0 -c CH549.INI -o program -f ./gpio/Build/my.hex
如果是在Linux上进行sdcc编译 那么很容易报错说HEX转BIN失败。
=====ISP_Command_Tool=====
TOOL VERSION: V3.40
p:/dev/ch37x0
b:0
v:0
c:CH549.INI
o:0
f:./gpio/Build/my.hex
{"Device":"/dev/ch37x0","Status":"Ready"}
{"Device":/dev/ch37x0", "Status":"Fail","Code":11, "Message":"Fail to convert the flash file from HEX to BIN"}
出现这个报错的时候,可以用sdcc手动转换为Binary,此时就可以成功写入,下载成功后程序会自动启动。
cd ./gpio/Build/
sdobjcopy -I ihex -O binary my.hex my.bin
sudo ./WCHISPTool_CMD -p /dev/ch37x0 -c CH549.INI -o program -f ./gpio/Build/my.bin
=====ISP_Command_Tool=====
TOOL VERSION: V3.40
p:/dev/ch37x0
b:0
v:0
c:CH549.INI
o:0
f:./gpio/Build/my.bin
{"Device":"/dev/ch37x0","Status":"Ready"}
{"Device":"/dev/ch37x0", "Status":"Programming", "Progress":100%}
{"Device":/dev/ch37x0", "Status":"Finished", "Code":0,"Message":"Succeed"}
总结:
为了解决有时候hex无法转换的问题,可以在Makefile里添加上sdobjcopy的命令,
sdobjcopy -I ihex -O binary $@ $(tmpdir)/$(cname).bin
如:
#使用的编译器
CC = sdcc
#传入的c文件名
TARGET_ARCH = my
C_SOURCES = \
usr/main.c = \
C_INCLUDES = \
-Iinc \
-Isource \
CFLAGS=$(C_INCLUDES)
cname = my
proj = output
tmpdir = Build
usrdir = usr
all : $(tmpdir)/$(cname).ihx $(tmpdir)/$(cname).hex
OBJECTS = $(addprefix $(tmpdir)/,$(notdir $(C_SOURCES:.c=.rel)))
vpath %.c $(sort $(dir $(C_SOURCES)))
$(tmpdir)/%.rel: %.c Makefile | $(tmpdir)
$(CC) -c $(CFLAGS) $< -o $@
$(tmpdir)/$(cname).ihx: $(OBJECTS)
$(CC) $^ -o $(tmpdir)/$(cname).ihx
$(tmpdir)/%.hex: $(tmpdir)/%.ihx | $(tmpdir)
packihx $< $@ > $(tmpdir)/$(cname).hex
sdobjcopy -I ihex -O binary $@ $(tmpdir)/$(cname).bin
$(tmpdir):
mkdir $@
.PHONY : clean
clean :
rm $(tmpdir)/*.hex
rm $(tmpdir)/*.rel
rm $(tmpdir)/*.rst
rm $(tmpdir)/*.sym
rm $(tmpdir)/*.mem
rm $(tmpdir)/*.map
rm $(tmpdir)/*.lst
rm $(tmpdir)/*.lk
rm $(tmpdir)/*.ihx
rm $(tmpdir)/*.asm
rm $(tmpdir)/*.bin
这样直接make
,就可以获得到hex和bin两种文件了。
这套命令行理论上是可以在Macos下进行的,不知道为什么我这边一直连接不上显示Not ISP Device,最后只能算了,有点遗憾,不过好在ESP32是可以直接跨平台的,没有这么多麻烦。