pynrfjprog是Nordic维护的开源库,能够对nRF系列芯片执行重启、读写擦Flash等操作。在串口测试任务中,我们利用它来自动下载hex,或重启设备以复位测试状态。
本文介绍它的一些常用功能。
1. 安装和导入包
$ pip install pynrfjprog
from pynrfjprog.LowLevel import API
from pynrfjprog.Hex import Hex
from pynrfjprog.APIError import APIError
2. 连接API
nrf52_api = API('NRF52')
nrf52_api.open()
可选的芯片类型有:NRF51,NRF52,NRF53,NRF91,UNKNOWN。
在初始化API时候需要指定芯片类型,如果使用UNKNOWN,那么它将自动探测芯片类型。
3. 获取设备信息
def device_get(api):
device_list = []
# 返回所有已连接的设备列表
sn_list = api.enum_emu_snr()
if sn_list is None:
return device_list
for sn in sn_list:
# 获取该设备信息(串口号,SN号)
device_info = api.enum_emu_com_ports(sn)
device_list.append(device_info)
return device_list
该函数返回一个列表,列表内容为已连接的设备信息,包括设备的串口号(比如COM1)和SN号(比如682914396)。
pynrfjprog的API大多数使用SN号作为传入参数,串口库(pyserial)需要串口号作为传入参数。
4. 连接设备
def device_connect(api, sn=None):
if sn == None:
api.connect_to_emu_without_snr()
else:
try:
api.connect_to_emu_with_snr(sn)
except (ValueError, APIError):
print('Invalid serial number')
finally:
api.close()
5. 擦除设备Flash
def device_erase(api):
api.erase_all()
6. 烧录hex
def device_program(api, hex_file):
segments = Hex(hex_file)
for seg in segments:
api.write(seg.address, seg.data, True)
7. 重启设备
def device_reset(api):
api.sys_reset()
api.go()
8. 断开连接
nrf52_api.disconnect_from_emu()
nrf52_api.close()
9. 更多功能
pynrfjprog还能读取内存值,Flash值,寄存器值,甚至操作RTT。
此外,pynrfjprog还提供了一些动态链接库文件(*.dll),能够实现一些High Level的功能,比如烧录hex文件有probe.program(hex_file, option)函数。
10. 示例
下面示例演示:擦除、烧录hex、重启。
from pynrfjprog.LowLevel import API
from pynrfjprog.Hex import Hex
from pynrfjprog.APIError import APIError
hex_file_path = r'C:\blinky_pca10040_s132.hex'
if __name__ == '__main__':
nrf52_api = API('NRF52')
nrf52_api.open()
device_connect(nrf52_api)
device_erase(nrf52_api)
device_program(nrf52_api, hex_file_path)
device_reset(nrf52_api)
nrf52_api.disconnect_from_emu()
nrf52_api.close()
(完)