Python串口测试:pynrfjprog

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()

 

(完)