Zephyr开发环境搭建记录
以前总想着要自己造一个轮子,想着要做一个大融合的硬件抽象层以方便更换芯片。后来接触到zephr之后我就放弃了自己不成熟的想法,转而学习并使用zephyr系统平台。今记录下我自己在windows11上搭建zephyr软件开发环境的过程。有些别地方我自己也还没摸索清楚,但又怕时间长了忘记掉,就先记录了。
1、安装git和Cmake
这对于软件开发者来说已经是常用工具了,去官网下载并按照提示一步步安装下去即可。
2、安装python
去python官网下载最新的python3版本,本地安装。待确认python安装成功以后,执行命令“pip install west”安装zephyr的官方工具。
3、下载源码
打开CMD窗口,进入到你期望的文件夹内,执行“west init .”命令初始化west工作目录。
接着执行“west update”开始下载zephyr源代码。你很可能无法下载成功,因为zephyr的很多子仓库都是github上取下来的,所以你只能一次次不断地执行“west update”命令来尝试拉取zephyr源代码,指导所有的仓库代码都成功克隆到本地为止。(别灰心别丧气,在不同的时刻不断的执行总是能够全部拉下来的)
源代码下载成功之后,在CMD环境下利用PIP尝试运行“pip install -r zephyr\scripts\requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/” 安装依赖工具和包(请填写你对应的这个正确的地址,这里使用了清华源来加速下载)。下载之后会有这些目录:
D:\zephyrproject>dir /b . .west bootloader modules tools zephyr
4、其他工具
- 安装 swig 工具。这个工具可以去官网寻找并下载安装,下载的是源代码并包含有一个预编译的可执行文件“swig.exe”,将这个文件放到某个地方并将路径导入你的系统环境变量即可。如果你喜欢深入研究,可以自己参照里面的readme文件进行本地编译和安装。
- 安装设备树编译器。这个工具不好安装,官网只提供了源代码,如果你在windows上进行安装,还需要安装mingw这些编译链工具来执行编译。你可以执行“pip install git+git://git.kernel.org/pub/scm/utils/dtc/dtc.git@main”命令进行安装,不过基本都是失败的。我没有深入研究,这个没有影响到我的实际编译。尽管最后提示报错,但是我没有理它,编译也能通过。
- 安装7zip工具。这是一个压缩和解压工具,非常好用,而且是免费的。直接去官网下载并安装。
- 安装wget工具。使用过linux的人对这个工具应该是很熟悉的了,直接去官网下载并安装。
- 安装SDK工具。这是安装编译工具链的,去官网下载windows版本的到本地,然后将其解压到某个目录下,最后执行一次里面的setup.cmd脚本,按照提示输入Y回车即可。
5、尝试编译
打开CMD窗口,进入到 zephyr\samples\basic\blinky 目录下,再去 zephyr\boards\arm 目录下拷贝任何一个文件夹的名字,然后在CMD中输入“west build -d build -b <你复制的文件夹名字> . -DCONF_FILE=./prj.conf -p”进行编译。
- 这里的 “-d” 后面指明编译输出目录;
- 这里的 “-b” 后面指明目标板的名称;
- 参数 “-DCONF_FILE=./prj.conf” 表示指定工程配置文件;
- 参数 “-p” 表示清理环境(可能是prune这个单词)。
执行之后你会看到CMD窗口开始编译输出了。最后你能看到一些这样的信息说明成功了:
[1/151] Generating include/generated/version.h -- Zephyr version: 3.3.99 (D:/workspace/zephyrproject/zephyr), build: zephyr-v3.3.0-3914-gb0668cc586d9 [141/151] Linking C executable zephyr\zephyr_pre0.elf [145/151] Linking C executable zephyr\zephyr_pre1.elf [151/151] Linking C executable zephyr\zephyr.elf Memory region Used Size Region Size %age Used FLASH: 13726 B 256 KB 5.24% RAM: 4000 B 48 KB 8.14% IDT_LIST: 0 GB 2 KB 0.00%
编译周的hex文件就在 build\zephyr 目录下,默认叫做 zephyr.hex,同时还有 zephyr.bin,zephyr.elf,zephyr.dts 等文件生成。
如果你有自己的开发板,找一找 zephyr\boards\arm 目录下是否有你所用MCU对应型号的板子,一般厂家都会有的。如果你用的是不是arm的芯片,就去 zephyr\boards 目录下找其他CPU架构目录下的板子。比如你用的是ESP32的芯片,那你很可能需要去 zephyr\boards\xtensa 目录下找。
为什么要去这些目录下找呢?因为这些目录下的主板都是信息厂家提供的官方的开发板,里面的设备树都是芯片开发商帮你定义好了的,你一般也是基于芯片官方的参考设计进行的改动开发,所以你主要还是使用它们的设备树配置,最多就是自己建立一个 overlay 文件改动下引脚的定义、硬件功能的使能与禁用等。
如果你自己的板子有一颗LED灯,且它的IO定义与官方开发板下的定义不一致,那你只需要增加一个 “<你复制的文件夹名字>.overlay” 的文件,放在你的 blinky 目录下,然后重定义你的IO口就行了。比如我使用的是STM32F103的最小系统版本,上面的LED是PA2,与官方的不一致,我就自己新建了一个 stm32f103_mini.overlay 文件就,输入如下内容:
&green_led_1 { gpios = < &gpioa 0x2 0x1 >; };
最后执行“west build -d build - b stm32f103_mini” 编译就行了。至于这个文件里面的其他内容怎么定义怎么写,就需要去设备树的官网学些标准文档了。
一般地,可以在zephyr平级的目录下建立一个自己的工程代码目录,然后拷贝一个sample工程到这里先定制修改,然后逐步加入自己的代码文件。
6、烧录验证
编译成功之后,插入J-link和目标板,在CMD下执行“ west flash -d build ”即可启动烧录,但是你可能会执行失败。我想应该是没有配置好相关的参数导致的。
如果你有J-link工具,可以使用J-Flash进行烧录,否则可能需要安装OpenOCD工具来烧录了。我使用的是一个ST-Link工具,之前在MDK上用的时候是没问题的,但是我尝试用J-Link工具烧录时提示我的工具是盗版的,没办法就只能安装一个OpenOCD工具(下载超慢)来配合烧录。
使用命令“ openocd -f interface/stlink-swd.cfg -f target/stm32f1x.cfg -c "init;halt;flash write_image erase D:/zephyr.hex;reset;shutdown;" ” 执行烧录。
- 参数 “ -f interface/stlink-swd.cfg -f target/stm32f1x.cfg ” 要根据使用的烧录器和目标板来输入,两个都不能少。他们都在 OpenOCD\share\openocd\scripts 目录下。
- 参数 “ "init;halt;flash write_image erase D:/zephyr.hex;reset;shutdown;" ”看名字其实很好理解,halt是停止芯片运行,reset是复位芯片,shutdown是退出OpenOCD。
这里我碰到的难题是 OpenOCD总是检测不到我的烧录器,我去网上找了半天,说可能是我的ST-Link驱动无法被OpenOCD识别到,根据网上的资料执行 OpenOCD\drivers\UsbDriverTool.exe 工具,总提示失败,无奈最后再从网上找到一个 zadig-2.8.exe 工具,先在电脑的设备管理器中删除了现有的J-Link设备和驱动,利用这个zadig工具重新安装驱动才算成功。
还有一个关键的地方是,我的工具使用的是 SWD 烧录方式,需要修改 openocd 的配置文件,参考网上的提示,将 OpenOCD\share\openocd\scripts\interface\jlink.cfg 复制一份为 stlink-swd.cfg 并修改内容为:
adapter driver jlink transport select swd
最后使用的时候,指明 “ -f interface/stlink-swd.cfg ” 才算烧录成功。
做开发可能就是这样,总是会被第一步给难住。有恒心有毅力肯下功夫的人才能在这条路上越走越远,成就越来越高。