#申请原创# @21小跑堂
1 背景
前段时间学习了一下如何使用pyocd配合APM32F411VCTINY板在命令行下给它进行各种骚操作,在使用一段时间后就想着:pyocd是基于python的,那是不是也可以使用python脚本+pyocd使用起来呢?
完成我们的一些重复的操作的自动化(因为我比较懒),嘿嘿。想到就去做。
2 pyocd 的python api
之前有介绍pyocd的时候发现遗漏了pyocd的api没有看,它还给了利用python+pyocd的一些例子(https://pyocd.io/docs/api_examples.html)。
比如下载bin文件的例子。
本文档就对近段时间我学习到的pyocd+python,基于APM32F411TINY板的一些收获。由于我也是初学python,里面的一些不科学的操作,也请大家指出斧正。此致感谢!
2.1 连接
首先是连接的API:
- session_with_chosen_probe()
这个api主要是控制我们选择哪个link去连接目标芯片,可以使用link的UID去指定,比如说我这里的link UID是:00350054500000144e5448590258(注:可以在CMD命令行用:pyocd list命令查看)。
那我这里设置指定使用我的 Geehy CMSIS-DAP WinUSB的设置就是:
- ConnectHelper.session_with_chosen_probe(unique_id='00350054500000144e5448590258')
2.2 程序控制
让程序停下
让程序继续运行
2.3 数据读取
数据的读取指令可以使用:
这个可以读取我们MCU的flash、ram、外设寄存器等内容。
我们也可以使用指令:
- target.read_core_register("pc")
读取我们程序的运行到的地方。
2.4 数据写入
数据的写入,我们可以使用:
- target.write32(address,data)
这个可以对我们MCU的fram、外设寄存器等可以直接写入内容的地址进行操作。
Q:为什么不能直接对Flash进行直接写入?
A:因为flash的写入其实是flash控制器(解锁、控制、状态等寄存器),去进行的。我们通过swd的指令只能通过操作flash的控制器,从而才能对Flash进行写入。
3 程序设计
我这里设计了两个程序,对学习到的知识进行验证。
3.1 读取PE5/6的状态
这个程序我设想的是,我的APM32F411VCTINY板已经下载了一个LED闪烁的程序,我要知道LED当前的一个状态。这个其实可以类比于一个黑盒子(芯片端),我们在不开盒子的情况下去获取我们想知道的寄存器信息。
程序的基本设计流程:
1. 连接APM32F411VC,
2. 读取GPIOE的ODATA寄存器,用于判断PE5/PE6的高低电平。
3. 输出寄存器内容,PE5/PE6的状态,以及相应的PC的内容。
程序如下:
|