头图

1 资源

2 生成指定工程

这里以合宙生产的 AIR32F103CBT6 芯片为主。所以可以使用合宙开源仓库:https://gitee.com/openLuat/daplink.git
该仓库当前(2024.9.28)已闭源,但是可以去 github 上搜索别人上传的

2.1 Setup

  • 1)必备工具安装(见官方说明):

    • (1)Python3,并添加 PATH
    • (2)Git,添加 PATH
    • (3)编译器:

        1. GNU Arm Embedded Toolchain(被识别为 gcc_arm)
        1. Arm Compiler 6(被识别为 armclang,且仅支持 Linux 和 Windows)
        1. 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

参考

附录:STM32 丝印

1)手里面有两个 STM32F103RCT6 的板子,烧录时检测 FLASH 大小时有一片总出错(同样由于无法读取,默认 FLASH 为 512 KB),研究一下芯片上的信息:

  • (1)第一行:ARM 代表 ARM 内核。后面的 X 代表 ST 版本:X,最终版;3,表示还要升级版本
  • (2)第二、三行:型号。其中 RCT6 的含义如下表:
字符含义取值范围
RPin countK = 32 pins
C = 48/49 pins
R = 64 pins
M = 80 pins
V = 100 pins
CCode size6 = 32 KB
8 = 64 KB
B = 128 KB
C = 256 KB
D = 384 KB
E = 512 KB
TPackageI = UFBGA
T = LQFP
U = UFQFPN
Y = WLCSP
6Temperature range6 = 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,后者却无法读取


送南阳马生序
7 声望1 粉丝

余之业有不精、德有不成,非天质之卑,则心不若他之专耳,岂他人之过哉!