还可以这样玩?极海半导体APM32F411系列MCU与pyocd的火花
APM32芯得 EP.34 | 还可以这样玩?APM32F411与pyocd的火花
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 程序控制
让程序停下
target.halt()
让程序继续运行
target.resume()
2.3 数据读取
数据的读取指令可以使用:
target.read32(address)
这个可以读取我们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的内容。
程序如下:
import time
from pyocd.core.helpers import ConnectHelper
# Replace the following string with your target device serial number
TARGET_DEVICE_SERIAL_NUMBER = '00350054500000144e5448590258'
# APM32F411 GPIOE base address and ODATA offset
GPIOE_BASE = 0x40021000
GPIOE_ODATA_OFFSET = 0x14
# Connect to the target device with the specified serial number
with ConnectHelper.session_with_chosen_probe(unique_id=TARGET_DEVICE_SERIAL_NUMBER) as session:
# Get the target object
board = session.board
target = board.target
# ensure the target device in the running state
target.resume()
# Compute the address of the ODATA register
gpioe_odata_address = GPIOE_BASE + GPIOE_ODATA_OFFSET
# Monitor PE5 and PE6 pin status
# Monitor 10 times
for i in range(10):
target.halt()
odata = target.read32(gpioe_odata_address)
pc = target.read_core_register("pc")
target.resume()
pe5 = (odata >> 5) & 0x1
pe6 = (odata >> 6) & 0x1
# Print the contents of the odata read
print("odata: %s " % bin(odata))
print(f'PE5: {"High" if pe5 else "Low"}, PE6: {"High" if pe6 else "Low"}')
# Read some registers.
print("pc: 0x%X" % pc)
print("")
# Wait 0.5 seconds
time.sleep(0.5)
程序运行(vscode)起来得到的结果如下:
发现可以读取回来PE5/PE6的状态,且可以明确知道此时PC的内容。
3.2 解除/上锁APM32F411的读保护
由于我们的程序烧录进APM32F411后一般会对它进行读保护的操作,从而使得我们的程序不会被“有心人”读取**。
通过查阅APM32F411的手册,我们知道对其进行上读保护的操作的流程有:
1. 解锁选项字节编程区域;
2. 对读保护进行操作;
3. 重载选项字节。(PS:重载选项字节会引起复位,此时我们需要重新连接SWD,才能重新读取内容)
下面就根据这个流程对python脚本进行设计。
import time
from pyocd.core.helpers import ConnectHelper
# Replace the following string with your target device serial number
TARGET_DEVICE_SERIAL_NUMBER = '00350054500000144e5448590258'
# APM32F411 Option Bytes related register addresses and key values
FMC_OPTKEY = 0x40023C08
FMC_OPTCTRL = 0x40023C14
OPTCTRL_BYTE1_ADDRESS = FMC_OPTCTRL + 1 # Points to the second byte of OPTCTRL
FMC_OPT_KEY1 = 0x08192A3B
FMC_OPT_KEY2 = 0x4C5D6E7F
OB_RDP_LEVEL_1 = 0x55 # Level 1 read protection
OB_RDP_LEVEL_0 = 0xAA # No read protection
# Connect to the target MCU
with ConnectHelper.session_with_chosen_probe(unique_id=TARGET_DEVICE_SERIAL_NUMBER) as session:
target = session.board.target
# Read the current value of OPTCTRL
optctrl_value = target.read32(FMC_OPTCTRL)
rdp_level = target.read8(OPTCTRL_BYTE1_ADDRESS) # Read the second byte directly
if rdp_level != OB_RDP_LEVEL_0:
print("Target MCU is already read protected")
else:
print("Target MCU is not read protected, proceeding with read protect operation...")
# Unlock Option Bytes programming
if optctrl_value & (1 << 0): # Check the OPTLOCK bit
target.write32(FMC_OPTKEY, FMC_OPT_KEY1)
target.write32(FMC_OPTKEY, FMC_OPT_KEY2)
optctrl_value = target.read32(FMC_OPTCTRL)
print("optctrl_value: 0x%X" % optctrl_value)
# Set the read protection level (only modify the second byte)
target.write8(OPTCTRL_BYTE1_ADDRESS, OB_RDP_LEVEL_1)
# Start the Option Bytes programming
optctrl_value = target.read32(FMC_OPTCTRL)
optctrl_value |= (1 << 1) # Set the OPTSTRT bit
print("optctrl_value: 0x%X" % optctrl_value)
target.write32(FMC_OPTCTRL, optctrl_value)
# Wait for programming to complete and trigger a reset
while True:
optctrl_value = target.read32(FMC_OPTCTRL)
if not (optctrl_value & (1 << 1)): # Wait for the OPTSTRT bit to be cleared
break
# Perform a hardware reset of the target MCU
session.probe.reset()
# Wait 0.5 seconds
time.sleep(0.5)
# Re-establish the connection after the reset
with ConnectHelper.session_with_chosen_probe(unique_id=TARGET_DEVICE_SERIAL_NUMBER) as new_session:
new_target = new_session.board.target
# Verify if read protection has been successfully set
new_optctrl_value = new_target.read32(FMC_OPTCTRL)
new_rdp_level = (new_optctrl_value >> 8) & 0xFF
if new_rdp_level == OB_RDP_LEVEL_1:
print("Read protect operation successful")
else:
print("Read protect operation failed")
脚本运行结果如下:
当然笔者也给大家准备了解锁的操作的脚本,脚本运行结果如下:
《APM32芯得》系列内容为工程师用户使用极海半导体APM32系列产品的经验总结,均转载自21ic论坛极海半导体专区,全文未作任何修改,未经原文作者授权禁止转载。
- |
- +1 赞 0
- 收藏
- 评论 0
本文由ll转载自Geehy极海半导体公众号,原文标题为:APM32芯得 EP.34 | 还可以这样玩?APM32F411与pyocd的火花,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
相关研发服务和供应服务
相关推荐
【经验】如何在JFLASH中添加极海半导体Geehy APM32系列MCU
本文主要介绍极海半导体MCU产品如何使用第三方Segger公司的JFLASH配合J-Link仿真器对指定型号MCU的Flash进行擦除、写入及读取操作的目的。
【经验】APM32F4 MCU在RT-Thread系统上添加以太网驱动和使用LwIP网络组件的方法
本文详细介绍了如何将极海半导体APM32F4 MCU在RT-Thread系统上添加以太网驱动和使用LwIP网络组件,其他APM32带有以太网控制器的MCU,在RT-Thread使用LwIP网络功能也是大同小异的,按照这个过程基本都可以把网络功能应用起来。
APM32芯得 | 基于极海APM32E103系列MCU的SPI转CAN芯片MCP2515移植测试
极海半导体APM32E103系列MCU支持CAN协议2.0A和2.0B,通信波特率最大为1Mbit/s,并且拥有双CAN接口,能适应更多的应用场合。将杜邦线按照引脚配置,接好线后仿真就能测试回环模式下收发数据了。可以看到断点打到接收部分,可以接收到CAN数据,与发送的数据一致。
tandby模式下,如何唤醒MCU APM32的RTC与WKUP?
APM32F103系列低功耗模式有三种:睡眠模式、停止模式和待机模式。通过关闭内核、时钟源、设置调压器来降低功耗。本文极海半导体解析了APM32的tandby模式下的RTC唤醒与WKUP唤醒功能如何实现。
极海半导体32位MCU-M0选型表
极海半导体的APM32系列是基于Arm® Cortex®-M0+/M3/M4内核的优质国产32位通用MCU,具有低功耗、高性能、高集成度以及快速移植等特性。凭借优异的系统性能、丰富的协处理功能以及灵活的使用体验,有助于用户缩短产品设计时间、降低开发成本、实现性能最优化。
产品型号
|
品类
|
内核
|
Frequency(MHz)
|
FLASH(KB)
|
SRAM(KB)
|
I/Os
|
Vmin(V)
|
Vmax(V)
|
GPTMR(16bit)
|
GP TMR(32bit)
|
Advanced TMR(16bit)
|
Basic TMR
|
Systick(24bit)
|
ADC 12-bit Cell
|
ADC 12-bit channels
|
DAC 12-bit Cell
|
DAC 12-bit channels
|
Analog Comparator
|
TSC (Channels)
|
SPI
|
I2S
|
I2C
|
U(S)ART
|
CAN
|
SDIO
|
USB Device
|
Package
|
对照型号
|
APM32F072V8T6
|
32位MCU
|
ARM Cortex-M0
|
48MHz
|
64KB
|
16KB
|
87
|
2V
|
3.6V
|
5
|
1
|
1
|
2
|
1
|
1
|
16
|
1
|
2
|
2
|
24
|
2
|
2
|
2
|
4
|
1
|
0
|
1
|
LQFP 100
|
-
|
选型表 - 极海半导体 立即选型
APM32芯得 EP.38 | TinyMaix赋予APM32F411 AI推理能力
TinyMaix是矽速科技开发的轻量级机器学习库,适用于微控制器,能在资源受限的MCU上运行深度学习模型。它支持多种芯片架构和模型转换,具有低内存消耗和用户友好接口。文章介绍了TinyMaix在APM32F411 MCU上的移植过程,包括源码准备、工程配置、编译器设置、解决编译错误和实现计时函数。移植后,TinyMaix能够成功运行手写数字识别、人像检测和图片分类等实例。
【应用】极海半导体MCU APM32F103系列用于HMI人机界面,可满足HMI功耗调整、蓝牙通信等需求
本文推荐采用极海半导体推出的APM32F103系列MCU作为HMI人机界面的主控,最高96MHz工作频率,FLASH 256K,SRAM 64K,支持FPU单元;资源丰富,有CRC/RTC/DMA通道,两个DMA;通信接口丰富。
【经验】极海MCU APM32F103 IAP的实现方式
拿到了一块APM32F103VC的MINI开发板,在学习了一段时间后发现其有非常丰富的外设资源,主频能达到96Mhz。最近在项目中使用到了IAP(In Application Programming)功能,特来评估一下APM32F103的IAP实现方式。
APM32芯得 | 基于APM32F411控制的一个软开关电路设计分享
本文介绍的软开关电路,并不是开关电源里面的软开关概念,而是系统供电的开关,结合MCU等控制芯片,控制系统供电的开启或关断。
极海半导体32位MCU-M3选型表
极海半导体的APM32系列是基于Arm® Cortex®-M0+/M3/M4内核的优质国产32位通用MCU,具有低功耗、高性能、高集成度以及快速移植等特性。凭借优异的系统性能、丰富的协处理功能以及灵活的使用体验,有助于用户缩短产品设计时间、降低开发成本、实现性能最优化。
产品型号
|
品类
|
内核
|
Frequency(MHz)
|
FLASH(KB)
|
SRAM(KB)
|
SDRAM
|
FPU
|
I/Os
|
Vmin(V)
|
Vmax(V)
|
GPTMR(16bit)
|
GP TMR(32bit)
|
Advanced TMR(16bit)
|
Basic TMR
|
Systick(24bit)
|
ADC 12-bit Cell
|
ADC 12-bit channels
|
DAC 12-bit Cell
|
DAC 12-bit channels
|
Analog Comparator
|
EMMC
|
SPI
|
I2S
|
I2C
|
U(S)ART
|
CAN
|
SDIO
|
Package
|
对照型号
|
APM32E103CET6
|
32位MCU
|
ARM Cortex-M3
|
120MHz
|
512KB
|
128KB
|
0
|
1
|
37
|
2V
|
3.6V
|
4
|
0
|
1
|
2
|
1
|
2
|
10
|
2
|
2
|
0
|
0
|
3
|
2
|
2
|
3
|
2
|
0
|
LQFP48
|
STM32F103RET6
|
选型表 - 极海半导体 立即选型
【选型】APM32F411 MCU的电机控制方案可实现PMSM的无感FOC双电机控制,支持三电阻、单电阻电流采样
面向电机市场,极海半导体APM32F411 双电机控制系统提供了高适用性与高性价比的单芯片控制方案,以满足高端消费电子与工业控制领域的不同需求。随着电机应用产品智能化及物联网升级,极海半导体将持续在产品、方案与支持等各方面寻求创新,为用户打造优质的应用生态环境。
APM32芯得 EP.35 | APM32F411为什么要有ISP,你知道多少?
APM32F411支持ISP启动,适合在不同编程阶段使用。ISP不占额外flash,节省成本,且适用于量产和远程维护。该芯片支持USART/I2C/SPI/USB等多种通信总线进行flash编程,使用Geehy评估软件可轻松完成程序下载与运行。
【应用】国产工业级高性能MCU APM32F407VGT6用于PLC工控板,主频168MHz,通信外设丰富
某客户主要做各种工业自动控制系统装置,其中一款国产PLC工控板主控要更换成国产物料,推荐极海工业级高性能MCU APM32F407系列,主频高达168MHz、通信外设资源丰富,工作温度范围-40℃到+85℃。
APM32芯得 EP.33 | 栈回溯方法自动分析定位APM32 Hardfault错误
《APM32芯得》系列内容为用户使用APM32系列产品的经验总结。以 APM32F411 为例进行分析,介绍使用栈回溯方法自动分析定位 Hard Fault 错误。
基于极海半导体APM32F411工业级高适配型MCU的移动电源控制板应用方案
随着技术的发展,消费者对移动电源产品品质和体验提出了更高要求,除了储电量、安全性、便携度等基本要求,更具美观、多功能、人性化等优势的产品才能赢得消费者的青睐。采用极海APM32F411RET6工业级高适配型MCU作为主控的移动电源控制板方案,满足性能、功能、体积等综合设计需求,可帮助客户打造更具性价比和市场竞争力的移动电源产品。
电子商城
现货市场
服务
可定制显示屏的尺寸0.96”~15.6”,分辨率80*160~3840*2160,TN/IPS视角,支持RGB、MCU、SPI、MIPI、LVDS、HDMI接口,配套定制玻璃、背光、FPCA/PCBA。
最小起订量: 1000 提交需求>
拥有IC烧录机20余款,100余台设备,可以烧录各种封装的IC;可烧录MCU、FLASH、EMMC、NAND FLASH、EPROM等各类型芯片,支持WIFI/BT模组PCBA烧录、测试。
最小起订量: 1 提交需求>
登录 | 立即注册
提交评论