打印
[APM32F4]

APM32F407_PyOCD进阶使用小结

[复制链接]
16|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

前段时间整理学习了一下发现PyOCD使用的时候除了之前介绍的连接APM32F411的操作外(看这里:https://bbs.21ic.com/icview-3332210-1-1.html),有一个很好的方案进行我们的命令优化。

本文就使用基于极海家的APM32F407 TINY 的PyOCD进阶使用给大家介绍一下。

1 PyOCD也有工程设置

没错,正如本节标题所言,PyOCD也可以使用类似于工程设置类的操作进行我们要进行连接的一些预处理。

这个管理工程的文件是什么呢?是一个名字叫“pyocd.yaml”的文件。



这个文件的一个示例如下:

probes:
  066EFF555051897267233656: # Probe's unique ID.
    target_override:  stm32l475xg
    test_binary:      stm32l475vg_iot01a.bin

# Global options
auto_unlock: false
frequency: 8000000 # Set 8 MHz SWD default for all probes


示例文件中表示

1. 连接的仿真器ID是:066EFF555051897267233656,
2. 连接的芯片是stm32l475xg,
3. 测试的bin文件是:stm32l475vg_iot01a.bin
4. 自动解锁进行关闭
5. SWD连接频率是:8 MHz

除了上面设置的这些内容,我们还可以设置很多参数,比如说下面这两个:

1. dap_protocol:连接的协议,可以是“swd”、“jtag”或“default”。
2. pack:CMSIS 设备系列包的路径或路径列表。包中定义的设备将添加到可用目标列表中。

当然更多的参数,大家可以参考:[Session options list — pyOCD](https://PyOCD.io/docs/options.html)

对于我们在实际使用中,可以在我们的工作文件中,直接新建一个txt文件,然后修改命名为“PyOCD.yaml”即可。

然后修改我们建好的文件内容为自己需要的,如我的是:

pack:
  - Geehy.APM32F4xx_DFP.1.0.4.pack

target_override:  apm32f407ig

frequency: 1000000


2 连接控制与自定义命令

上文我们提到“工程管理”,那PyOCD也考虑到了我们不同的芯片会有不同的控制逻辑。特地给我们留了一个文件用于控制,于此同时这个文件也可以声明自定义的命令。

这个文件是:pyocd_user.py。

我们看官方的示例:

# This example applies to the ST STM32L0x1 devicess.

DBG_CR = 0x40015804

def did_connect():
    # Set STANDBY, STOP, and SLEEP bits all to 1.
    target.write32(DBG_CR, 0x7)


这个示例是演示了连接 STM32 设备后设置 DBGMCU_CR 寄存器。

我们可以使用python语言来编写这个脚本。

连接APM32F407,我想连接后就读取芯片的UID,可以这样写:

def did_connect(board) -> None:
    vecs = target.read_memory_block32(0x1FFF7A10, 3)
    print(f"uid:{vecs[0]:#010x}{vecs[1]:#01}{vecs[2]:#01}")


我们还可以自定义命令,读取芯片固件的SP等内容:

@command(help="Decode and print the first few vectors")
def vectable(base: int):
    vecs = target.read_memory_block32(base, 4)
    print(f"Initial SP:     {vecs[0]:#010x}")
    print(f"ResetHandler:   {vecs[1]:#010x}")
    print(f"NMI:            {vecs[2]:#010x}")
    print(f"HardFault:      {vecs[3]:#010x}")


同样的,我们可以解锁或上锁芯片:

@command(help="Clear read protection (set to level 0)")
def clear_rd():
    check_and_unlock_read_protection()

@command(help="Set read protection to level 1")
def set_rd():
    set_read_protection_level_1()   


3 实操

最后我们可以得到这样的效果:

1. 无需选择芯片:在工程目录启动CMD后,直接输入“PyOCD commander”,即可、
2. 设置读保护:自定义命令“set_rd”可设置读保护。
3. 读保护后无法读取内存。
4. 清除读保护:自定义命令“clear_rd”可去除读保护。
5. 读保护去除后可读取内存。



同样的,我们可以修改did_connect钩子,让它在连接的时候判断芯片是否读保护,若读保护自动进行清除:




这里是代码工程: APM32F407_PyOCD进阶使用小结_pyocd_prj.zip (4.53 MB)
希望本文对你有所帮助,欢迎评论区一起讨论~!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

208

帖子

11

粉丝