准备工作
Windows平台下编译OpenOCD可使用MSYS2或Cygwin64编译,这里考虑到方便复现的因素,将采用MSYS2平台。
CH347 OpenOCD在Windows平台下使用厂商驱动,需提前下载安装:
CH347官方JTAG驱动
源码仓库链接:
https://github.com/WCHSoftGroup/ch347/tree/main
MSYS2简介
MSYS2是一个工具和库的集合,提供了一个易于使用的类似Linux下的操作环境,用于构建、安装和运行本机Windows软件,你完全可以将他理解为一个交叉编译工具。相较于Cygwin,安装第三方依赖库更加的方便,详细介绍可直接浏览官网:
MSYS2简介
MSYS2下载
具体编译流程
安装后运行MSYS2 MINGW64.EXE
1、首先对系统库及第三方依赖库进行安装更新:
# 更新系统文件
pacman -Syuu
# 安装依赖关系
pacman -S libtool autoconf automake texinfo pkg-config make autogen git unzip bzip2 base-devel mingw-w64-x86_64-toolchain mingw-w64-x86_64-libusb mingw-w64-x86_64-libusb-compat-git mingw-w64-x86_64-hidapi mingw-w64-x86_64-libftdi mingw-w64-x86_64-arm-none-eabi-gcc mingw-w64-x86_64-capstone
过程时间较长,耐心等待。
2、git clone 基于ch347的openOCD源码:
# 克隆仓库
git clone https://github.com/WCHSoftGroup/ch347.git
# 获取submodule
git submodule init
git submodule update
至此源码下载完成。
如果受网络影响导致下载失败,最稳妥的方法是安装GitHub官方提供的GitHub Desktop软件进行下载。
3、进入OpenOCD_SourceCode_CH347目录进行编译:
注意:由于仓库中源码考虑到兼容性,使用了32位的动态库,这里若使用MSYS2编译32位程序,会出现很多依赖库问题。所以这里对源码进行一下改写:
打开src/jtag/drivers/ch347.c,LINE 1059:uhModule = LoadLibrary(“CH347DLL.DLL”);
改为:uhModule = LoadLibrary(“CH347DLLA64.DLL”)
同时由于编译环境原因,可能会提示添加#include <stdio.h>的问题,按照提示,在相应头文件添加即可。
# 进入源码目录
cd OpenOCD_SourceCode_CH347/
# 运行安装脚本
./bootstrap
# 使能CH347,其中YOUR_INSTALL_PATH为你所需要安装到的路径
./configure --enable-ch347 --prefix=YOUR_INSTALL_PATH CFLAGS="-w"
# 配置完成结果如下,可查看CH347是否成功使能
OpenOCD configuration summary
--------------------------------------------------
MPSSE mode of FTDI based devices yes (auto)
ST-Link Programmer yes (auto)
TI ICDI JTAG Programmer yes (auto)
Keil ULINK JTAG Programmer yes (auto)
Altera USB-Blaster II Compatible yes (auto)
Bitbang mode of FT232R based devices yes (auto)
Versaloon-Link JTAG Programmer yes (auto)
TI XDS110 Debug Probe yes (auto)
CMSIS-DAP v2 Compliant Debugger yes (auto)
OSBDM (JTAG only) Programmer yes (auto)
eStick/opendous JTAG Programmer yes (auto)
Olimex ARM-JTAG-EW Programmer yes (auto)
Raisonance RLink JTAG Programmer yes (auto)
USBProg JTAG Programmer yes (auto)
Espressif JTAG Programmer yes (auto)
Mode 3 of the CH347 devices yes
CMSIS-DAP Compliant Debugger yes (auto)
Nu-Link Programmer yes (auto)
Cypress KitProg Programmer yes (auto)
Altera USB-Blaster Compatible yes (auto)
ASIX Presto Adapter yes (auto)
OpenJTAG Adapter yes (auto)
Linux GPIO bitbang through libgpiod no
SEGGER J-Link Programmer no
Bus Pirate no
Use Capstone disassembly framework yes (auto)
# 接下来使用make install进行安装
make install
# 完成结果类似如下:
make[4]: Entering directory '/d/openocd_MSYS2/OpenOCD_SourceCode_CH347'
for i in $(find ./tcl -name '*.cfg' -o -name '*.tcl' -o -name '*.txt' | sed -e 's,^./tcl,,'); do \
j="/home/lzy/deploy/share/openocd/scripts/$i" && \
mkdir -p "$(dirname $j)" && \
/usr/bin/install -c -m 644 ./tcl/$i $j; \
done
make[4]: Leaving directory '/d/openocd_MSYS2/OpenOCD_SourceCode_CH347'
make[3]: Leaving directory '/d/openocd_MSYS2/OpenOCD_SourceCode_CH347'
make[2]: Leaving directory '/d/openocd_MSYS2/OpenOCD_SourceCode_CH347'
make[1]: Leaving directory '/d/openocd_MSYS2/OpenOCD_SourceCode_CH347'
需要注意的是,由于编译过程中涉及到中间文件链接:路径一定不要带有中文或特殊符号!否则将出现文件存在但始终提示No such file or directory.
功能验证
在MSYS2中进入安装目录,使用命令对单片机烧写程序。具体使用方法可参考:
开源项目OpenOCD搭配CH347实现对STM32固件下载
cmd调用会出现缺少DLL的问题,从MSYS2安装目录下的mingw64\bin目录下复制所缺的几个dll即可,这样就可以直接发给他人使用了。
如需通过cygwin编译参考以下博客,仓库下载源码后直接从第五步开始安装依赖和编译:
openOCD在windows下使用cygwin编译
参考目录
一个keil以外的开发选择: VS Code结合OpenOCD进行嵌入式开发
https://zhuanlan.zhihu.com/p/678930400
编译问题总结
在编译过程中总会遇到一些意想不到得问题,在这里对编译可能遇到得一些问题进行总结:
1、缺少libusb-1.x
此问题是由于缺少libusb1-0库导致
解决方案:下载libusb源码,在编译openocd的MSYS2上进行编译安装。安装步骤为:
./bootstrap.sh
./autogen.sh
./make install
2、警告被当成错误
解决方案:./configure命令时,修改编译选项:
./configure --enable-ch347 --prefix=YOUR_INSTALL_PATH CFLAGS="-O0 -Wno-error"
3、在某些文件中可能会提示需要添加stdio.h头文件
解决方案:按编译器要求添加