背景

目的是为了巩固硬件方面的理论知识,摸了那么多年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

image-20230104164906526

电脑接入CH549,然后按它上面的Download键进入Boot模式,在终端查找设备有没有连接上ch37x0的设备

image-20230104165422840

在/Linux/Bin目录里有编译好的工具,把它复制到项目文件夹,然后测试WCHISPTool_CMD工具能不能正常执行

image-20230104170200226

如果报错缺失libwch55xisp.so的话,可以在压缩包/Linux/lib/里找到,把它移动到/usr/lib/

image-20230104170505418

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

image-20230104172306080

下载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是可以直接跨平台的,没有这么多麻烦。