我想使用
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个函数:
像 python 库一样使用它会很棒,但我绝对不知道如何使用它,所以我会选择命令行 - 在 python 中使用子进程
谢谢你
我有一个使用 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 一起提供,并可在“运行->调试配置”设置中用作调试器。它非常有用的一点是,您可以看到用于启动调试器的命令行选项,并为您的项目重用创建的配置文件。
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 文件夹中。