如何使用pyOCD,或从Python打开OCD

问题描述 投票:0回答:1

我想使用

pyOCD
(或打开 OCD)与
STLink
STM32
MCU 进行某些操作。我找到了这个命令列表https://pyocd.io/docs/command_reference.html#find但我对此并不明智 - 我真的不理解语法。

EG 我想将 .bin 文件加载到特定地址的内存中: 文档说: load FILENAME [ADDR] ....所以我写到控制台: pyocd load myBin.bin 0x8005000 但它不起作用 - 它忽略了 addr - 它可能会刷新 bin 文件,但不会在我想要的地址上。

基本上我想用Python写6个函数:

  1. 检查某些ST链接是否连接到PC(Windows)
  2. 检查是否有某个MCU连接到STlink
  3. 擦除连接的MCU
  4. 加载.bin文件到MCU
  5. 能够读取特定值并将其写入 MCU 的特定地址
  6. 复位MCU

像 python 库一样使用它会很棒,但我绝对不知道如何使用它,所以我会选择命令行 - 在 python 中使用子进程

谢谢你

python gdb stm32 openocd
1个回答
0
投票

我有一个使用 Python 的工作设置来完成您想要的大部分任务。对于大多数部分,有不同的归档方式。

1)使用子进程和STM32_Programmer_CLI
步骤 1-4 和 6 可以直接使用 STM32 的工具来完成。我使用此代码片段来检查设备是否已连接(在本例中为 STM32G0)。当设备可用时,可以连接到它并读取其 UID,然后进行解析。使用标准输出还可以检查调试器是否可用。如果您正在讨论来自 Flash 的静态值(如示例中所示),则列表中的第 5 步也是可能的。如果您需要实时值,事情会变得更加复杂。

def read_uid():
    # STM32_Programmer_CLI -c port=SWD mode=HOTPLUG -r32 0x1FFF7590 12
    uid = ''
    cmd = ["STM32_Programmer_CLI", "-c port=SWD mode=HOTPLUG -r32 0x1FFF7590 12"]
    with subprocess.Popen(cmd, stdout=subprocess.PIPE) as proc:
        for line in proc.stdout:
            data = line.strip().decode().split()
            if data:
                if data[0] == '0x1FFF7590':
                    uid = ''.join(data[2::])
    stm32_uid.stm32uid = uid
    return uid

2)使用OpenOCD和telnet
对于更复杂的用例或在调试期间读取实时值,我使用 OpenOCD 和 telnet 连接的组合。我无法让 pyOCD 或主要 OpenOCD 与 STM32 一起运行(可能只是因为配置问题),但使用 OpenOCD 的STMicroElectronics 分支解决了它。它与 STM32CubeIDE 一起提供,并可在“运行->调试配置”设置中用作调试器。它非常有用的一点是,您可以看到用于启动调试器的命令行选项,并为您的项目重用创建的配置文件。

有了这个,您可以将 OpenOCD 作为子进程启动,然后通过 telnet 连接到它。

import subprocess import telnetlib debugger = subprocess.Popen([r"stm32cube_openocd_win32\tools\bin\openocd.exe", "-f", r"utilities\OpenOCD_config.cfg", "-s", r"utilities\stm32cube_openocd_win32\resources\openocd\st_scripts", "-c", "telnet_port 4444"]) tel = telnetlib.Telnet('localhost', 4444) def read_data(): return tel.read_until(b"\r\n", 1.0) def cmd(command): tel.write((f"{command}\r\n").encode()) return read_data() try: cmd("reset run") print(read_data().decode()) print(cmd('mdw 0x1FFF7590 3')) print(read_data().decode()) except Exception as e: print(f"Error: {e}") tel.close() debugger.terminate()
配置文件和st_scripts来自STM32CubeIDE安装。脚本存储在 

plugins/com.st.stm32cube.ide.mcu.debug.openocd_XXX 文件夹中。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.