1 资源
- 1)官方仓库地址:https://github.com/ARMmbed/DAPLink.git
- 2)硬件:AIR32F103CBT6
2 生成指定工程
这里以合宙生产的 AIR32F103CBT6 芯片为主。所以可以使用合宙开源仓库:https://gitee.com/openLuat/daplink.git
该仓库当前(2024.9.28)已闭源,但是可以去 github 上搜索别人上传的
2.1 Setup
1)必备工具安装(见官方说明):
- (1)Python3,并添加 PATH
- (2)Git,添加 PATH
(3)编译器:
- GNU Arm Embedded Toolchain(被识别为 gcc_arm)
- Arm Compiler 6(被识别为 armclang,且仅支持 Linux 和 Windows)
- Keil MDK 或 Arm Compiler 5(被识别为 armcc,且仅支持 Linux 和 Windows)
- (4)GNU Make,CMake 可以和 ninja 的不同实现一起使用
- (5)virtualenv
其实,上述的 3~4 步骤中,可使用 CLion + OpenOCD + MinGW/Cygwin 替代(即 CLion 开发 STM32 环境,见其它文章)。
2.2 生成工程
1)由于个人比较习惯 JetBrains CLion,所以这里生成 cmake 工程(在 Windows Terminal 中执行):
# 1 初始化配置 git clone https://github.com/ARMmbed/DAPLink.git cd DAPLink pip install virtualenv # 安装 python 虚拟环境 virtualenv venv # 创建虚拟目录 # 2 激活 Python 虚拟环境 venv/Scripts/activate.bat # 激活虚拟环境(Linux 激活脚本为 activate.bat) pip install -r requirements.txt # 安装 python 依赖 # 3 构建 # 指定开发板类型为 stm32f103xb(否则将生成 DAPLink 支持的所有板子) progen generate -t cmake -v -p stm32f103xb_bl # bootloader progen generate -t cmake -v -p stm32f103xb_stm32f103rb_if # interface # -p,指定项目名,这里可通过 progen list 命令查看支持的项目 # -t,指定编译工具链,这里可通过 progen generate -t 查看支持的工具链。常用一般就 uvision5, cmake 等 # 4 制作完成后,关闭虚拟环境 venv/Scripts/deactivate.bat # 5 制作完成后,清理工程 # progen clean -t cmake
- 2)由于生成的项目如下:
if,即 interface,是实现程序烧录的 app,意为 daplink 提供接口,各个 mcu 自己去实现烧录功能;bl,即 bootloader,用来准备工具环境及升级 if。
3 构建 DAPLink
3.1 构建 stm32f103xb_bl
1)通过 CLion 将 \projectfiles\cmake\stm32f103xb\_bl\CMakeLists.txt 文件作为工程打开
arm-none-eabi-gcc 版本为 10.3-2021.10,MinGW 12.0
2)编译:
(1)项目打开成功后,编译时如果弹窗要选择打开 .py 文件的程序,则直接选择 python 程序:
原因:在 stm32f103xb_bl 目录下的 CMakeLists.txt 文件中,在其最下方有两处内容,Windows 下无法直接执行,需要选择可执行程序。
(2)编译结果:
3)烧录:
(1)如果使用 ST-LINK,那么选择 OpenOCD 的配置文件选择 st_nucleo_f103rb.cfg 即可(可能需要修改一下 id 号才能正常烧录)
(2)如果使用 CMSIS-DAP,那么可选择自定义配置文件,内容可如下:
source [find interface/cmsis-dap.cfg] transport select swd source [find target/stm32f1x.cfg]
(3)烧录完成后,通过 USB 连接开发板重新上电,“我的电脑” 将出现一个 “MAINTENANCE” 的 U 盘。
备注1:bl 烧录后无法正常启动。
查看 git history 发现,合宙官方在 arm/startup_stm32f103xb.S 文件中添加了一段汇编代码(作用见 luatos-soc-air32f103 项目的 air32f10x_rcc_ex.c)。
将这段代码复制到 gcc/startup_stm32f103xb.S 文件的对应位置即可。备注2:在烧录 bl 时,最好通过 keil 或 OpenOCD 将 mcu 的 flash 整片擦除掉,否则会因为 bl 无法校验通过而运行失败(原因呢这里先按下不表,算了,还是表了吧,就是因为 bl 运行时会校验 flash 中 app 起始地址的内容,如果不为初始值就不运行 bl)。
3.2 编译 stm32f103xb_stm32f103rb_if
- 通过同样的方式,将 stm32f103xb_stm32f103rb_if 构建出来
注意:不要直接烧录,而是将 stm32f103xb_stm32f103rb_if.hex “拖拽” 到 “MAINTENANCE” 的 U 盘中,如果 hex 正常的话,该 U 盘名称将变为 “DAPLINK”。
对于 AIR32F103CBT6 来说,bl 烧录完成后,
4 测试 DAPLINK
通过 OpenOCD 手动烧录。
1)连接好 DAPLINK 与 STM32F407 开发板后,以如下方式运行 OpenOCD:
openocd -d2 -f interface/cmsis-dap.cfg -f target/stm32f4x.cfg
2)通过 telnet 127.0.0.1 4444 连接 OpenOCD 服务端,输入以下命令:
> halt [stm32f4x.cpu] halted due to debug-request, current mode: Thread xPSR: 0x61000000 pc: 0x080001e0 msp: 0x2001fff0 > > > flash write_image erase "/path/to/jlcsky031_blink.hex" device id = 0x101f6413 flash size = 512 KiB auto erase enabled wrote 16384 bytes from file /path/to/jlcsky031_blink.hex in 0.806117s (19.848 KiB/s) > > > reset
参考
- 开发者指南:https://github.com/ARMmbed/DAPLink/blob/main/docs/DEVELOPERS-GUIDE.md
- DAPLink源码生成Keil工程并编译成功:https://blog.csdn.net/Pakin_Wu/article/details/127293806
- DAPLINK 移植(一):https://blog.csdn.net/m0_37636212/article/details/124980698
- DAPLINK 移植(二):https://blog.csdn.net/m0_37636212/article/details/124981472
- DAPLINK 移植(三):https://blog.csdn.net/m0_37636212/article/details/124983124
附录:STM32 丝印
1)手里面有两个 STM32F103RCT6 的板子,烧录时检测 FLASH 大小时有一片总出错(同样由于无法读取,默认 FLASH 为 512 KB),研究一下芯片上的信息:
- (1)第一行:ARM 代表 ARM 内核。后面的 X 代表 ST 版本:X,最终版;3,表示还要升级版本
- (2)第二、三行:型号。其中 RCT6 的含义如下表:
字符 | 含义 | 取值范围 |
---|---|---|
R | Pin count | K = 32 pins C = 48/49 pins R = 64 pins M = 80 pins V = 100 pins |
C | Code size | 6 = 32 KB 8 = 64 KB B = 128 KB C = 256 KB D = 384 KB E = 512 KB |
T | Package | I = UFBGA T = LQFP U = UFQFPN Y = WLCSP |
6 | Temperature range | 6 = Industrial temperature range, - 40 to 85 °C (105 °C junction) 3 = Industrial temperature range, - 40 to 125 °C (130 °C junction) |
- (3)第四行:出厂编号
(4)第五行:产地和生产时间:
- MYS:马来西亚;CHN:中国 CHINA;
- 544、539:分别表示 2015 年的 44 周 和 39 周
2)使用 ST-Link Utility 去读取两个芯片信息:前者可以读取到 FLASH 为 256 KB,后者却无法读取
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。