<?xml version="1.0" encoding="utf-8"?>
<ul>
  <li>本文由以下原始文章合并整理而成，原始版本见备份目录。原文1：others-nRF7002WIFI扫描与连接RAM大小nRF7002WIFI扫描与连接RAM大小测评工具：SCAN:nRF9160DK(PCA10090)+nRF7002EK(PCA63556)STA:nRF52840DK(PCA10056)+nRF7002EK(PCA63556)编译示例方法参考资料：链接减少nRF7002WIFI占用的方法：链接参考资料：链接参考资料：链接原文2：others-WIFI芯片MAC地址问题WIFI芯片MAC地址问题错误原因：新wifi芯片里面是没有烧录MAC地址的需要使用OTP进行烧录。调试程序阶段通过宏配置wifimac地址：CONFIG_WIFI_FIXED_MAC_ADDRESS参考资料：链接原文3：others-NordicWIFI简介NordicWIFI简介第2页第3页第4页第5页第6页参考资料：链接原文4：others-nRF7002WIFI上电时序nRF7002WIFI上电时序第2页原文5：others-nRF7002测试与功耗测评nRF7002测试与功耗测评SDK：NCSV2.3.0下载地址：链接example：ncs\v2.3.0\nrf\samples\wifi\shellReadme：ncs\v2.3.0\nrf\samples\wifi\shell\README.rst测试软件：sscom测试指令：wifiscanwificonnectwifi名称wifi密码wifistatusnetdnsbaidu.comnetping202.108.22.5nRF7002SDKsta例程功耗nRF7002相关示例：ImplementingMQTToverWi-FionthenRF7002DevelopmentKit：链接源码：链接TargetWakeTimeonthenRF7002DK：链接第3页第4页nRF7002功耗测评DTIM模式Wi-Fi6中引入的主要省电功能是目标唤醒时间（TWT），它允许设备在睡眠模式下花费更多时间并更确定地接收数据，从而进一步降低功耗。那么此功能实际上是如何工作的，它与传统的Wi-Fi节能有何不同？Wi-Fi接入点（AP）以称为信标间隔的间隔传输信标 ，以通知附近的设备其存在。附近的Wi-Fi设备使用信标来决定连接到哪个AP. 信标数据包可以包含传递流量指示消息（DTIM）。DTIM是一条消息，通知设备AP已缓冲该设备的数据，并将触发它唤醒以接收数据。DTIM与信标数据包一起发送的频率由DTIM周期决定。例如，DTIM间隔为2表示每隔一个信标都发送DTIM消息.信标和DTIM间隔通常可从接入点配置。大多数路由器允许20毫秒到1000毫秒的信标间隔和1到255的DTIM间隔。DTIM间隔越高，设备可以休眠的时间越长，节省的电量就越多。但是，信标和DTIM间隔由AP确定，这意味着连接到该AP的所有设备都会同时唤醒。由于AP一次只能与一个设备通信，因此所有等待接收数据包的设备都必须保持空闲状态，直到AP准备好将其数据包传输给它们，这会耗尽电池电量。此外，较高的DTIM间隔会降低无线性能。目标唤醒时间随着TWT的引入，Wi-Fi设备可以单独协商何时以及多久与AP一起唤醒。Wi-Fi设备可以协商自己的TWT协议，也可以成为AP上已存在的TWT广播会话的成员。设备只需唤醒设备所属的TWT广播会话。此外，允许设备休眠的时间长度会显著增加。从理论上讲，Wi-Fi6设备可以睡眠多年而不会醒来。TWT应与设备上运行的应用程序保持一致。这意味着应用程序应预测流量，并确保它可以在休眠期间对网络视而不见。还值得一提的是，AP通常还对在丢弃缓冲消息之前存储缓冲消息的时间有限制。这不是由Wi-Fi规范决定的，但通常是为了实用性而实施的。如果有大量传入数据，并且设备长时间休眠，则AP可能会丢弃一些帧。理想情况下，应用程序在TWT会话中休眠时不应期望传入数据。它适用于主要具有可预测的上行链路和下行链路数据的应用程序，而不是要求设备响应网络通知的应用程序。有关nRF70系列节能的更多信息，请参阅在省电模式下运行。测试环境nRFConnectSDK， v2.2.9.-dev3，包含最新的Wi-Fi功能适用于桌面的nRF连接nRF7002DK功率配置文件套件II支持Wi-Fi6并启用了TWT功能的路由器第8页第9页第10页第11页第12页第13页第14页1分钟唤醒一次的功耗5分钟唤醒一次的功耗第17页10分钟唤醒一次的功耗您可以在此处阅读有关Wi-Fi协议的更多信息。查看 nRFConnectSDK中的其他Wi-Fi示例和此博客文章，让您的nRF7002DK通过Wi-Fi启动并运行MQTT。</li>
  <li>一、nRF9160常用prj.conf配置介绍nRF9160通过prj.conf配置网络模式为：CAT-M模式CONFIG_LTE_NETWORK_MODE_LTE_M=yCONFIG_LTE_NETWORK_MODE_LTE_M_GPS=ynRF9160通过prj.conf配置网络模式为：CAT-NB模式CONFIG_LTE_NETWORK_MODE_NBIOT=yCONFIG_LTE_NETWORK_MODE_NBIOT_GPS=yInnRFConnectSDKversions&gt;=2.1.0nRF9160通过prj.conf配置启用modemlogCONFIG_NRF_MODEM_LIB_TRACE=yInnRFConnectSDKversions1.5.0-2.0.0nRF9160通过prj.conf配置启用modemlogCONFIG_NRF_MODEM_LIB_TRACE_ENABLED=yInnRFConnectSDKversionsbefore1.5.0nRF9160通过prj.conf配置启用modemlogCONFIG_BSD_LIBRARY_TRACE_ENABLED=ynRF9160通过prj.conf配置不需要服务器回复最后一个ackCONFIG_UDP_RAI_ENABLE=nCONFIG_LTE_RAI_REQ_VALUE=“4”nRF9160通过prj.conf配置进入PSM模式CONFIG_UDP_PSM_ENABLE=y##设置PSM唤醒间隔30s，需要卡支持设置此参数，否则设置无效，进入PSM模式后，PSM周期仍为卡原始设置CONFIG_LTE_PSM_REQ_RPTAU=“10000001”##设置PSM唤醒后活动时间2秒CONFIG_LTE_PSM_REQ_RAT=“00000001”nRF9160通过prj.conf配置进入eDRX模式CONFIG_UDP_EDRX_ENABLE=n##设置EDRX周期为20.48s需要卡支持设置此参数，否则设置无效，进入EDRX模式后，EDRX周期仍为卡原始设置#CONFIG_LTE_EDRX_REQ_VALUE_LTE_M=“0010”##设置EDRX周期为20.48s需要卡支持设置此参数，否则设置无效，进入EDRX模式后，EDRX周期仍为卡原始设置CONFIG_LTE_EDRX_REQ_VALUE_NBIOT=“0010”nRF9160按键唤醒时进入低功耗配置CONFIG_GPIO_NRF_INT_EDGE_USING_SENSE=y二、nRF91常用AT指令介绍1.基础信息类(General)[11条]AT指令功能说明+CGMI查询制造商标识（如Quectel）。+CGMM查询模组型号。+CGMR查询固件版本。+CGSN查询产品序列号（IMEI）。%SHORTSWVER查询短软件版本。%HWVERSION查询硬件版本。%XMODEMUUID查询模组唯一标识符（UUID）。+ODIS设置/读取ODIS字段（设备特定参数）。+ODISNTFODIS事件通知开关。%2DID查询SiP2DID（封装标识）。%DEVICEUUID查询设备UUID。2.移动终端控制(MobileTerminationControl)[26条]AT指令功能说明+CFUN设置功能模式（全功能/飞行模式等）。+CLAC列出所有支持的AT指令。+CESQ扩展信号质量查询（RSSI/RSRP等）。%CESQ信号质量周期性通知。+CSQ简化信号强度查询（RSSI+误码率）。%XSNRSQ信噪比（SNR）实时通知。+CPAS查询设备活动状态（待机/通话中）。+CIND配置指示灯显示模式。+CGPIAF设置IP地址格式（IPv4/IPv6）。%XCBAND查询当前频段。%NBRGRSRP查询邻小区信号强度。+CEMODE设置工作模式（CS/PS域）。%XBANDLOCK频段锁定配置。%XDATAPRFL数据业务配置文件管理。%XCONNSTAT查询连接统计信息。%XVBAT查询电池电压。%XVBATLVL低电量通知开关。%XVBATLOWLVL设置低电量阈值。%XPOFWARN外部电源断开警告配置。%XPRODDONE标记生产完成状态。%XTEMP内部温度实时通知。%XTEMPHIGHLVL设置高温报警阈值。+CCLK查询/设置模组时钟。%CCLK扩展时钟管理（厂商专用）。%XMODEMTRACE调试跟踪功能开关。%XSMSFALLBACK短信回退模式（NB-IoT下启用）。3.网络服务类(NetworkService)[19条]AT指令功能说明+COPS手动/自动选择运营商网络。%COPS强制PLMN搜索。+CPSMS省电模式（PSM）配置。+CEDRXS扩展不连续接收（eDRX）参数设置。+CEDRXRDP查询动态eDRX参数。+COPN查询运营商名称列表。+CEREG网络注册状态实时通知。%XOPNAME运营商名称变更通知。%XTIME网络时间同步通知。%XOPERID查询运营商ID。%XMONITOR监控网络参数（如小区ID/信号强度）。%XNETTIME网络时间支持状态查询。%XDEEPSEARCH弱小区检测配置。%XOPCONF运营商特定配置管理。%RAI释放辅助指示（ReleaseAssistanceIndication）。%PERIODICSEARCHCONF周期性小区搜索配置。%REDMOB降低移动性功能开关（NB-IoT优化）。%FEACONF功能配置管理（如VoLTE开关）。%PALLPLMN访问限制配置。4.数据业务类(PacketDomain)[20条]AT指令功能说明+CGDCONT定义PDP上下文（APN/IP类型）。+CGEREP数据业务事件报告开关。+CGEV数据业务事件通知（如激活/去激活）。+CGACT激活/去激活PDP上下文。%XNEWCID分配新CID（上下文标识符）。%XGETPDNID映射CID到PDNID。+CGEQOSRDP查询动态QoS参数。+CGPADDR显示当前分配的IP地址。+CGCONTRDP查询PDN连接动态参数。+CGATT附着/分离PS域（数据业务开关）。+CEPPI功耗偏好指示（PPI）配置。%XPCO协议配置选项（PCO）通知。%XEPCO扩展PCO使用配置。%XAPNCLASSAPN分类访问控制。%XIPV6FAILIPv6地址解析失败通知。+CGAUTH定义PDN鉴权参数（用户名/密码）。+CSCON信令连接状态通知。%XAPNSTATUSAPN使用状态查询。%XPDNCFGPDN配置管理。%APNRATECTRLAPN速率控制配置。5.短信类(SMS)[12条]AT指令功能说明+CMGF设置短信格式（文本/PDU模式）。+CNMI新短信到达通知配置。+CMGS发送短信（PDU模式）。+CMT接收短信PDU模式通知。+CDS短信送达状态报告通知。+CNMA短信ACK确认（PDU/文本模式）。+CPMS选择短信存储区域（SIM/设备）。+CMSERROR短信服务失败错误码。+CGSMS短信服务开关控制。%XSMMA查询短信存储剩余容量。+CMMS多短信连续发送模式。%EXCEPTIONALDATA异常数据状态通知（如短信拥塞）。6.安全与SIM卡类(Security&amp;UICC)[28条]AT指令功能说明+CPINSIM卡PIN码验证。+CPINR查询剩余PIN尝试次数。+CLCK功能锁管理（SIM锁/拨号限制）。+CPWD修改密码（PIN/PUK等）。%XUSIMLCK模组个性化锁定（绑定运营商）。%XSUDO特权指令访问认证。%XPMNG公钥存储管理。%CMNG证书/密钥存储管理。%ATTESTTOKEN生成设备认证令牌。%KEYGEN生成非对称密钥对。%KEYINJECT注入预共享密钥。%JWT生成JSONWebToken。%CERTEXPIRY查询证书过期时间。%CLAIMTOKEN生成设备所有权声明令牌。%XSIMSIM卡状态通知（插入/拔出）。+CIMI查询IMSI（SIM卡唯一标识）。%XICCID查询ICCID（SIM卡序列号）。+CNUM查询本机号码。+CRSM受限SIM文件访问（如读取EF_ICCID）。+CSIM通用SIM指令（发送APDU）。+CCHO打开SIM逻辑通道。+CCHC关闭SIM逻辑通道。+CGLA通过逻辑通道发送APDU指令。%USATEVUSAT事件通知（如菜单刷新）。%USATINFO查询USAT状态（如BIP连接）。+SSRDAUICC挂起与恢复控制。%CSUS选择UICC插槽（双卡设备）。%UICCPOWERSAVEUICC低功耗模式控制。7.其他类(Others)[10条]AT指令功能说明%XRFTEST射频测试模式（生产环节）。+CMEE错误报告模式（详细/简化）。+CNEC网络错误码通知。+CEER扩展错误报告（如连接失败原因）。%XFILEWRITE写文件到模组存储（如证书/配置）。%XFACTORYRESET恢复出厂设置。%XMODEMSLEEP模组睡眠模式配置。%XT3412TAU（跟踪区更新）周期通知。%XCOUNTRYDATA国家特定搜索优化配置。%MDMEV模组域事件通知（如重启/复位）。总计指令数量基础信息类:11条移动终端控制:26条网络服务类:19条数据业务类:20条短信类:12条安全与SIM卡类:28条其他类:10条总计:126条</li>
  <li>nRFConnectSDK目录结构D:.├─.west├─bootloader├─modules├─nrf├─nrfxlib├─test├─tools└─zephyrnRFConnectSDK目录介绍在NCSv2.8.0中，通常会有两个主要项目：nRF相关的模块和功能，存放在nrf目录中。Zephyr操作系统本身，存放在zephyr目录中。该config文件的作用是告诉West在处理NCS工程时，如何找到这两个关键部分的代码库。NCSSDK会用这个配置文件来协调与Zephyr和nRF子项目的依赖和构建关系。通过该配置，West可以自动化地下载、更新和构建多个项目。通常可以使用的指令有westinit-mhttps://github.com/nrfconnect/sdk-nrf--mrv2.8.0v2.8.0westupdate</li>
  <li>安装nRFConnectSDK目标：修复*.dll文件与VC++库验证：下载并运行DirectX_Repair执行检测并修复：链接目标：安装命令行工具：nRF_Command_Line_Tools验证：执行nrfjprog–version可以查看到版本信息目标：安装编译器与插件：VSCode验证：打开VSCode查看菜单Help-&gt;about版本信息后边需要显示(systemsetup)注意：(VSCode有usersetup版本和systemsetup版本，usersetup版本容易出问题)在VSCode插件扩展中搜索(nRF)然后安装插件：nRFKconfig、nRFTerminal、nRFDeviceTree、nRFConnectforVSCode、nRFConnectforVSCodeExtensionPack目标：安装sdk管理工具：nRF_Connect_for_Desktop验证：打开nRF_Connect_for_Desktop看到并安装其中的子程序ToolchainManager目标：安装nrfutil命令行工具并添加路径到环境变量Path：nRF_Util验证：执行nrfutil–version看得到版本信息目标：下载toolchain离线安装包并安装toolchain：V2.8.0验证：尝试打开压缩包判断压缩包完整性目标：下载nrf-sdk主仓库：nrf-sdk-v2.8.0验证：尝试打开压缩包判断压缩包完整性目标：下载.west.zip：链接文件目录：1_Nordic公开资料\（4）：SDK（nRFConnectSDK）\在线安装验证：尝试打开压缩包判断压缩包完整性安装步骤新建目录：C:\ncs解压v2.8.0.tar.gz到目录：C:\ncs\v2.8.0\nrf解压.west.zip到目录：C:\ncs\v2.8.0.west使用nrfutil_install.bat：链接安装nrfutiltoolchain-manager文件目录：1_Nordic公开资料\（4）：SDK（nRFConnectSDK）\在线安装或者使用下述指令安装nrfutiltoolchain-managernrfutilinstalltoolchain-managernrfutiltoolchain-managerconfig–setinstall-dir=“C:\ncs”在线安装toolchainv2.8.0nrfutiltoolchain-managerinstall–ncs-version“v2.8.0”从ToolchainManager中找到nRFConnectSDKv2.8.0这一行最右边的小三角点开打开Openbash在打开的Openbash窗口中执行westupdate报错则重新执行westupdate等待westupdate完成且没有报错则sdk跟新完成安装完nRFConnectSDK成后目录结构如下：C:.├─ncs│├─downloads│││├─toolchains│││toolchains.json│││││└─2d382dcd92│└─v2.8.0││.west││bootloader││modules││nrf││nrfxlib││test││tools│└─–zephyr从ToolchainManager中打开VSCode添加并编译自己工程注意事项：如果nRFConnectSDK安装出现问题，需要重装可以删除下述目录后重新安装：C:\Users%userprofile%\NordicC:\Users%userprofile%.nrfconnect-appsC:\Users%userprofile%.nrfutilC:\Users%userprofile%.vscodeC:\Users%userprofile%\AppData\Roaming\nrfconnectC:\Users%userprofile%\AppData\Roaming\nrfconnect-bluetooth-low-energyC:\Users%userprofile%\AppData\Roaming\NordicSemiconductorC:\Users%userprofile%\AppData\Roaming\NordicSemiconductorsASAC:\Users%userprofile%\AppData\Local\nrfconnect-bluetooth-low-energy-updaterC:\Users%userprofile%\AppData\Local\NordicSemiconductorC:\Users%userprofile%\AppData\Local\nrfconnect-updaterC:\Users%userprofile%\AppData\Roaming\Code</li>
  <li>arm-none-eabi-addr2line概述：arm-none-eabi-addr2line是GNUBinutils软件包的一部分，专门用于ARMCortex-M等嵌入式系统的调试工具。它的主要功能是将程序中的地址转换为源代码中的文件名和行号，这对于调试和诊断程序中的错误特别有帮助。是ARM嵌入式开发中重要的调试工具，尤其在程序崩溃或未知问题发生时，能够帮助开发者快速定位问题所在。通过将地址转换为可读的文件和行号信息，它极大地加快了调试过程。此工具可以将一个内存地址或程序计数器值（PC值）映射回生成该机器指令的源代码文件及行号。它对于从调试信息中恢复源代码位置很有用，特别是在定位内存地址或分析错误时。通常情况下，这种地址信息来自于内存转储（例如硬件故障或程序崩溃时的堆栈回溯）。arm-none-eabi-addr2line–help：Usage:arm-none-eabi-addr2line.exe[option(s)][addr(s)]Convertaddressesintolinenumber/filenamepairs.Ifnoaddressesarespecifiedonthecommandline,theywillbereadfromstdinTheoptionsare:@&lt;file&gt;Readoptionsfrom&lt;file&gt;-a--addressesShowaddresses-b--target=&lt;bfdname&gt;Setthebinaryfileformat-e--exe=&lt;executable&gt;Settheinputfilename(defaultisa.out)-i--inlinesUnwindinlinedfunctions-j--section=&lt;name&gt;Readsection-relativeoffsetsinsteadofaddresses-p--pretty-printMaketheoutputeasiertoreadforhumans-s--basenamesStripdirectorynames-f--functionsShowfunctionnames-C--demangle[=style]Demanglefunctionnames-R--recurse-limitEnablealimitonrecursionwhilstdemangling.[Default]-r--no-recurse-limitDisablealimitonrecursionwhilstdemangling-h--helpDisplaythisinformation-v--versionDisplaytheprogram'sversionarm-none-eabi-addr2line.exe:supportedtargets:elf32-littlearmelf32-littlearm-fdpicelf32-bigarmelf32-bigarm-fdpicelf32-littleelf32-bigsrecsymbolsrecverilogtekhexbinaryihexpluginReportbugsto&lt;http://www.sourceware.org/bugzilla/&gt;翻译为中文：用法:arm-none-eabi-addr2line.exe[选项][地址]将地址转换为行号/文件名对。如果命令行中未指定地址，将从标准输入中读取地址。可用选项如下：@&lt;文件&gt;从&lt;文件&gt;中读取选项-a--addresses显示地址-b--target=&lt;bfdname&gt;设置二进制文件格式-e--exe=&lt;可执行文件&gt;设置输入文件名（默认为a.out）-i--inlines展开内联函数-j--section=&lt;名称&gt;读取相对于段的偏移量而不是地址-p--pretty-print使输出更易于人类阅读-s--basenames去掉目录名-f--functions显示函数名称-C--demangle[=风格]解码函数名称-R--recurse-limit启用解码时递归限制（默认）-r--no-recurse-limit禁用解码时的递归限制-h--help显示此信息-v--version显示程序版本arm-none-eabi-addr2line.exe:支持的目标格式：elf32-littlearmelf32-littlearm-fdpicelf32-bigarmelf32-bigarm-fdpicelf32-littleelf32-bigsrecsymbolsrecverilogtekhexbinaryihexplugin报告错误到&lt;http://www.sourceware.org/bugzilla/&gt;应用场景：嵌入式系统调试：当嵌入式系统崩溃时，开发者可以从错误日志中获取崩溃时的内存地址（例如硬件异常或断言失败时）。通过arm-none-eabi-addr2line工具，可以轻松定位问题出现在源代码的具体位置。堆栈回溯分析：在执行堆栈回溯时，可以将所有函数调用的地址转换成相应的代码行，帮助开发者快速找到潜在的问题。使用技巧：带符号表的编译：要使用arm-none-eabi-addr2line工具，程序需要在编译时保留调试符号（通过编译选项-g）。无符号表的处理：如果ELF文件没有调试符号，arm-none-eabi-addr2line将无法提供详细的源代码行号信息，而只能给出模块的偏移地址。结合GDB使用：在调试会话中，arm-none-eabi-addr2line通常和GDB一起使用，用于快速查找源代码中的错误。分析死机或HardFault异常原因：当程序死机时，可以通过PC和LR的结合，分析程序死机的原因。应该优先读取PC（程序计数器）指针来排查错误，但LR（链接寄存器）指针同样有重要参考价值。PC（程序计数器）：指向当前正在执行的指令地址，是排查错误的主要线索。通过读取PC，可以确定程序崩溃时正在执行的具体代码位置，有助于分析出问题所在（例如非法指令或访问非法地址）。LR（链接寄存器）：通常保存调用函数的返回地址。如果程序因为函数调用错误导致崩溃，LR可以帮助你确定导致问题的调用链。当程序执行BL（BranchwithLink）指令时，LR会保存调用函数的返回地址。在某些情况下，LR比PC更有助于追溯崩溃前的执行路径，尤其是当PC指向了异常处理程序时。HardFault和死机等错误查找使用示例：程序arm-none-eabi-addr2line.exe编译后的文件:nrf52832_xxaa.axf使用nrfjprog--readregs获取PC：0x0002C2E2LR：0x00029147执行指令:arm-none-eabi-addr2line-e.\nrf52832_xxaa.axf-a-f0x0002C2E20x00029147得到结果可能出现问题地方:0x0002c2e2wakeup_button_cfg../clib/../cmprslib/zerorunl2.c:?0x00029147nrfx_coredep_delay_usnRF5_SDK_17.1.0_ddde560\examples\ble_peripheral\ble_app_uart\pca10040\s132\arm5_no_packs/..\..\..\..\..\..\modules\nrfx\/soc/nrfx_coredep.h:173使用nrfjprog–readregs获取到寄存器信息示例如下:获取到的寄存器信息：R0:0x0000C6BER1:0x0002C2E1R2:0x00000000R3:0x20002E00R4:0x0002C2E0R5:0x0000001AR6:0x0000FA00R7:0x00000000R8:0x00000000R9:0x00000000R10:0x00000000R11:0x00000000R12:0x0000000CSP:0x20005DD0LR:0x00029147PC:0x0002C2E2xPSR:0x21000000MSP:0x20005DD0PSP:0x00000000RAZ:0x00000000CFBP:0x04000000APSR:0x20000000EPSR:0x01000000IPSR:0x00000000通用寄存器(R0-R12)R0-R12:这是ARMCortex-M处理器的12个通用寄存器。它们用于存储处理中的临时数据或函数参数。寄存器可以在函数调用中传递参数，也可以用于保存局部变量。R0:0x0000C6BE：存储了一个中间结果或局部变量。R1:0x0002C2E1：可能是另一个函数参数或计算结果。R2-R12:这些寄存器可能在不同的时刻存储不同的数据，具体内容和意义依赖于当前正在执行的程序。堆栈指针(SP)和链接寄存器(LR)SP(StackPointer,堆栈指针):SP指向当前堆栈顶的位置，用于保存局部变量、返回地址等。SP:0x20005DD0:当前堆栈指针指向内存地址0x20005DD0。LR(LinkRegister,链接寄存器):LR保存函数调用返回地址。执行完函数时，处理器会跳回到这个地址。LR:0x00029147:当前的函数返回地址为0x00029147，指向下一个指令。程序计数器(PC)PC(ProgramCounter,程序计数器):PC保存了当前执行指令的地址。PC:0x0002C2E2:当前正在执行的指令位于地址0x0002C2E2。程序状态寄存器(xPSR)xPSR是Cortex-M处理器中的一个综合状态寄存器，它由以下三个部分组成：APSR(ApplicationProgramStatusRegister):保存程序的状态信息，如条件码。APSR:0x20000000:N位设置，表示上一次运算的结果为负值。EPSR(ExecutionProgramStatusRegister):保存指令执行状态。EPSR:0x01000000:Thumb状态位T为1，说明处理器正以Thumb指令集执行程序。IPSR(InterruptProgramStatusRegister):保存中断号信息。IPSR:0x00000000:当前没有中断正在执行。其他状态寄存器MSP(MainStackPointer):这是主堆栈指针，用于系统和异常处理模式。MSP:0x20005DD0:主堆栈指针和堆栈指针SP指向同一个地址，表示当前正处于主模式。PSP(ProcessStackPointer):这是进程堆栈指针，用于用户模式下的进程。PSP:0x00000000:当前未使用进程堆栈指针，可能是在系统模式下执行。CFBP(Control,Faultmask,Basepri,andPrimask):控制寄存器，用于管理异常优先级和屏蔽。CFBP:0x04000000:表示Basepri设置为0x04，用于异常优先级控制。其他值RAZ:保留值，通常为0。RAZ:0x00000000:保持为0。重点介绍:1.堆栈指针(SP)SP(StackPointer)是一个指向当前堆栈顶部的寄存器。它在函数调用和返回过程中更新，以便跟踪局部变量和函数参数的存储。在Cortex-M处理器中，SP的具体值会根据当前执行的上下文变化。通常，SP会在进入一个函数时向下移动（降低），在退出函数时向上移动（增加）。2.主堆栈指针(MSP)MSP(MainStackPointer)是用于主堆栈的指针，通常在处理器复位后初始化并用于所有的特权级（如处理器进入异常模式时）。MSP用于系统的默认堆栈，通常由系统调用、ISR（中断服务例程）和上下文切换等情况使用。当处理器处于异常模式（如中断、故障等）时，MSP是默认使用的堆栈指针。3.进程堆栈指针(PSP)PSP(ProcessStackPointer)是用于用户进程堆栈的指针，通常用于在操作系统环境下的用户任务。当处理器切换到用户模式（例如，执行用户任务）时，PSP是被使用的堆栈指针。这使得用户程序的执行可以与系统级别的处理分开，增强了安全性和稳定性。4.SP、MSP和PSP的使用场景系统启动：当Cortex-M处理器启动时，MSP通常被初始化为堆栈的顶部，并且在启动时由系统使用。异常处理：在处理中断或异常时，系统会使用MSP。异常处理程序可以直接使用MSP堆栈进行局部变量和参数的管理。任务切换：如果使用实时操作系统（RTOS），在进行任务切换时，系统会保存当前任务的PSP，并恢复下一个任务的PSP，从而使每个任务有独立的堆栈空间。堆栈溢出：当应用程序超出分配给堆栈的内存时，可能导致堆栈溢出，从而影响当前函数或调用链，甚至导致HardFault。通过检查SP的位置（如接近预定义的堆栈边界），可以检测堆栈溢出问题。5.SP、MSP和PSP寄存器的状态在你提供的寄存器信息中：SP为0x20005DD0，表示当前堆栈指针的位置，可能表示当前正在使用的堆栈。MSP也为0x20005DD0，表明在崩溃发生时，MSP和SP可能指向相同的内存地址，这意味着可能使用了主堆栈进行操作。PSP为0x00000000，表示当前未在使用进程堆栈。hardfault_handler_keil.c函数解释需要打开宏#ifndefHARDFAULT_HANDLER_ENABLED#defineHARDFAULT_HANDLER_ENABLED1#endif需要在keil中此处(PreprocessorSymbols)加入宏DEBUGDEBUG_NRFNRF需要加入文件：nRF5_SDK_17.1.0_ddde560\components\libraries\hardfault\hardfault_implementation.c需要加入文件：nRF5_SDK_17.1.0_ddde560\components\libraries\hardfault\nrf52\handler\hardfault_handler_keil.c主处理逻辑：-使用`ldr`指令加载`HardFault_c_handler`地址，并根据链接寄存器（LR）的状态判断使用的堆栈（PSP或MSP）。-如果使用PSP，直接调用C语言的处理函数。-如果使用MSP，检查栈指针是否在有效范围内；如果不在有效范围内，移动栈指针到合适的位置。-最后跳转到处理函数继续执行。这段代码的核心目的是在发生硬Fault时，通过汇编级别的处理程序将控制权转移到C语言的处理函数，确保系统能够正确处理错误。__ASMvoidHardFault_Handler(void)//定义一个汇编函数，用于处理硬Fault异常{PRESERVE8//指示编译器保持8字节对齐，确保堆栈的正确性EXTERNHardFault_c_handler//声明外部的C函数，用于处理硬FaultEXTERN|STACK$$Base|//声明栈的基地址EXTERN|STACK$$Limit|//声明栈的限制地址ldrr3,=HardFault_c_handler//将处理函数的地址加载到寄存器r3中tstlr,#4//测试链接寄存器（LR）第2位，判断使用的堆栈类型/*PSPisquitesimpleanddoesnotrequireadditionalhandler*/ittne//条件执行指令，如果测试结果为不等，则执行后面的指令mrsner0,psp//如果使用PSP，将其值读取到寄存器r0中/*Jumptothehandler,donotstoreLR-returningfromhandlerjustexitsexception*/bxner3//跳转到C处理函数，不保存LR/*ProcessingMSPrequiresstackchecking*/mrsr0,msp//读取当前的MSP值到寄存器r0ldrr1,=|STACK$$Limit|//将栈限制加载到寄存器r1ldrr2,=|STACK$$Base|//将栈基地址加载到寄存器r2/*MSPisintherangeofthestackarea*/cmpr0,r1//比较当前MSP和栈限制bhiHardFault_MoveSP//如果MSP大于栈限制，跳转到移动栈指针处理cmpr0,r2//比较当前MSP和栈基地址bhiHardFault_Handler_Continue//如果MSP大于栈基地址，继续处理HardFault_MoveSP//标签，表示进入栈指针移动处理movsp,r1//将栈指针（SP）移动到栈限制movr0,#0//将r0清零，为后续处理做准备HardFault_Handler_Continue//标签，表示继续处理硬Faultbxr3//跳转到C处理函数ALIGN//对齐指令，确保后续代码的对齐}//结束HardFault_Handler函数定义</li>
  <li>蓝牙联盟官网QDID查询入口BluetoothSIGQDID查询页面Nordic芯片QDID获取nRF5340QDID：链接nRF52840QDID：链接nRF52833QDID：链接nRF52832QDID：链接nRF52820QDID：链接nRF52811QDID：链接nRF52810QDID：链接nRF52805QDID：链接蓝牙认证相关概念整理1.BluetoothSIG（蓝牙技术联盟）解释:BluetoothSIG是一个国际联盟，负责制定和推广蓝牙技术标准。作用:确保不同制造商的设备能够相互兼容。2.BQB（BluetoothQualificationBody，蓝牙资格认证机构）解释:BQB负责执行蓝牙产品认证，确保产品符合BluetoothSIG制定的标准。作用:对蓝牙产品进行测试和审核，确保其符合蓝牙技术规范，并颁发认证证书。3.QDID（QualifiedDesignIDs，合格设计标识符）解释:QDID是BluetoothSIG分配给通过BQB认证的蓝牙设计的唯一标识符，用于标识蓝牙设备的设计已通过认证。作用:用于标识已通过BQB认证的蓝牙设计，可以被其他公司引用以简化认证流程。QDID认证形式:适用于蓝牙模块或芯片的认证。4.DID（DeclarationID，声明标识符）解释:DID是BluetoothSIG分配给产品或模块的唯一标识符，用于标识已通过BQB认证的产品或模块。作用:管理和追踪已认证的蓝牙产品，与QDID相关联。5.QDL（QualifiedDesignList）QDL:是记录经过BQB认证的设备设计的清单，之前称为EPL（EndProductList），用于识别和管理这些认证的设计。QDL认证形式（也称为DID列名）:使用已认证模块时，基于其QDID申请DID。QDL列名的具体说明：成品列名公司是最终发货商，以便后期发货公司与网站信息相对应。自2014年11月以来，Bluetooth2.0版本不再接受DID列名。产品型号与最终发货的产品相符。如果型号太多，可分批申请。申请许多型号时，可以将多个型号的图片合成一张图片进行提交。有效期不受DID号限制，只要蓝牙模块未更改且BQB的DID号码始终有效，则该产品的DID号码始终有效。如果成品公司用一个模块申请了DID号，则后续列名无需支付额外的列名费，只需支付服务费即可。EPL（EndProductList）：QDL的旧名称，从2014年2月起更名为QDL（QualifiedDesignList）。QDID：旧名称，已改为DID（DesignIdentification），从2012年起使用。蓝牙BQB认证流程产品设计:根据BluetoothSIG的技术规范设计蓝牙产品。测试:使用BluetoothTestSuite等工具测试产品，验证其符合规范。提交认证申请:使用LaunchStudio等工具提交认证申请。BQB审核:BQB审核申请，确保产品符合规范。颁发认证证书:通过审核后，BluetoothSIG颁发认证证书。QDID与DID的费用会员年费：每年7500美元，申请产品时需缴交4000美元。非会员费用：每款产品8000美元。测试费用：蓝牙2.0+EDR：RF部分25000人民币，Profile测试每款3000人民币，时间约4周。蓝牙2.1+EDR：RF部分45000人民币，Profile测试每款3000人民币，时间约4周。</li>
  <li>Opus音频编解码器Opus是一种用于互联网互动语音和音频传输的编解码器。Opus可以处理广泛的互动音频应用，包括语音通信、视频会议、游戏内聊天，甚至是远程现场音乐表演。它可以从低比特率的窄带语音扩展到非常高质量的立体声音乐。Opus与适当的容器格式结合时，也适用于非实时存储文件应用，如音乐分发、游戏原声带、便携式音乐播放器、点唱机以及其他历史上使用高延迟格式（如MP3、AAC或Vorbis）的应用。Opus的规格由IETFRFC6716规范：https://tools.ietf.org/html/rfc6716Opus格式及其实现受文件COPYING中指定的免版税专利和版权许可的约束。此软件包实现了一个用于编码和解码原始Opus比特流的共享库。原始Opus比特流应根据RFC7587通过RTP使用。该软件包还包括多个用于测试库正常工作的测试工具。这些工具读取/写入的比特流不应用于Opus文件分发：它们包含附加的调试数据，不能支持寻址。存储在文件中的Opus应使用Ogg封装，详细信息见：https://tools.ietf.org/html/rfc7845可以获得opus-tools软件包，它提供了Ogg封装的Opus文件的编码和解码功能，并包括一些有用的功能。Opus-tools可在以下位置找到：https://gitlab.xiph.org/xiph/opus-tools.git或在Opus主要网站：https://opus-codec.org/深度学习与Opus有损网络仍然是实时通信中的一个挑战。虽然Opus的原始实现提供了出色的丢包隐藏机制，但团队继续改进用于在具有挑战性的网络环境中提高音频质量的方法。在Opus1.5中，我们添加了一种基于深度学习的冗余编码器，它通过在每个数据包的填充数据中嵌入一秒钟的恢复数据来增强有损网络中的音频。编码和解码恢复数据的底层算法称为深度冗余（DRED）算法。通过利用数据包中的填充数据，Opus1.5完全向后兼容于之前的Opus版本。有关DRED的详细信息，请参见“dnn”子目录下的README。DRED是由一个最初由AmazonWebServices赞助的团队开发的，他们将实现开源，并开始了在IETF的标准化过程：https://datatracker.ietf.org/doc/draft-ietf-mlcodec-opus-extension/Opus的许可或知识产权位置在Opus1.5中没有变化。编译libopus要从发行版tarball构建，只需执行以下操作：%./configure%make要从git仓库构建，需要执行以下步骤：设置开发环境：在Ubuntu或Debian系列Linux发行版上：%sudoapt-getinstallgitautoconfautomakelibtoolgccmake在Fedora/Redhat系列Linux上：%sudodnfinstallgitautoconfautomakelibtoolgccmake对于较旧的Redhat/CentosLinux版本：%sudoyuminstallgitautoconfautomakelibtoolgccmake在ApplemacOS上，安装Xcode和brew.sh，然后在终端中输入：%brewinstallautoconfautomakelibtool克隆仓库：%gitclonehttps://gitlab.xiph.org/xiph/opus.git%cdopus编译源代码%./autogen.sh%./configure%make在x86上，建议使用允许使用AVX2的-march=选项。安装编解码器库（可选）%sudomakeinstall编译完成后，顶级目录下将会有一个opus_demo可执行文件。用法：opus_demo[-e]&lt;application&gt;&lt;samplingrate(Hz)&gt;&lt;channels(1/2)&gt;&lt;bitspersecond&gt;[options]&lt;input&gt;&lt;output&gt;opus_demo-d&lt;samplingrate(Hz)&gt;&lt;channels(1/2)&gt;[options]&lt;input&gt;&lt;output&gt;模式：voip|audio|restricted-lowdelay选项：-e：仅运行编码器（输出比特流）-d：仅运行解码器（将比特流作为输入）-cbr：启用固定比特率；默认：可变比特率-cvbr：启用受限可变比特率；默认：不受限-bandwidth&lt;NB|MB|WB|SWB|FB&gt;：音频带宽（从窄带到全频带）；默认：采样率-framesize&lt;2.5|5|10|20|40|60&gt;：帧大小（单位：毫秒）；默认：20-max_payload&lt;bytes&gt;：最大有效载荷大小（字节），默认：1024-complexity&lt;comp&gt;：复杂度，0（最低）…10（最高）；默认：10-inbandfec：启用SILK带内FEC-forcemono：强制单声道编码，即使输入是立体声-dtx：启用SILKDTX-loss&lt;perc&gt;：模拟丢包，百分比（0-100）；默认：0输入和输出为小端有符号16位PCM文件或opus比特流，具有简单的opus_demo专有封装。测试此软件包包含一组自动化单元和系统测试，应在编译软件包后运行，特别是首次在新平台上运行时。运行集成测试：%makecheck还有一组标准测试向量，由于大小原因未包含在此软件包中，但可以从以下位置获取：https://opus-codec.org/docs/opus_testvectors-rfc8251.tar.gz要将代码与这些测试向量进行比较：%curl-OLhttps://opus-codec.org/docs/opus_testvectors-rfc8251.tar.gz%tar-zxfopus_testvectors-rfc8251.tar.gz%./tests/run_vectors.sh./opus_newvectors48000为Windows和替代构建系统编译libopus请参阅cmake/README.md或meson/README.md。可移植性说明此实现默认使用浮点运算，但可以通过设置–enable-fixed-point（如果使用autoconf）或定义FIXED_POINT宏（如果手动构建）来编译为仅使用定点算术。定点实现的音质较低，在具有快速FPU的平台上速度较慢，通常仅在嵌入式环境中使用。该实现可以使用C89或C99编译器进行编译。尽管它不依赖于C89或C99定义的任何未定义行为，但它依赖于两补码架构的常见实现定义行为：负值的右移与两补码算术一致，因此a&gt;&gt;b相当于floor(a/(2^b))。对于转换为N位的有符号整数，值会模2^N以保持在类型范围内。负值的整数除法结果被截断至零。编译器提供64位整数类型（C99要求，大多数C89编译器支持）。使用CMake构建Opus项目本指南提供了使用CMake构建Opus项目的说明，包括各种配置选项。CMake是一种广泛使用的构建系统生成器，帮助在不同平台上管理构建过程。注意：请注意，软件文档有时可能会随着新版本的发布而过时。建议始终参考官方CMake文档，以获取最新和准确的信息。您可以在cmake.org/documentation找到官方CMake文档。前提条件在继续之前，请确保您已安装以下前提条件：CMakeGit（可选，但建议用于版本控制集成）工作中的C编译器构建说明按照以下步骤使用CMake构建Opus项目：使用Git克隆Opus仓库：gitclonehttps://gitlab.xiph.org/xiph/opus在Opus仓库中创建构建目录：cdopusmkdirbuildcdbuild使用CMake配置构建。您可以使用CMake的-D标志设置所需的配置选项。以下是一些可用的选项：OPUS_BUILD_SHARED_LIBRARY：构建共享库。OPUS_BUILD_TESTING：构建测试。OPUS_BUILD_PROGRAMS：构建程序。OPUS_CUSTOM_MODES：启用非Opus模式，例如44.1kHz和2^n帧。例如，要启用自定义模式并构建程序，请使用以下命令：cmake..-DOPUS_BUILD_PROGRAMS=ON-DOPUS_BUILD_TESTING=ON构建Opus项目：cmake--build.成功构建后，您可以在构建目录中找到编译好的Opus库和相关文件。使用CTest进行测试Opus提供了一个全面的测试套件，以确保项目的功能和正确性。您可以使用CTest执行测试，CTest是CMake构建系统的一部分。CTest允许自动化测试，并提供管理和评估测试结果的有用功能。要使用CTest运行Opus测试，请按照以下步骤操作：在用CMake配置并构建项目后，导航到构建目录：cdbuild使用CTest执行测试：ctest注意：在Windows上，您需要指定要测试的配置ctest-CDebug平台支持和错误报告CMake旨在提供广泛的平台支持，允许在主要操作系统和平台上构建和使用Opus项目。支持的平台包括：WindowsmacOSLinuxAndroidiOSCMake通过生成针对特定平台的构建文件（例如，Makefile、VisualStudio项目）来实现平台支持。这允许开发人员在不同操作系统和环境中一致地构建和配置Opus项目。虽然CMake力求确保跨平台的兼容性和稳定性，但在特定配置中仍可能会出现错误或问题。如果在配置过程中或构建Opus项目时遇到任何问题，我们鼓励您在项目的问题跟踪器中报告问题。报告问题时，请提供以下信息，以帮助我们有效地了解和重现配置问题：问题的详细描述，包括任何错误消息或观察到的意外行为。重现问题的步骤，包括CMake命令和任何使用的特定配置选项。操作系统和版本（例如，Windows10，macOSBigSur，Ubuntu20.04）。CMake版本（例如，CMake3.21.1）。有关平台、工具链或依赖项的任何相关信息。可能有助于排除故障的其他上下文或细节。通过提供详细的信息来报告配置问题，您将有助于改善Opus项目在不同平台上的兼容性和可靠性。我们感谢您在识别和解决任何配置相关问题方面的帮助，以确保所有Opus项目的用户都能获得更好的体验。平台特定示例注意：示例可能会过时。始终参考文档以获取最新的参考信息。为Android进行交叉编译cmake..-DCMAKE_TOOLCHAIN_FILE=${ANDROID_HOME}/ndk/25.2.9519653/build/cmake/android.toolchain.cmake-DANDROID_ABI=arm64-v8a有关为Android进行交叉编译的更多信息，请参阅CrosscompilingforAndroiddocumentation。为iOS进行交叉编译cmake..-G"UnixMakefiles"-DCMAKE_SYSTEM_NAME=iOS-DCMAKE_OSX_ARCHITECTURES=arm64有关为iOS进行交叉编译的更多信息，请参阅CrosscompilingforiOSdocumentation。WindowsVisualStudiocmake..-G"VisualStudio172022"-Ax64有关VisualStudio生成器选项和其他自定义设置的更多信息，请参阅[官方文档]。使用Meson构建系统构建Opus项目本指南提供了使用Meson构建系统构建Opus项目的各种配置选项的说明。Meson是一个快速高效的构建系统，旨在易于使用和理解。请注意，软件文档可能会随着新版本的发布而过时。有关最新和最准确的信息，请参阅官方Meson文档，网址为mesonbuild.com。先决条件在继续之前，请确保已安装以下先决条件：MesonNinja（推荐作为构建后端，尽管其他后端也可用）Git（可选，但建议用于版本控制集成）一个有效的C编译器构建和测试说明按照以下步骤使用Meson构建Opus项目。检出源代码使用Git克隆Opus仓库：gitclonehttps://gitlab.xiph.org/xiph/opuscdopus配置要使用Meson配置构建，您可以使用-D标志后跟选项名称和值来设置所需的配置选项。有关Opus项目特定的构建选项，请参阅meson_options.txt文件。要获取Meson的一般选项，请使用命令mesonsetup--help。例如，要设置并禁用测试，请使用以下命令：mesonsetupbuilddir-Dtests=disabled构建mesoncompile-Cbuilddir构建成功后，您可以在builddir目录中找到编译后的Opus库及相关文件。使用Meson测试Opus提供了一个全面的测试套件，以确保项目的功能和正确性。您可以使用Meson的内置测试功能来执行测试。要使用Meson运行Opus测试：mesontest-Cbuilddir平台支持和错误报告OpusMeson构建系统旨在支持与GStreamer相同的平台，GStreamer是一个广泛使用的多媒体框架。GStreamer支持多种操作系统和平台，包括Linux、Windows（MSVC和MingW）、Android、macOS、iOS和各种BSD系统。尽管我们努力确保这些平台上的兼容性和稳定性，但在特定配置中仍可能会出现错误或问题。如果在配置过程中或构建Opus项目时遇到任何问题，我们鼓励您在项目问题跟踪器中提交问题。报告问题时，请提供以下信息，以帮助我们理解并有效地重现配置问题：问题的详细描述，包括任何错误消息或观察到的意外行为。重新出现问题的步骤，包括Meson命令和任何使用的特定配置选项。操作系统及版本（例如，Windows10、macOSBigSur、Ubuntu20.04）。Meson版本（例如，Meson0.60.0）。相关的关于平台、工具链或依赖项的信息。可能有助于故障排除的其他上下文或细节。通过提供详尽的信息来报告配置问题，您将有助于提高Opus项目在不同平台上的兼容性和可靠性。我们感谢您在识别和解决任何配置相关问题方面的帮助，以确保Opus项目所有用户都能获得更好的体验。平台特定示例注意：示例可能会过时。始终参考文档以获取最新的参考信息。WindowsVisualStudio要生成VisualStudio项目，Meson需要知道您安装的VisualStudio版本的设置。推荐的方法是使用VisualStudio命令提示符运行Meson。您可以通过从开始菜单中搜索来找到VisualStudio命令提示符。但是，名称因VisualStudio版本而异。对于VisualStudio2022，请查找“x64NativeToolsCommandPromptforVS2022”。以下步骤保持不变：mesonsetupbuilddir-Dtests=enabled--backendvs有关VisualStudio后端选项和其他自定义的更多信息，请参阅使用VisualStudio文档。</li>
  <li>nrfutil脚本工具介绍nrfutil是一个用于NordicSemiconductor设备的命令行工具，提供了多种功能用于设备管理和固件烧录。以下是nrfutil脚本工具的各项操作及其介绍：脚本云盘下载地址：链接最新的nrfutil工具越来越复杂，为方便安装与使用，特意做了如下脚本，简化安装与更新，以及常用指令使用nrfutilinstall操作001———––安装nrfutil命令包安装nrfutil工具包，以便使用其提供的功能。002———––更新nrfutil命令包更新现有的nrfutil工具包至最新版本，以获取最新的功能和修复。003———––查看nrfutil包版本显示当前安装的nrfutil工具包的版本信息。004———––下载离线安装包下载nrfutil的离线安装包，以便在没有网络连接的环境中安装。005———––安装离线安装包使用下载的离线安装包安装nrfutil工具。006———––升级离线安装包使用离线安装包升级现有的nrfutil工具版本。007———––安装自动补全功能安装nrfutil命令的自动补全功能，以提高命令输入的效率。008———–––help显示nrfutil工具的帮助信息，列出所有可用的命令和选项。nrfutildevice操作301———––复位设备对设备进行复位操作，通常用于重新启动设备。302———––全擦设备且去掉读保护清除设备上的所有数据并移除读保护，通常用于重新配置设备。303———––全擦设备清除设备上的所有数据，但保留读保护设置。304———––设置读保护配置设备的读保护设置，防止设备数据被未经授权访问。305———––读取读保护设置查看设备的当前读保护设置。306———––列出可用设备列出所有可用的设备，并获取其固件信息、核心信息及详细信息。307———––启动52系列设备复位引脚启动设备的复位引脚，通常用于设备的初始化。308———––复位-全擦-烧录-校验APP.hex执行复位、全擦、烧录和校验操作，使用APP.hex文件对设备进行更新。309———–––help显示nrfutildevice命令的帮助信息。nrf5sdk-tools操作501———––生成私钥private.pem与公钥dfu_public_key.c生成用于设备固件更新的私钥和公钥文件。502———––创建BT.hex合并SD.hexAPP.hexBL.hexST.hex将多个固件文件合并生成一个BT.hex文件，用于设备的固件更新。503———––创建DFU包创建设备固件更新包（DFU包），用于通过DFU协议更新设备固件。504———––通过BLEDongle空中包指定蓝牙名称!DFU_IC_NAME!DFU使用BLEDongle通过空中升级包指定蓝牙名称进行DFU操作。505———––通过BLEDongle空中包指定蓝牙mac地址!DFU_IC_MAC!DFU使用BLEDongle通过空中升级包指定蓝牙MAC地址进行DFU操作。506———––通过UART口:!DFU_UART_PORT!DFU使用UART端口进行DFU操作。507———––通过USB口:!DFU_USB_PORT!DFU使用USB端口进行DFU操作。508———–––help显示nrf5sdk-tools命令的帮助信息。toolchain-manager操作601———––配置工具链安装目录为NCS根目录:!NCS_PATH!配置工具链的安装目录为NCS的根目录。602———––列出已经安装的和可安装的toolchain版本列出所有已安装和可安装的工具链版本。603———––打开命令行窗口或vscode且使用环境变量：!TOOLCHAIN_PATH!!NCS_VERSION!打开命令行窗口或VisualStudioCode，并设置使用环境变量。604———––查看：!TOOLCHAIN_PATH!!NCS_VERSION!环境变量查看工具链的环境变量设置。605———––安装toolchain：!TOOLCHAIN_PATH!!NCS_VERSION!安装指定版本的工具链。606———––卸载toolchain：!TOOLCHAIN_PATH!!NCS_VERSION!卸载指定版本的工具链。607———––显示帮助文件显示toolchain-manager的帮助文件。608———––安装toolchain本地包：!TOOLCHAIN_PKG_PATH!安装指定路径的本地工具链包。609———–––help显示toolchain-manager命令的帮助信息。tracelte操作701———––使用Wireshark查看modem实时log使用Wireshark工具查看modem的实时日志。702———––使用Wireshark查看抓取的modemlog数据使用Wireshark工具查看已抓取的modem日志数据。703———––抓取modemlog为原始数据,按下CTRL-C停止抓取modem日志数据，并按下CTRL-C停止抓取。704———––转换modemlog原始数据为json文件供在线功耗分析仪OPP使用将modem日志的原始数据转换为JSON文件，用于在线功耗分析仪（OPP）使用。705———––抓取modemlog为pcapng数据将modem日志数据抓取为pcapng格式。706———––转换modemlog为早期pcapng数据将modem日志数据转换为早期版本的pcapng格式。707———––保存自定义跟踪配置文件保存自定义的跟踪配置文件。708———––导入自定义跟踪配置文件导入自定义的跟踪配置文件。709———–––help显示tracelte命令的帮助信息。</li>
  <li>NordicnRF5SDKDFU升级步骤编译micro-ecc库生成私钥与公钥编译bootloader与application生成settings文件合并settings文件BootloaderApplication和Softdevice生成dfu升级包及bin文件烧录合并后的固件BLE/UART/USB升级测试NordicnRF5SDKDFU需要配置的参数有生成升级包时的SoftdeviceID芯片系列DFU时固件BootloaderApplication的版本信息DFU升级时的串口端口和和波特率NordicnRF5SDKDFU升级的触发方式按键触发pinreset复位触发寄存器GPREGRET触发DFU升级脚本参数配置及功能说明此脚本主要用于配置和执行Nordic半导体的nRF系列芯片的DFU（DeviceFirmwareUpdate）升级操作。脚本的功能包括检查DFU环境配置、创建DFU密钥、创建通过BLE、UART和USB进行DFU的固件与升级包等。需要配置的参数芯片型号参数:IC_TYPE可选值:nRF52832,nRF52833,nRF52832-QFAB,nRF52820,nRF52810,nRF52811,nRF52805,nRF52840示例:SET&quot;IC_TYPE=nRF52840&quot;现有固件和新固件的SoftDevice版本号参数:DFU_SD,NEW_DFU_SD示例:SET&quot;DFU_SD=s140_nrf52_7.2.0&quot;SET&quot;NEW_DFU_SD=s140_nrf52_7.2.0&quot;DFU固件版本信息参数:HEX_VERSION_ST,HEX_VERSION_APP,HEX_VERSION_BL说明:HEX_VERSION_ST值默认为2，不要修改示例:SET&quot;HEX_VERSION_ST=2&quot;SET&quot;HEX_VERSION_APP=3&quot;SET&quot;HEX_VERSION_BL=3&quot;用户烧录芯片时的Jlink序列号参数:USER_JLINK_SNR示例:SET&quot;USER_JLINK_SNR=&quot;BLE/UART/USB测试DFU升级参数参数:BLE_DONGLE_JLINK_SNR,BLE_DONGLE_COM_PORT,UART_COM_BAUD,UART_COM_PORT,USB_COM_BAUD,USB_COM_PORT示例:SET&quot;BLE_DONGLE_JLINK_SNR=&quot;SET&quot;BLE_DONGLE_COM_PORT=COM29&quot;SET&quot;UART_COM_BAUD=115200&quot;SET&quot;UART_COM_PORT=COM10&quot;SET&quot;USB_COM_BAUD=115200&quot;SET&quot;USB_COM_PORT=COM25&quot;DFU设备的蓝牙名称和MAC地址参数:IC_NAME,IC_MAC示例:SET&quot;IC_NAME=Nordic_Buttonless&quot;SET&quot;IC_MAC=C5:FB:5F:EC:FC:17&quot;修改项目配置参数:CONFIG_DEFAULT_PROJECT示例:SET&quot;CONFIG_DEFAULT_PROJECT=Y&quot;用户自定义DFU工程路径参数:PROJECT_PATH_APPLICATION,PROJECT_PATH_BOOTLOADER_BLE,PROJECT_PATH_BOOTLOADER_UART,PROJECT_PATH_BOOTLOADER_USB说明:当CONFIG_DEFAULT_PROJECT为N时需配置示例:SET&quot;PROJECT_PATH_APPLICATION=&quot;SET&quot;PROJECT_PATH_BOOTLOADER_BLE=&quot;SET&quot;PROJECT_PATH_BOOTLOADER_UART=&quot;SET&quot;PROJECT_PATH_BOOTLOADER_USB=&quot;用户自定义DFU固件路径参数:HEX_PATH_SD,HEX_PATH_APP,HEX_PATH_BL_BLE,HEX_PATH_BL_UART,HEX_PATH_BL_USB说明:当CONFIG_DEFAULT_PROJECT为N时需配置示例:SET&quot;HEX_PATH_SD=&quot;SET&quot;HEX_PATH_APP=&quot;SET&quot;HEX_PATH_BL_BLE=&quot;SET&quot;HEX_PATH_BL_UART=&quot;SET&quot;HEX_PATH_BL_USB=&quot;脚本功能第一步：检查DFU环境配置检查nrfutil配置检查nrfjprog配置检查arm-none-eabi-gcc检查make配置检查用户配置的参数查看帮助文档安装nRF5SDKnRF52805补丁第二步：创建DFU私钥与公钥创建DFU私钥dfu_private_key.pem和DFU公钥dfu_public_key.c用创建的DFU公钥dfu_public_key.c替换DFU目录的DFU公钥第三步：创建通过BLE进行DFU的固件与升级包编译BLEBootloader工程编译Application工程复制BL_BLE.hexSD.hexAPP.hex到当前目录合并DFU固件为MERGED_BLE.hex生成DFU升级包*.zip生成DFU升级文件*.bin给MCU上位机用烧录MERGED_BLE.hex固件使用Dongle通过BLEname升级APP.zip使用Dongle通过BLEmac升级APP.zip第四步：创建通过UART进行DFU的固件与升级包编译UARTBootloader工程编译Application工程复制BL_UART.hexSD.hexAPP.hex到当前目录合并DFU固件为MERGED_UART.hex生成DFU升级包*.zip生成DFU升级文件*.bin给MCU上位机用烧录MERGED_UART.hex固件使用UART串口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_GPREGRET=1NRF_DFU_SERIAL_UART_USES_HWFC=0)使用UART串口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_PINRESET=1NRF_DFU_SERIAL_UART_USES_HWFC=0)使用UART串口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_BUTTON=1NRF_DFU_SERIAL_UART_USES_HWFC=0)第五步：创建通过USB进行DFU的固件与升级包当IC_TYPE为nRF52840,nRF52833或nRF52820时才执行编译USBBootloader工程编译Application工程复制BL_USB.hexSD.hexAPP.hex到当前目录合并DFU固件为MERGED_USB.hex生成DFU升级包*.zip生成DFU升级文件*.bin给MCU上位机用烧录MERGED_USB.hex固件使用USB口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_GPREGRET=1)使用USB口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_PINRESET=1)使用USB口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_BUTTON=1)NordicnRF5SDKDFU脚本内容云盘下载：链接@setlocalenabledelayedexpansion@echooff:prompt@echooffecho===========================================================echo用户需要配置的参数echo===========================================================REM设置芯片型号REM可选项：[nRF52832|nRF52833|nRF52832-QFAB|nRF52820|nRF52810|nRF52811|nRF52805|nRF52840]SET"IC_TYPE=nRF52840"REM设置现有固件和新固件的SoftDevice版本号REM版本号从SoftDevice固件路径获取SET"DFU_SD=s140_nrf52_7.2.0"SET"NEW_DFU_SD=s140_nrf52_7.2.0"REM设置DFU固件版本信息REMHEX_VERSION_ST值默认为2，不要修改。SET"HEX_VERSION_ST=2"SET"HEX_VERSION_APP=3"SET"HEX_VERSION_BL=3"REM设置用户烧录芯片时的Jlink序列号REMSET"USER_JLINK_SNR=1050227850"SET"USER_JLINK_SNR="REM在Windows上使用BLE/UART/USB测试DFU升级需配置下述参数REM配置DK[nRF52820nRF52833nRF52840]做Dongle时的Jlink序列号，非DK做Dongle（正常Dongle）则序列号留空。REMSET"BLE_DONGLE_JLINK_SNR=682774303"SET"BLE_DONGLE_JLINK_SNR="SET"BLE_DONGLE_COM_PORT=COM29"SET"UART_COM_BAUD=115200"SET"UART_COM_PORT=COM10"SET"USB_COM_BAUD=115200"SET"USB_COM_PORT=COM25"REM需要进行DFU的设备的蓝牙名称和MAC地址SET"IC_NAME=Nordic_Buttonless"SET"IC_MAC=C5:FB:5F:EC:FC:17"REM修改CONFIG_DEFAULT_PROJECT设置为N可使脚本作用于用户自己的DFU工程：BLE/UART/USBBootloader和ApplicationSET"CONFIG_DEFAULT_PROJECT=Y"REM判断芯片是否带USB功能，用于屏蔽部分没有USB功能的芯片指令if"!IC_TYPE!"=="nRF52840"(SET"USB_MATCH=TRUE")elseif"!IC_TYPE!"=="nRF52833"(SET"USB_MATCH=TRUE")elseif"!IC_TYPE!"=="nRF52820"(SET"USB_MATCH=TRUE")else(SET"USB_MATCH=FALSE")if"!CONFIG_DEFAULT_PROJECT!"=="N"(echo设置用户自己的DFU工程路径，可参考默认DFU工程路径SET"PROJECT_PATH_APPLICATION="SET"PROJECT_PATH_BOOTLOADER_BLE="SET"PROJECT_PATH_BOOTLOADER_UART="REM当使用下述芯片时需设置USBBootloader工程路径：nRF52840nRF52833nRF52820if"!USB_MATCH!"=="TRUE"(SET"PROJECT_PATH_BOOTLOADER_USB=")echo设置用户自己的DFU固件路径，可参考默认DFU固件路径SET"HEX_PATH_SD="SET"HEX_PATH_APP="SET"HEX_PATH_BL_BLE="SET"HEX_PATH_BL_UART="REM当使用下述芯片时需设置USBBootloader固件路径：nRF52840nRF52833nRF52820if"!USB_MATCH!"=="TRUE"(SET"HEX_PATH_BL_USB="))echo===========================================================echo参数配置完毕echo===========================================================REM配置用户烧录芯片时的Jlink序列号ifnot"!USER_JLINK_SNR!"==""(SET"USER_JLINK_SNR=--snr!USER_JLINK_SNR!")REM配置DKDongleJlink序列号ifnot"!BLE_DONGLE_JLINK_SNR!"==""(SET"DONGLE_PROG_JLINK_SNR=--snr!BLE_DONGLE_JLINK_SNR!"SET"DONGLE_DFU_JLINK_SNR=-snr!BLE_DONGLE_JLINK_SNR!")else(SET"DONGLE_PROG_JLINK_SNR="SET"DONGLE_DFU_JLINK_SNR=")echo用户烧录芯片时的Jlink序列号为：!USER_JLINK_SNR!echo配置DK做Dongle时的DKDongleJlink序列号为：!BLE_DONGLE_JLINK_SNR!echoBLEDongle串口端口号设置为：!BLE_DONGLE_COM_PORT!echoUART串口波特率设置为：!UART_COM_BAUD!echoUART串口端口号设置为：!UART_COM_PORT!echoUSB串口波特率设置为：!USB_COM_BAUD!echoUSB串口端口号设置为：!USB_COM_PORT!echo需要进行DFU的设备的蓝牙名称设置为：!IC_NAME!echo需要进行DFU的设备的MAC地址设置为：!IC_MAC!echo===========================================================REMDFU默认工程路径配置if"!CONFIG_DEFAULT_PROJECT!"=="Y"(echo"使用默认DFU工程"if"!IC_TYPE!"=="nRF52840"(REM"设置DFU工程路径"SET"PROJECT_PATH_APPLICATION=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10056\s140\arm5_no_packs\ble_app_buttonless_dfu_pca10056_s140.uvprojx"SET"PROJECT_PATH_BOOTLOADER_BLE=..\examples\dfu\secure_bootloader\pca10056_s140_ble\arm5_no_packs\secure_bootloader_ble_s140_pca10056.uvprojx"SET"PROJECT_PATH_BOOTLOADER_UART=..\examples\dfu\secure_bootloader\pca10056_uart\arm5_no_packs\secure_bootloader_uart_mbr_pca10056.uvprojx"SET"PROJECT_PATH_BOOTLOADER_USB=..\examples\dfu\secure_bootloader\pca10056_usb\arm5_no_packs\secure_bootloader_usb_mbr_pca10056.uvprojx"REM"设置DFU工程固件路径"SET"HEX_PATH_SD=..\components\softdevice\s140\hex\s140_nrf52_7.2.0_softdevice.hex"SET"HEX_PATH_APP=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10056\s140\arm5_no_packs\_build\nrf52840_xxaa.hex"SET"HEX_PATH_BL_BLE=..\examples\dfu\secure_bootloader\pca10056_s140_ble\arm5_no_packs\_build\nrf52840_xxaa_s140.hex"SET"HEX_PATH_BL_UART=..\examples\dfu\secure_bootloader\pca10056_uart\arm5_no_packs\_build\nrf52840_xxaa_mbr.hex"SET"HEX_PATH_BL_USB=..\examples\dfu\secure_bootloader\pca10056_usb\arm5_no_packs\_build\nrf52840_xxaa.hex")elseif"!IC_TYPE!"=="nRF52833"(REM"DFU工程路径设置"SET"PROJECT_PATH_APPLICATION=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10100\s140\arm5_no_packs\ble_app_buttonless_dfu_pca10100_s140.uvprojx"SET"PROJECT_PATH_BOOTLOADER_BLE=..\examples\dfu\secure_bootloader\pca10100_s140_ble\arm5_no_packs\secure_bootloader_ble_s140_pca10100.uvprojx"SET"PROJECT_PATH_BOOTLOADER_UART=..\examples\dfu\secure_bootloader\pca10100_uart\arm5_no_packs\secure_bootloader_uart_mbr_pca10100.uvprojx"SET"PROJECT_PATH_BOOTLOADER_USB=..\examples\dfu\secure_bootloader\pca10100_usb\arm5_no_packs\secure_bootloader_usb_mbr_pca10100.uvprojx"REM"DFU工程编译后固件路径设置"SET"HEX_PATH_SD=..\components\softdevice\s140\hex\s140_nrf52_7.2.0_softdevice.hex"SET"HEX_PATH_APP=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10100\s140\arm5_no_packs\_build\nrf52833_xxaa.hex"SET"HEX_PATH_BL_BLE=..\examples\dfu\secure_bootloader\pca10100_s140_ble\arm5_no_packs\_build\nrf52833_xxaa_s140.hex"SET"HEX_PATH_BL_UART=..\examples\dfu\secure_bootloader\pca10100_uart\arm5_no_packs\_build\nrf52833_xxaa_mbr.hex"SET"HEX_PATH_BL_USB=..\examples\dfu\secure_bootloader\pca10100_usb\arm5_no_packs\_build\nrf52833_xxaa.hex")elseif"!IC_TYPE!"=="nRF52820"(REM"DFU工程路径设置"SET"PROJECT_PATH_APPLICATION=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10100e\s112\arm5_no_packs\ble_app_buttonless_dfu_pca10100e_s112.uvprojx"SET"PROJECT_PATH_BOOTLOADER_BLE=..\examples\dfu\secure_bootloader\pca10100e_s112_ble\arm5_no_packs\secure_bootloader_ble_s112_pca10100e.uvprojx"SET"PROJECT_PATH_BOOTLOADER_UART=..\examples\dfu\secure_bootloader\pca10100e_uart\arm5_no_packs\secure_bootloader_uart_mbr_pca10100e.uvprojx"SET"PROJECT_PATH_BOOTLOADER_USB=..\examples\dfu\secure_bootloader\pca10100e_usb\arm5_no_packs\secure_bootloader_usb_mbr_pca10100e.uvprojx"REM"DFU工程编译后固件路径设置"SET"HEX_PATH_SD=..\components\softdevice\s112\hex\s112_nrf52_7.2.0_softdevice.hex"SET"HEX_PATH_APP=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10100e\s112\arm5_no_packs\_build\nrf52820_xxaa.hex"SET"HEX_PATH_BL_BLE=..\examples\dfu\secure_bootloader\pca10100e_s112_ble\arm5_no_packs\_build\nrf52820_xxaa_s112.hex"SET"HEX_PATH_BL_UART=..\examples\dfu\secure_bootloader\pca10100e_uart\arm5_no_packs\_build\nrf52820_xxaa_mbr.hex"SET"HEX_PATH_BL_USB=..\examples\dfu\secure_bootloader\pca10100e_usb\arm5_no_packs\_build\nrf52820_xxaa.hex")elseif"!IC_TYPE!"=="nRF52832"(REM"DFU工程路径设置"SET"PROJECT_PATH_APPLICATION=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10040\s132\arm5_no_packs\ble_app_buttonless_dfu_pca10040_s132.uvprojx"SET"PROJECT_PATH_BOOTLOADER_BLE=..\examples\dfu\secure_bootloader\pca10040_s132_ble\arm5_no_packs\secure_bootloader_ble_s132_pca10040.uvprojx"SET"PROJECT_PATH_BOOTLOADER_UART=..\examples\dfu\secure_bootloader\pca10040_uart\arm5_no_packs\secure_bootloader_uart_mbr_pca10040.uvprojx"REM"DFU工程编译后固件路径设置"SET"HEX_PATH_SD=..\components\softdevice\s132\hex\s132_nrf52_7.2.0_softdevice.hex"SET"HEX_PATH_APP=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10040\s132\arm5_no_packs\_build\nrf52832_xxaa.hex"SET"HEX_PATH_BL_BLE=..\examples\dfu\secure_bootloader\pca10040_s132_ble\arm5_no_packs\_build\nrf52832_xxaa_s132.hex"SET"HEX_PATH_BL_UART=..\examples\dfu\secure_bootloader\pca10040_uart\arm5_no_packs\_build\nrf52832_xxaa_mbr.hex")elseif"!IC_TYPE!"=="nRF52811"(echo"DFU工程路径设置"SET"PROJECT_PATH_APPLICATION=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10056e\s112\arm5_no_packs\ble_app_buttonless_dfu_pca10056e_s112.uvprojx"SET"PROJECT_PATH_BOOTLOADER_BLE=..\examples\dfu\secure_bootloader\pca10056e_s112_ble\arm5_no_packs\secure_bootloader_ble_s112_pca10056e.uvprojx"SET"PROJECT_PATH_BOOTLOADER_UART=..\examples\dfu\secure_bootloader\pca10056e_uart\arm5_no_packs\secure_bootloader_uart_mbr_pca10056e.uvprojx"REM"DFU工程编译后固件路径设置"SET"HEX_PATH_SD=..\components\softdevice\s112\hex\s112_nrf52_7.2.0_softdevice.hex"SET"HEX_PATH_APP=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10056e\s112\arm5_no_packs\_build\nrf52811_xxaa.hex"SET"HEX_PATH_BL_BLE=..\examples\dfu\secure_bootloader\pca10056e_s112_ble\arm5_no_packs\_build\nrf52811_xxaa_s112.hex"SET"HEX_PATH_BL_UART=..\examples\dfu\secure_bootloader\pca10056e_uart\arm5_no_packs\_build\nrf52811_xxaa_mbr.hex")elseif"!IC_TYPE!"=="nRF52810"(REM"DFU工程路径设置"SET"PROJECT_PATH_APPLICATION=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10040e\s112\arm5_no_packs\ble_app_buttonless_dfu_pca10040e_s112.uvprojx"SET"PROJECT_PATH_BOOTLOADER_BLE=..\examples\dfu\secure_bootloader\pca10040e_s112_ble\arm5_no_packs\secure_bootloader_ble_s112_pca10040e.uvprojx"SET"PROJECT_PATH_BOOTLOADER_UART=..\examples\dfu\secure_bootloader\pca10040e_uart\arm5_no_packs\secure_bootloader_uart_mbr_pca10040e.uvprojx"REM"DFU工程编译后固件路径设置"SET"HEX_PATH_SD=..\components\softdevice\s112\hex\s112_nrf52_7.2.0_softdevice.hex"SET"HEX_PATH_APP=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10040e\s112\arm5_no_packs\_build\nrf52810_xxaa.hex"SET"HEX_PATH_BL_BLE=..\examples\dfu\secure_bootloader\pca10040e_s112_ble\arm5_no_packs\_build\nrf52810_xxaa_s112.hex"SET"HEX_PATH_BL_UART=..\examples\dfu\secure_bootloader\pca10040e_uart\arm5_no_packs\_build\nrf52810_xxaa_mbr.hex")elseif"!IC_TYPE!"=="nRF52805"(REM"DFU工程路径设置"SET"PROJECT_PATH_APPLICATION=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10040e_nrf52805\s112\arm5_no_packs\ble_app_buttonless_dfu_pca10040e_nrf52805_s112.uvprojx"SET"PROJECT_PATH_BOOTLOADER_BLE=..\examples\dfu\secure_bootloader\pca10040e_nrf52805_s112_ble\arm5_no_packs\secure_bootloader_ble_s112_pca10040e_nrf52805.uvprojx"SET"PROJECT_PATH_BOOTLOADER_UART=..\examples\dfu\secure_bootloader\pca10040e_nrf52805_uart\arm5_no_packs\secure_bootloader_uart_mbr_pca10040e_nrf52805.uvprojx"REM"DFU工程编译后固件路径设置"SET"HEX_PATH_SD=..\components\softdevice\s112\hex\s112_nrf52_7.2.0_softdevice.hex"SET"HEX_PATH_APP=..\examples\ble_peripheral\ble_app_buttonless_dfu\pca10040e_nrf52805\s112\arm5_no_packs\_build\nrf52805_xxaa.hex"SET"HEX_PATH_BL_BLE=..\examples\dfu\secure_bootloader\pca10040e_nrf52805_s112_ble\arm5_no_packs\_build\nrf52805_xxaa_s112.hex"SET"HEX_PATH_BL_UART=..\examples\dfu\secure_bootloader\pca10040e_nrf52805_uart\arm5_no_packs\_build\nrf52805_xxaa_mbr.hex")else(echo不支持的芯片型号：!IC_TYPE!))else(echo当前使用用户自己的DFU工程)echo===========================================================SET"PRO_IC_FAMILY=NRF52"echo"设置烧录时芯片系列为：!PRO_IC_FAMILY!可选项为：[NRF51|NRF52|NRF53|NRF91]"SET"PKG_HW_FAMILY=52"echo"设置生成DFU包时芯片系列为：!PKG_HW_FAMILY!可选项为：[51|52]"IF"!IC_TYPE!"=="nRF52832"SET"ST_IC_FAMILY=NRF52"IF"!IC_TYPE!"=="nRF52833"SET"ST_IC_FAMILY=NRF52"IF"!IC_TYPE!"=="nRF52832-QFAB"SET"ST_IC_FAMILY=NRF52QFAB"IF"!IC_TYPE!"=="nRF52820"SET"ST_IC_FAMILY=NRF52QFAB"IF"!IC_TYPE!"=="nRF52810"SET"ST_IC_FAMILY=NRF52810"IF"!IC_TYPE!"=="nRF52811"SET"ST_IC_FAMILY=NRF52810"IF"!IC_TYPE!"=="nRF52805"SET"ST_IC_FAMILY=NRF52810"IF"!IC_TYPE!"=="nRF52840"SET"ST_IC_FAMILY=NRF52840"echo"设置生成DFUSettings文件时芯片系列为：!ST_IC_FAMILY!可选项为：[NRF51|NRF52|NRF52QFAB|NRF52810|NRF52840]"echo===========================================================REM初始化PKG_VERSION_SD_IDSET"PKG_VERSION_SD_ID="SET"PKG_VERSION_SD_REQ="REM定义软件设备版本号与ID的数组set"SD_VERSION[s112_nrf52_6.0.0]=0xA7"set"SD_VERSION[s112_nrf52_6.1.0]=0xB0"set"SD_VERSION[s112_nrf52_6.1.1]=0xB8"set"SD_VERSION[s112_nrf52_7.0.0]=0xC4"set"SD_VERSION[s112_nrf52_7.0.1]=0xCD"set"SD_VERSION[s112_nrf52_7.2.0]=0x103"set"SD_VERSION[s112_nrf52_7.3.0]=0x126"set"SD_VERSION[s113_nrf52_7.0.0]=0xC3"set"SD_VERSION[s113_nrf52_7.0.1]=0xCC"set"SD_VERSION[s113_nrf52_7.2.0]=0x102"set"SD_VERSION[s113_nrf52_7.3.0]=0x125"set"SD_VERSION[s122_nrf52_8.0.0]=0xEA"set"SD_VERSION[s122_nrf52_8.1.1]=0x112"set"SD_VERSION[s130_nrf51_1.0.0]=0x67"set"SD_VERSION[s130_nrf51_2.0.0]=0x80"set"SD_VERSION[s130_nrf51_2.0.1]=0x87"set"SD_VERSION[s132_nrf52_2.0.0]=0x81"set"SD_VERSION[s132_nrf52_2.0.1]=0x88"set"SD_VERSION[s132_nrf52_3.0.0]=0x8C"set"SD_VERSION[s132_nrf52_3.1.0]=0x91"set"SD_VERSION[s132_nrf52_4.0.0]=0x95"set"SD_VERSION[s132_nrf52_4.0.2]=0x98"set"SD_VERSION[s132_nrf52_4.0.3]=0x99"set"SD_VERSION[s132_nrf52_4.0.4]=0x9E"set"SD_VERSION[s132_nrf52_4.0.5]=0x9F"set"SD_VERSION[s132_nrf52_5.0.0]=0x9D"set"SD_VERSION[s132_nrf52_5.1.0]=0xA5"set"SD_VERSION[s132_nrf52_6.0.0]=0xA8"set"SD_VERSION[s132_nrf52_6.1.0]=0xAF"set"SD_VERSION[s132_nrf52_6.1.1]=0xB7"set"SD_VERSION[s132_nrf52_7.0.0]=0xC2"set"SD_VERSION[s132_nrf52_7.0.1]=0xCB"set"SD_VERSION[s132_nrf52_7.2.0]=0x101"set"SD_VERSION[s132_nrf52_7.3.0]=0x124"set"SD_VERSION[s140_nrf52_6.0.0]=0xA9"set"SD_VERSION[s140_nrf52_6.1.0]=0xAE"set"SD_VERSION[s140_nrf52_6.1.1]=0xB6"set"SD_VERSION[s140_nrf52_7.0.0]=0xC1"set"SD_VERSION[s140_nrf52_7.0.1]=0xCA"set"SD_VERSION[s140_nrf52_7.2.0]=0x100"set"SD_VERSION[s140_nrf52_7.3.0]=0x123"set"SD_VERSION[s212_nrf52_6.1.1]=0xBC"set"SD_VERSION[s332_nrf52_6.1.1]=0xBA"set"SD_VERSION[s340_nrf52_6.1.1]=0xB9"REM设置PKG_VERSION_SD_IDifdefinedSD_VERSION[%DFU_SD%](SET"PKG_VERSION_SD_ID=!SD_VERSION[%DFU_SD%]!")else(echo"错误：不支持的SoftDevice版本n:!DFU_SD!"exit/b1)REM设置PKG_VERSION_SD_REQifdefinedSD_VERSION[%NEW_DFU_SD%](SET"PKG_VERSION_SD_REQ=!SD_VERSION[%NEW_DFU_SD%]!")else(echo"错误：不支持的SoftDevice版本:!NEW_DFU_SD!"exit/b1)echo"DFU现有固件SoftDeviceID为：!PKG_VERSION_SD_ID!"echo"DFU新的固件SoftDeviceID为：!PKG_VERSION_SD_REQ!"echo===========================================================echo"DFU密钥依赖库路径设置"SET"KEY_BACKUP_TIME=%date:~0,4%%date:~5,2%%date:~8,2%-%time:~0,2%%time:~3,2%%time:~6,2%"SET"MICRO_ECC_FOLDER_SOURCE_PATH=.\micro-ecc"SET"MICRO_ECC_FOLDER_TARGET_PATH=..\external\micro-ecc"SET"MICRO_ECC_LIB_PATH=..\external\micro-ecc\nrf52hf_keil\armgcc\micro_ecc_lib_nrf52.lib"SET"PRIVATE_KEY_NAME=dfu_private_key.pem"SET"PUBLIC_KEY_NAME=dfu_public_key.c"SET"KEY_BACKUP_DIRECTORY_PATH=.\backup\"SET"PUBLIC_KEY_PATH=..\examples\dfu\"echo===========================================================echo"HEX固件文件名字解释"echo"ST为settings文件"echo"BL为bootloader文件"echo"SD为softdevice文件"echo"APP为application文件"echo"MERGED为settings文件+bootloader文件+softdevice文件+application文件合并后的文件"echo"HEX固件文件名字定义"SET"HEX_NAME_BL_BLE=BL_BLE.hex"SET"HEX_NAME_BL_UART=BL_UART.hex"SET"HEX_NAME_BL_USB=BL_USB.hex"SET"HEX_NAME_SD=SD.hex"SET"HEX_NAME_APP=APP.hex"SET"HEX_NAME_SD_APP_BL_BLE=SD_APP_BL_BLE.hex"SET"HEX_NAME_SD_APP_BL_UART=SD_APP_BL_UART.hex"SET"HEX_NAME_SD_APP_BL_USB=SD_APP_BL_USB.hex"SET"HEX_NAME_MERGED_BLE=MERGED_BLE.hex"SET"HEX_NAME_MERGED_UART=MERGED_UART.hex"SET"HEX_NAME_MERGED_USB=MERGED_USB.hex"SET"HEX_NAME_SD_APP=SD_APP.hex"SET"HEX_NAME_ST=ST.hex"echo===========================================================echo"ZIP升级包文件名字定义"SET"PKG_NAME_BL_BLE=BL_BLE.zip"SET"PKG_NAME_BL_UART=BL_UART.zip"SET"PKG_NAME_BL_USB=BL_USB.zip"SET"PKG_NAME_SOFTDEVICE=SD.zip"SET"PKG_NAME_APP=APP.zip"SET"PKG_NAME_BL_BLE_SD=BL_BLE_SD.zip"SET"PKG_NAME_BL_UART_SD=BL_UART_SD.zip"SET"PKG_NAME_BL_USB_SD=BL_USB_SD.zip"SET"PKG_NAME_BL_BLE_SD_APP=BL_BLE_SD_APP.zip"SET"PKG_NAME_BL_UART_SD_APP=BL_UART_SD_APP.zip"SET"PKG_NAME_BL_USB_SD_APP=BL_USB_SD_APP.zip"SET"PKG_NAME_SD_APP=SD_APP.zip"echo===========================================================echo"设置ZIP包转BIN文件python工具路径"SET"TOOL_PATH_ZIP_TO_BIN=!CD!\micro-ecc\dfu_zip_to_bin.py"echo"BIN文件名字定义"SET"BIN_NAME_BL_BLE=BL_BLE.bin"SET"BIN_NAME_BL_UART=BL_UART.bin"SET"BIN_NAME_BL_USB=BL_USB.bin"SET"BIN_NAME_SOFTDEVICE=SD.bin"SET"BIN_NAME_APP=APP.bin"SET"BIN_NAME_BL_BLE_SD=BL_BLE_SD.bin"SET"BIN_NAME_BL_UART_SD=BL_UART_SD.bin"SET"BIN_NAME_BL_USB_SD=BL_USB_SD.bin"SET"BIN_NAME_BL_BLE_SD_APP=BL_BLE_SD_APP.bin"SET"BIN_NAME_BL_UART_SD_APP=BL_UART_SD_APP.bin"SET"BIN_NAME_BL_USB_SD_APP=BL_USB_SD_APP.bin"SET"BIN_NAME_SD_APP=SD_APP.bin"clsecho===========================================================echo"用REM注释掉cls查看所有配置"echo"脚本默认放在目录：nRF5_SDK_17.1.0_ddde560_dfu\PMtools\"echo===========================================================echo"nrf-command-line-tools命令行工具"echo"PMtoolsDFU命令行工具v0.0.1-Peter"echo===========================================================echo"常用指令操作"echo"第一步：检查DFU环境配置"echo"011-------------检查DFU环境nrfutil配置"echo"012-------------检查DFU环境nrfjprog配置"echo"013-------------检查arm-none-eabi-gcc"echo"014-------------检查DFU环境make配置"echo"015-------------检查用户配置的参数"echo"016-------------查看帮助文档"echo"017-------------安装nRF5SDKnRF52805补丁"echo===========================================================echo"第二步：创建DFU私钥与公钥"echo"021-------------创建DFU私钥dfu_private_key.pem和DFU公钥dfu_public_key.c"echo"022-------------用创建的DFU公钥dfu_public_key.c替换DFU目录的DFU公钥"echo===========================================================echo"第三步：创建通过BLE进行DFU的固件与升级包"echo"031-------------编译BLEBootloader工程"echo"032-------------编译Application工程"echo"033-------------复制BL_BLE.hexSD.hexAPP.hex到当前目录"echo"034-------------合并DFU固件为MERGED_BLE.hex生成DFU升级包*.zip"echo"035-------------生成DFU升级文件*.bin给MCU上位机用"echo"036-------------烧录MERGED_BLE.hex固件"echo"037-------------使用Dongle通过BLEname升级APP.zip"echo"038-------------使用Dongle通过BLEmac升级APP.zip"echo===========================================================echo"第四步：创建通过UART进行DFU的固件与升级包"echo"041-------------编译UARTBootloader工程"echo"042-------------编译Application工程"echo"043-------------复制BL_UART.hexSD.hexAPP.hex到当前目录"echo"044-------------合并DFU固件为MERGED_UART.hex生成DFU升级包*.zip"echo"045-------------生成DFU升级文件*.bin给MCU上位机用"echo"046-------------烧录MERGED_UART.hex固件"echo"047-------------使用UART串口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_GPREGRET=1NRF_DFU_SERIAL_UART_USES_HWFC=0)"echo"048-------------使用UART串口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_PINRESET=1NRF_DFU_SERIAL_UART_USES_HWFC=0)"echo"049-------------使用UART串口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_BUTTON=1NRF_DFU_SERIAL_UART_USES_HWFC=0)"echo===========================================================if"!USB_MATCH!"=="TRUE"(echo"第五步：创建通过USB进行DFU的固件与升级包"echo"051-------------编译USBBootloader工程"echo"052-------------编译Application工程"echo"053-------------复制BL_USB.hexSD.hexAPP.hex到当前目录"echo"054-------------合并DFU固件为MERGED_USB.hex生成DFU升级包*.zip"echo"055-------------生成DFU升级文件*.bin给MCU上位机用"echo"056-------------烧录MERGED_USB.hex固件"echo"057-------------使用USB口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_GPREGRET=1)"echo"058-------------使用USB口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_PINRESET=1)"echo"059-------------使用USB口升级APP.zip(需配置NRF_BL_DFU_ENTER_METHOD_BUTTON=1)"echo===========================================================)echo"通用指令操作"echo"rcv-------------recover"echo"rst-------------debugreset"echo"e-------------exit"echo===========================================================set/p"choice=请输入选项（001-059）执行对应的DFU步骤:"if"!choice!"==""(gotoprompt)elseif"!choice!"=="011"(REM检查nrfjprogwherenrfjprog&gt;nul2&gt;nulif%errorlevel%neq0(echo"1.未安装nRFCommandLineTools或者未配置nrfjprog路径到windowspath环境变量（默认路径：C:\ProgramFiles\NordicSemiconductor\nrf-command-line-tools\bin）"echo"2.下载链接：https://www.nordicsemi.com/Products/Development-tools/nRF-Command-Line-Tools/Download?lang=en#infotabs")else(wherenrfjprogwheremergehexnrfjprog-v))elseif"!choice!"=="012"(REM检查nrfutilwherenrfutil&gt;nul2&gt;nulif%errorlevel%neq0(echo"1.未安装或未配置nrfutil路径到windowspath环境变量（默认路径：D:\nRF5SDK\nRF5_SDK_17.1.0_ddde560_dfu\nrf52840_ok\micro-ecc\nrfutil.exe）"echo"2.下载链接：https://www.nordicsemi.com/Products/Development-tools/nRF-Util/Download#infotabs")else(wherenrfutilnrfutil-V))elseif"!choice!"=="013"(REM检查arm-none-eabi-gccwherearm-none-eabi-gcc&gt;nul2&gt;nulif%errorlevel%neq0(echo"1.未安装GCC:GCCARMEmbedded9.2020-q2.major"echo"2.下载链接：https://developer.arm.com/downloads/-/gnu-rm")else(wherearm-none-eabi-gccarm-none-eabi-gcc--version))elseif"!choice!"=="014"(REM检查makewheremake&gt;nul2&gt;nulif%errorlevel%neq0(echo"1.未安装make，GNUMake4.3"echo"2.下载链接：https://udomain.dl.sourceforge.net/project/gnuwin32/sed/4.2.1/sed-4.2.1-setup.exe?viasf=1")else(wheremakemake-v))elseif"!choice!"=="015"(echo"当前已经连接上的Jlink序列号为："nrfjprog--idsecho"当前脚本当所在前目录为：%~dp0"echo"DFU的芯片型号设置为：!IC_TYPE!"echo"老固件softdevice版本号与ID设置为：!DFU_SD!!PKG_VERSION_SD_ID!"echo"新固件softdevice版本号与ID设置为：!NEW_DFU_SD!!PKG_VERSION_SD_REQ!"echo"烧录时芯片family系列为：!PRO_IC_FAMILY!"echo"生成Settings时芯片family为：!ST_IC_FAMILY!"echo"生成*.zip包时芯片系列为：!PKG_HW_FAMILY!"echo"APP版本为用户自定义：!HEX_VERSION_APP!"echo"Bootloader版本为用户自定义：!HEX_VERSION_BL!"echo"Settings版本为固定值：!HEX_VERSION_ST!"echo"在windows上使用BLE/UART/USB测试DFU升级需配置下述参数"echo"用户给自己板子烧录程序用的Jlink序列号设置为：!USER_JLINK_SNR!"echo"用户给开发板烧录Dongle程序的Jlink序列号设置为：!BLE_DONGLE_JLINK_SNR!"echo"BLEDongle串口端口号设置为：!BLE_DONGLE_COM_PORT!"echo"UART串口波特率设置为：!UART_COM_BAUD!"echo"UART串口端口号设置为：!UART_COM_PORT!"echo"USB串口波特率设置为：!USB_COM_BAUD!"echo"USB串口端口号设置为：!USB_COM_PORT!"echo"需要进行DFU的设备的蓝牙名称设置为：!IC_NAME!"echo"需要进行DFU的设备的MAC地址设置为：!IC_MAC!"echo"当前CONFIG_DEFAULT_PROJECT设置为!CONFIG_DEFAULT_PROJECT!，=N则使用用户自定义工程路径"echo"工程路径设置"echo"Application工程路径设置为：!PROJECT_PATH_APPLICATION!"echo"BLEBootloader工程路径设置为：!PROJECT_PATH_BOOTLOADER_BLE!"echo"UARTBootloader工程路径设置为：!PROJECT_PATH_BOOTLOADER_UART!"if"!USB_MATCH!"=="TRUE"(echo"USBBootloader工程路径设置为：!PROJECT_PATH_BOOTLOADER_USB!")echo"固件路径设置"echo"SoftDevice固件路径设置为：!HEX_PATH_SD!"echo"Application固件路径设置为：!HEX_PATH_APP!"echo"BLEBootloader固件路径设置为：!HEX_PATH_BL_BLE!"echo"UARTBootloader固件路径设置为：!HEX_PATH_BL_UART!"if"!USB_MATCH!"=="TRUE"(echo"USBBootloader固件路径设置为：!HEX_PATH_BL_USB!"))elseif"!choice!"=="016"(REMstartmsedge"https://www.cnblogs.com/iini/p/9314246.html"REMstartmsedge"!CD!\micro-ecc\nRF_Command_Line_Tools_v1.4.pdf"REMstartmsedge"!CD!\micro-ecc\nrfutil_v6.1.0.pdf"startmsedge"!CD!\micro-ecc\readme.md")elseif"!choice!"=="017"(echo"nRF52805patch路径设置"SET"PATCH_PATH_NRF52805=.\micro-ecc\nRF52805_patch"copy"!PATCH_PATH_NRF52805!\nrfx_irqs.h"..\modules\nrfx\soc\nrfx_irqs.hcopy"!PATCH_PATH_NRF52805!\nrfx_irqs_nrf52805.h"..\modules\nrfx\soc\nrfx_irqs_nrf52805.hcopy"!PATCH_PATH_NRF52805!\nrfx_coredep.h"..\modules\nrfx\soc\nrfx_coredep.hcopy"!PATCH_PATH_NRF52805!\nrfx_prs.h"..\modules\nrfx\drivers\src\prs\nrfx_prs.hcopy"!PATCH_PATH_NRF52805!\nrf_dfu_types.h"..\components\libraries\bootloader\dfu\nrf_dfu_types.hcopy"!PATCH_PATH_NRF52805!\nrf_bootloader_info.h"..\components\libraries\bootloader\nrf_bootloader_info.h)elseif"!choice!"=="021"(ifnotexist!MICRO_ECC_LIB_PATH!(echo"copymicro-eccdirectorytoexternaldirectory"ROBOCOPY!MICRO_ECC_FOLDER_SOURCE_PATH!!MICRO_ECC_FOLDER_TARGET_PATH!/E/MT:8)ifnotexist!KEY_BACKUP_DIRECTORY_PATH!(echo"makebackupdirectory"md!KEY_BACKUP_DIRECTORY_PATH!)ifexist!PRIVATE_KEY_NAME!(echo"backup"!PRIVATE_KEY_NAME!ren!PRIVATE_KEY_NAME!!KEY_BACKUP_TIME!.!PRIVATE_KEY_NAME!move!KEY_BACKUP_TIME!.!PRIVATE_KEY_NAME!!KEY_BACKUP_DIRECTORY_PATH!!KEY_BACKUP_TIME!.!PRIVATE_KEY_NAME!)ifexist!PUBLIC_KEY_NAME!(echo"backup"!PUBLIC_KEY_NAME!ren!PUBLIC_KEY_NAME!!KEY_BACKUP_TIME!.!PUBLIC_KEY_NAME!move!KEY_BACKUP_TIME!.!PUBLIC_KEY_NAME!!KEY_BACKUP_DIRECTORY_PATH!!KEY_BACKUP_TIME!.!PUBLIC_KEY_NAME!)echo"create"!PRIVATE_KEY_NAME!"at:"!KEY_BACKUP_TIME!nrfutilkeysgenerate!PRIVATE_KEY_NAME!echo"creat"!PUBLIC_KEY_NAME!"at:"!KEY_BACKUP_TIME!nrfutilkeysdisplay--keypk--formatcode!PRIVATE_KEY_NAME!--out_file!PUBLIC_KEY_NAME!)elseif"!choice!"=="022"(echo"复制!PUBLIC_KEY_NAME!到路径!PUBLIC_KEY_PATH!!PUBLIC_KEY_NAME!"copy!PUBLIC_KEY_NAME!!PUBLIC_KEY_PATH!!PUBLIC_KEY_NAME!)elseif"!choice!"=="031"(echo"buildblebootloaderproject"echo"Initbuildingbootloaderproject..."echo.&gt;bootloader_build_log.txtUV4-j0-r!PROJECT_PATH_BOOTLOADER_BLE!-o"!cd!\bootloader_build_log.txt"typebootloader_build_log.txtecho"bootloaderbuildcompleted.")elseif"!choice!"=="032"(echo"buildapplicationproject"echo"Initbuildingapplicationproject..."echo.&gt;application_build_log.txtUV4-j0-r!PROJECT_PATH_APPLICATION!-o"!cd!\application_build_log.txt"UV4-j0-rD:\nRF5SDK\nRF5_SDK_17.1.0_ddde560_dfu\examples\ble_peripheral\ble_app_buttonless_dfu\pca10056\s140\arm5_no_packs\ble_app_buttonless_dfu_pca10056_s140.uvprojx-o"!cd!\application_build_log.txt"typeapplication_build_log.txtecho"applicationbuildcompleted.")elseif"!choice!"=="033"(echo"copysoftdeviceble_bootloaderandapplicationhex"copy!HEX_PATH_SD!!HEX_NAME_SD!copy!HEX_PATH_BL_BLE!!HEX_NAME_BL_BLE!copy!HEX_PATH_APP!!HEX_NAME_APP!)elseif"!choice!"=="034"(echo"mergedhex"nrfutilsettingsgenerate--family!ST_IC_FAMILY!--application!HEX_NAME_APP!--application-version!HEX_VERSION_APP!--bootloader-version!HEX_VERSION_BL!--bl-settings-version!HEX_VERSION_ST!!HEX_NAME_ST!mergehex-m!HEX_NAME_SD!!HEX_NAME_APP!-o!HEX_NAME_SD_APP!mergehex-m!HEX_NAME_SD_APP!!HEX_NAME_BL_BLE!-o!HEX_NAME_SD_APP_BL_BLE!mergehex-m!HEX_NAME_SD_APP_BL_BLE!!HEX_NAME_ST!-o!HEX_NAME_MERGED_BLE!REMdel!HEX_NAME_ST!del!HEX_NAME_SD_APP!del!HEX_NAME_SD_APP_BL_BLE!echo"packaged"nrfutilpkggenerate--key-file!PRIVATE_KEY_NAME!--hw-version!PKG_HW_FAMILY!--sd-req!PKG_VERSION_SD_REQ!--bootloader!HEX_NAME_BL_BLE!--bootloader-version!HEX_VERSION_BL!!PKG_NAME_BL_BLE!nrfutilpkggenerate--key-file!PRIVATE_KEY_NAME!--hw-version!PKG_HW_FAMILY!--sd-req!PKG_VERSION_SD_REQ!--softdevice!HEX_NAME_SD!--sd-id!PKG_VERSION_SD_ID!!PKG_NAME_SOFTDEVICE!nrfutilpkggenerate--key-file!PRIVATE_KEY_NAME!--hw-version!PKG_HW_FAMILY!--sd-req!PKG_VERSION_SD_REQ!--application!HEX_NAME_APP!--application-version!HEX_VERSION_APP!!PKG_NAME_APP!nrfutilpkggenerate--key-file!PRIVATE_KEY_NAME!--hw-version!PKG_HW_FAMILY!--sd-req!PKG_VERSION_SD_REQ!--bootloader!HEX_NAME_BL_BLE!--bootloader-version!HEX_VERSION_BL!--softdevice!HEX_NAME_SD!--sd-id!PKG_VERSION_SD_ID!!PKG_NAME_BL_BLE_SD!nrfutilpkggenerate--key-file!PRIVATE_KEY_NAME!--hw-version!PKG_HW_FAMILY!--sd-req!PKG_VERSION_SD_REQ!--bootloader!HEX_NAME_BL_BLE!--bootloader-version!HEX_VERSION_BL!--softdevice!HEX_NAME_SD!--sd-id!PKG_VERSION_SD_ID!--application!HEX_NAME_APP!--application-version!HEX_VERSION_APP!!PKG_NAME_BL_BLE_SD_APP!nrfutilpkggenerate--key-file!PRIVATE_KEY_NAME!--hw-version!PKG_HW_FAMILY!--sd-req!PKG_VERSION_SD_REQ!--softdevice!HEX_NAME_SD!--sd-id!PKG_VERSION_SD_ID!--application!HEX_NAME_APP!--application-version!HEX_VERSION_APP!!PKG_NAME_SD_APP!)elseif"!choice!"=="035"(python"!TOOL_PATH_ZIP_TO_BIN!"!PKG_NAME_BL_BLE!!BIN_NAME_BL_BLE!python"!TOOL_PATH_ZIP_TO_BIN!"!PKG_NAME_SOFTDEVICE!!BIN_NAME_SOFTDEVICE!python"!TOOL_PATH_ZIP_TO_BIN!"!PKG_NAME_APP!!BIN_NAME_APP!python"!TOOL_PATH_ZIP_TO_BIN!"!PKG_NAME_BL_BLE_SD!!BIN_NAME_BL_BLE_SD!)elseif"!choice!"=="036"(nrfjprog--family!PRO_IC_FAMILY!--recover!USER_JLINK_SNR!nrfjprog--family!PRO_IC_FAMILY!--eraseall!USER_JLINK_SNR!nrfjprog--family!PRO_IC_FAMILY!--program!HEX_NAME_MERGED_BLE!--sectorerase--verify--reset!USER_JLINK_SNR!)elseif"!choice!"=="037"(echo"DFU*.pkgfrombleandfindbyname"ifnot"!BLE_DONGLE_JLINK_SNR!"==""(nrfjprog--family!PRO_IC_FAMILY!--recover!DONGLE_PROG_JLINK_SNR!)nrfutildfuble-ic!PRO_IC_FAMILY!-pkg!PKG_NAME_APP!-p!BLE_DONGLE_COM_PORT!-n!IC_NAME!-f-cd3!DONGLE_DFU_JLINK_SNR!)elseif"!choice!"=="038"(echo"DFU*.pkgfrombleandfindbymac"ifnot"!BLE_DONGLE_JLINK_SNR!"==""(nrfjprog--family!PRO_IC_FAMILY!--recover!DONGLE_PROG_JLINK_SNR!)nrfutildfuble-ic!PRO_IC_FAMILY!-pkg!PKG_NAME_APP!-p!BLE_DONGLE_COM_PORT!-a!IC_MAC!-f-cd3!DONGLE_DFU_JLINK_SNR!)elseif"!choice!"=="041"(echo"builduartbootloaderproject"echo"Initbuildingbootloaderproject..."echo.&gt;bootloader_build_log.txtUV4-j0-r!PROJECT_PATH_BOOTLOADER_UART!-o"!cd!\bootloader_build_log.txt"typebootloader_build_log.txtecho"bootloaderbuildcompleted.")elseif"!choice!"=="042"(echo"buildapplicationproject"echo"Initbuildingapplicationproject..."echo.&gt;application_build_log.txtUV4-j0-r!PROJECT_PATH_APPLICATION!-o"!cd!\application_build_log.txt"typeapplication_build_log.txtecho"applicationbuildcompleted.")elseif"!choice!"=="043"(echo"copysoftdeviceuart_bootloaderandapplicationhex"copy!HEX_PATH_SD!!HEX_NAME_SD!copy!HEX_PATH_BL_UART!!HEX_NAME_BL_UART!copy!HEX_PATH_APP!!HEX_NAME_APP!)elseif"!choice!"=="044"(echo"mergedhex"nrfutilsettingsgenerate--family!ST_IC_FAMILY!--application!HEX_NAME_APP!--application-version!HEX_VERSION_APP!--bootloader-version!HEX_VERSION_BL!--bl-settings-version!HEX_VERSION_ST!!HEX_NAME_ST!mergehex-m!HEX_NAME_SD!!HEX_NAME_APP!-o!HEX_NAME_SD_APP!mergehex-m!HEX_NAME_SD_APP!!HEX_NAME_BL_UART!-o!HEX_NAME_SD_APP_BL_UART!mergehex-m!HEX_NAME_SD_APP_BL_UART!!HEX_NAME_ST!-o!HEX_NAME_MERGED_UART!REMdel!HEX_NAME_ST!del!HEX_NAME_SD_APP!del!HEX_NAME_SD_APP_BL_UART!echo"packaged"nrfutilpkggenerate--key-file!PRIVATE_KEY_NAME!--hw-version!PKG_HW_FAMILY!--sd-req!PKG_VERSION_SD_REQ!--bootloader!HEX_NAME_BL_UART!--bootloader-version!HEX_VERSION_BL!!PKG_NAME_BL_UART!nrfutilpkggenerate--key-file!PRIVATE_KEY_NAME!--hw-version!PKG_HW_FAMILY!--sd-req!PKG_VERSION_SD_REQ!--softdevice!HEX_NAME_SD!--sd-id!PKG_VERSION_SD_ID!!PKG_NAME_SOFTDEVICE!nrfutilpkggenerate--key-file!PRIVATE_KEY_NAME!--hw-version!PKG_HW_FAMILY!--sd-req!PKG_VERSION_SD_REQ!--application!HEX_NAME_APP!--application-version!HEX_VERSION_APP!!PKG_NAME_APP!nrfutilpkggenerate--key-file!PRIVATE_KEY_NAME!--hw-version!PKG_HW_FAMILY!--sd-req!PKG_VERSION_SD_REQ!--bootloader!HEX_NAME_BL_UART!--bootloader-version!HEX_VERSION_BL!--softdevice!HEX_NAME_SD!--sd-id!PKG_VERSION_SD_ID!!PKG_NAME_BL_UART_SD!nrfutilpkggenerate--key-file!PRIVATE_KEY_NAME!--hw-version!PKG_HW_FAMILY!--sd-req!PKG_VERSION_SD_REQ!--bootloader!HEX_NAME_BL_UART!--bootloader-version!HEX_VERSION_BL!--softdevice!HEX_NAME_SD!--sd-id!PKG_VERSION_SD_ID!--application!HEX_NAME_APP!--application-version!HEX_VERSION_APP!!PKG_NAME_BL_UART_SD_APP!nrfutilpkggenerate--key-file!PRIVATE_KEY_NAME!--hw-version!PKG_HW_FAMILY!--sd-req!PKG_VERSION_SD_REQ!--softdevice!HEX_NAME_SD!--sd-id!PKG_VERSION_SD_ID!--application!HEX_NAME_APP!--application-version!HEX_VERSION_APP!!PKG_NAME_SD_APP!)elseif"!choice!"=="045"(python"!TOOL_PATH_ZIP_TO_BIN!"!PKG_NAME_BL_BLE!!BIN_NAME_BL_BLE!python"!TOOL_PATH_ZIP_TO_BIN!"!PKG_NAME_SOFTDEVICE!!BIN_NAME_SOFTDEVICE!python"!TOOL_PATH_ZIP_TO_BIN!"!PKG_NAME_APP!!BIN_NAME_APP!python"!TOOL_PATH_ZIP_TO_BIN!"!PKG_NAME_BL_BLE_SD!!BIN_NAME_BL_BLE_SD!)elseif"!choice!"=="046"(nrfjprog--family!PRO_IC_FAMILY!--recover!USER_JLINK_SNR!nrfjprog--family!PRO_IC_FAMILY!--eraseall!USER_JLINK_SNR!nrfjprog--family!PRO_IC_FAMILY!--program!HEX_NAME_MERGED_UART!--sectorerase--verify--reset!USER_JLINK_SNR!)elseif"!choice!"=="047"(echo"DFU*.pkgfromuartwithNRF_BL_DFU_ENTER_METHOD_GPREGRET=1"SET"BOOTLOADER_DFU_START_MASK=0xF9"SET"BOOTLOADER_DFU_START=0xB1"SET"NRF_POWER_GPREGRET=0x4000051C"nrfjprog--family!PRO_IC_FAMILY!--memwr!NRF_POWER_GPREGRET!--val!BOOTLOADER_DFU_START!!USER_JLINK_SNR!nrfjprog--family!PRO_IC_FAMILY!--memrd!NRF_POWER_GPREGRET!--w32--n4!USER_JLINK_SNR!nrfjprog--family!PRO_IC_FAMILY!--debugreset!USER_JLINK_SNR!nrfutildfuserial-pkg!PKG_NAME_APP!-p!UART_COM_PORT!-b!UART_COM_BAUD!-fc0)elseif"!choice!"=="048"(echo"DFU*.pkgfromuartwith配置NRF_BL_DFU_ENTER_METHOD_PINRESET=1"nrfjprog--pinreset!USER_JLINK_SNR!nrfutildfuserial-pkg!PKG_NAME_APP!-p!UART_COM_PORT!-b!UART_COM_BAUD!-fc0)elseif"!choice!"=="049"(echo"DFU*.pkgfromuartwith配置NRF_BL_DFU_ENTER_METHOD_BUTTON=1"nrfjprog--family!PRO_IC_FAMILY!--debugreset!USER_JLINK_SNR!nrfutildfuserial-pkg!PKG_NAME_APP!-p!UART_COM_PORT!-b!UART_COM_BAUD!-fc0)REM根据芯片型号判断下述代码是否需要执行if"!USB_MATCH!"=="TRUE"(if"!choice!"=="051"(echo"buildusbbootloaderproject"echo"Initbuildingbootloaderproject..."echo.&gt;bootloader_build_log.txtUV4-j0-r!PROJECT_PATH_BOOTLOADER_USB!-o"!cd!\bootloader_build_log.txt"typebootloader_build_log.txtecho"bootloaderbuildcompleted.")elseif"!choice!"=="052"(echo"buildapplicationproject"echo"Initbuildingapplicationproject..."echo.&gt;application_build_log.txtUV4-j0-r!PROJECT_PATH_APPLICATION!-o"!cd!\application_build_log.txt"typeapplication_build_log.txtecho"applicationbuildcompleted.")elseif"!choice!"=="053"(echo"copysoftdeviceusb_bootloaderandapplicationhex"copy!HEX_PATH_SD!!HEX_NAME_SD!copy!HEX_PATH_BL_USB!!HEX_NAME_BL_USB!copy!HEX_PATH_APP!!HEX_NAME_APP!)elseif"!choice!"=="054"(echo"mergedhex"nrfutilsettingsgenerate--family!ST_IC_FAMILY!--application!HEX_NAME_APP!--application-version!HEX_VERSION_APP!--bootloader-version!HEX_VERSION_BL!--bl-settings-version!HEX_VERSION_ST!!HEX_NAME_ST!mergehex-m!HEX_NAME_SD!!HEX_NAME_APP!-o!HEX_NAME_SD_APP!mergehex-m!HEX_NAME_SD_APP!!HEX_NAME_BL_USB!-o!HEX_NAME_SD_APP_BL_USB!mergehex-m!HEX_NAME_SD_APP_BL_USB!!HEX_NAME_ST!-o!HEX_NAME_MERGED_USB!REMdel!HEX_NAME_ST!del!HEX_NAME_SD_APP!del!HEX_NAME_SD_APP_BL_USB!echo"packaged"nrfutilpkggenerate--key-file!PRIVATE_KEY_NAME!--hw-version!PKG_HW_FAMILY!--sd-req!PKG_VERSION_SD_REQ!--bootloader!HEX_NAME_BL_USB!--bootloader-version!HEX_VERSION_BL!!PKG_NAME_BL_USB!nrfutilpkggenerate--key-file!PRIVATE_KEY_NAME!--hw-version!PKG_HW_FAMILY!--sd-req!PKG_VERSION_SD_REQ!--softdevice!HEX_NAME_SD!--sd-id!PKG_VERSION_SD_ID!!PKG_NAME_SOFTDEVICE!nrfutilpkggenerate--key-file!PRIVATE_KEY_NAME!--hw-version!PKG_HW_FAMILY!--sd-req!PKG_VERSION_SD_REQ!--application!HEX_NAME_APP!--application-version!HEX_VERSION_APP!!PKG_NAME_APP!nrfutilpkggenerate--key-file!PRIVATE_KEY_NAME!--hw-version!PKG_HW_FAMILY!--sd-req!PKG_VERSION_SD_REQ!--bootloader!HEX_NAME_BL_USB!--bootloader-version!HEX_VERSION_BL!--softdevice!HEX_NAME_SD!--sd-id!PKG_VERSION_SD_ID!!PKG_NAME_BL_USB_SD!nrfutilpkggenerate--key-file!PRIVATE_KEY_NAME!--hw-version!PKG_HW_FAMILY!--sd-req!PKG_VERSION_SD_REQ!--bootloader!HEX_NAME_BL_USB!--bootloader-version!HEX_VERSION_BL!--softdevice!HEX_NAME_SD!--sd-id!PKG_VERSION_SD_ID!--application!HEX_NAME_APP!--application-version!HEX_VERSION_APP!!PKG_NAME_BL_USB_SD_APP!nrfutilpkggenerate--key-file!PRIVATE_KEY_NAME!--hw-version!PKG_HW_FAMILY!--sd-req!PKG_VERSION_SD_REQ!--softdevice!HEX_NAME_SD!--sd-id!PKG_VERSION_SD_ID!--application!HEX_NAME_APP!--application-version!HEX_VERSION_APP!!PKG_NAME_SD_APP!)elseif"!choice!"=="055"(python"!TOOL_PATH_ZIP_TO_BIN!"!PKG_NAME_BL_BLE!!BIN_NAME_BL_BLE!python"!TOOL_PATH_ZIP_TO_BIN!"!PKG_NAME_SOFTDEVICE!!BIN_NAME_SOFTDEVICE!python"!TOOL_PATH_ZIP_TO_BIN!"!PKG_NAME_APP!!BIN_NAME_APP!python"!TOOL_PATH_ZIP_TO_BIN!"!PKG_NAME_BL_BLE_SD!!BIN_NAME_BL_BLE_SD!)elseif"!choice!"=="056"(nrfjprog--family!PRO_IC_FAMILY!--recover!USER_JLINK_SNR!nrfjprog--family!PRO_IC_FAMILY!--eraseall!USER_JLINK_SNR!nrfjprog--family!PRO_IC_FAMILY!--program!HEX_NAME_MERGED_USB!--sectorerase--verify--reset!USER_JLINK_SNR!)elseif"!choice!"=="057"(echo"DFU*.pkgfromusbwithNRF_BL_DFU_ENTER_METHOD_GPREGRET=1"SET"BOOTLOADER_DFU_START_MASK=0xF9"SET"BOOTLOADER_DFU_START=0xB1"SET"NRF_POWER_GPREGRET=0x4000051C"nrfjprog--family!PRO_IC_FAMILY!--memwr!NRF_POWER_GPREGRET!--val!BOOTLOADER_DFU_START!!USER_JLINK_SNR!nrfjprog--family!PRO_IC_FAMILY!--memrd!NRF_POWER_GPREGRET!--w32--n4!USER_JLINK_SNR!nrfjprog--family!PRO_IC_FAMILY!--debugreset!USER_JLINK_SNR!nrfutildfuusb-serial-pkg!PKG_NAME_APP!-p!USB_COM_PORT!-b!USB_COM_BAUD!-fc0)elseif"!choice!"=="058"(echo"DFU*.pkgfromusbwith配置NRF_BL_DFU_ENTER_METHOD_PINRESET=1"nrfjprog--family!PRO_IC_FAMILY!--pinreset!USER_JLINK_SNR!nrfutildfuusb-serial-pkg!PKG_NAME_APP!-p!USB_COM_PORT!-b!UART_COM_BAUD!-fc0)elseif"!choice!"=="059"(echo"DFU*.pkgfromusbwith1或者NRF_BL_DFU_ENTER_METHOD_BUTTON=1P0.25/P0.16"nrfjprog--family!PRO_IC_FAMILY!--debugreset!USER_JLINK_SNR!nrfutildfuusb-serial-pkg!PKG_NAME_APP!-p!USB_COM_PORT!-b!UART_COM_BAUD!-fc0))if"!choice!"=="rcv"(nrfjprog--recover!USER_JLINK_SNR!)elseif"!choice!"=="rst"(nrfjprog--debugreset!USER_JLINK_SNR!)elseif"!choice!"=="e"(exit)pausegotoprompt@endlocal</li>
  <li>nrfjprog命令使用指南用法-q–quiet减少标准输出信息。必须与其他命令组合使用。-h–help显示此帮助信息。-v–version显示nrfjprog和dll的版本信息。--force跳过所有问题继续执行。脚本中建议使用此标志。--log[&lt;path&gt;]启用日志记录。默认输出文件为"log.log"。设置&lt;path&gt;选项以修改日志文件的位置和/或名称。如果&lt;path&gt;的父文件夹尚不存在，nrfjprog将尝试创建它。日志输出总是附加到文件中。必须与其他命令组合使用。--jdll&lt;file&gt;使用指定路径中的SeggerJLinkARMdll，而不是搜索SeggerJLinkARMdll的最新版本。必须与其他命令组合使用。限制：不支持Unicode路径。--config&lt;file&gt;使用指定路径中的nrfjprog设置文件，而不是搜索安装文件夹中的默认config.toml文件。TOML配置文件可以包含QSPI和nrfjprog目标设置。必须与其他命令组合使用。--storeconfig&lt;file&gt;将从--config/--ini/--qspiini和命令行加载的nrfjprog设置以toml格式存储到&lt;file&gt;中。此选项可用于将旧的.ini文件转换为.toml文件，例如。--ini&lt;file&gt;已弃用：请使用--config选项中的TOML文件。使用指定的ini文件路径中的nrfjprog设置文件，而不是搜索安装文件夹中的默认config.toml文件。必须与其他命令组合使用。--qspiini&lt;file&gt;已弃用：请使用--config选项中的TOML文件。使用指定路径中的QSPI设置文件，而不是搜索安装文件夹中的默认config.toml文件。必须与--erasepage,--memrd,--memwr,--program,--verify,--readqspi或--qspieraseall命令中的一个组合使用。限制：对于nRF51设备，此操作不可用。对于nRF52设备，没有QSPI外设的设备此操作不可用。对于nRF91设备，此操作不可用。--qspicustominit已弃用，此操作无效。-i–ids显示所有连接到PC的调试器的序列号。--expand扩展--ids打印的信息。这对于查看网络连接的调试探头的附加信息很有用。--com显示与所有连接的调试器关联的串行端口列表。如果与--snr组合使用，将显示与该调试器关联的所有串行端口。--deviceversion显示连接设备的类型。如果与--snr组合使用，将显示与该调试器关联的设备。如果未与--snr组合使用，将显示与所有连接的调试器关联的设备。-f–family选择设备系列进行操作。有效的参数选项为NRF51,NRF52,NRF53,NRF91和UNKNOWN。如果指定UNKNOWN系列，将自动检测设备系列。请注意，提供实际系列比执行自动系列检测要快。如果未指定–family选项，则默认为nrfjprog.ini中的默认值。必须与其他命令组合使用。-s–snr&lt;serial_number&gt;选择具有指定序列号的调试器进行操作。必须与其他命令组合使用。--ip[&lt;hostname&gt;|&lt;ip&gt;|&lt;tunnel&gt;]提供目标调试器的网络连接字符串。该字符串可以是IPv4地址或主机名。可以使用--port选项指定连接的端口。传递--ip而没有任何参数等同于传递--ifaceip。可以连接到处于隧道模式的调试器。不支持缩短的隧道连接字符串格式。隧道模式连接字符串的示例是："tunnel:123456789:pwd:jlink-europe.segger.com"。有关JLink连接类型的更多信息，请访问"https://wiki.segger.com/J-Link_Remote_Server"。必须与其他命令组合使用。--port&lt;port&gt;选择建立网络连接时使用的端口。必须与--ip选项一起使用。默认端口是19020。-c–clockspeed设置调试器SWD时钟速度，单位为kHz。有效的时钟速度参数范围从4kHz到50000kHz。如果指定的时钟速度超出了仿真器支持的最大速度，则使用最大速度。如果未指定–clockspeed选项，则默认为nrfjprog.ini中的默认值。必须与其他命令组合使用。--iface&lt;USB|IP&gt;[USB|IP]设置搜索和连接调试器时使用的接口。USB和IP可以同时列出。默认情况下，只有USB连接的调试器会被目标，除非存在--ip选项。此选项主要用于与--snr和--ids组合使用。必须与其他命令组合使用。--recover擦除所有用户可用的非易失性内存，并禁用启用的读取保护机制。--rbp&lt;level&gt;启用读取保护机制。有效的参数选项为CR0和ALL。限制：对于nRF52设备，CR0参数选项无效。副作用：执行--rbp操作后，可用的操作会减少。对于nRF51设备，如果使用ALL参数选项，--pinreset将无法在某些旧设备上工作。对于nRF52设备，只有--pinreset,--debugreset或--recover操作在执行--rbp后可用。--pinresetenable启用通过使用UICRPSELRESET寄存器进行引脚复位。限制：对于nRF51设备，命令不可用。对于nRF53设备，命令不可用。对于nRF91设备，命令不可用。-p–pinreset执行引脚复位。操作后核心将运行。可以与–program操作结合使用。如果与–program操作结合使用，复位将在闪存操作后发生，以开始执行。--hardreset执行硬复位。操作后核心将运行。可以与--program操作结合使用。如果与--program操作结合使用，复位将在闪存操作后发生，以开始执行。限制：对于nRF51设备，命令不可用。对于nRF53设备，命令不可用。对于nRF91设备，命令不可用。-r–reset通过设置核心的AIRCR寄存器的SysResetReq位来执行软复位。操作后核心将运行。可以与–program操作结合使用。如果与–program操作结合使用，复位将在闪存操作后发生，以开始执行。-d–debugreset通过使用CTRL-AP执行软复位。操作后核心将运行。可以与–program操作结合使用。如果与–program操作结合使用，调试复位将在闪存操作后发生，以开始执行。限制：对于nRF51设备，–debugreset操作不可用。对于nRF52设备，–debugreset操作在nRF52832_xxAA_ENGA设备上不可用。-e–eraseall擦除所有用户可用的程序闪存和UICR页。可以与–qspieraseall操作结合使用。限制：对于nRF51设备，如果设备来自Nordic并预编程了SoftDevice，则仅擦除用户可用的代码闪存和UICR。--qspieraseall擦除所有外部存储器设备的闪存，借助QSPI外设。请注意，根据外部存储器设备的擦除速度，此操作可能需要几分钟。可以与--eraseall操作结合使用。限制：对于nRF51设备，此操作不可用。对于nRF52设备，没有QSPI外设的设备此操作不可用。对于nRF52设备，此操作仅适用于连接了外部存储器设备的设备。要确定是否连接了外部存储器设备，nrfjprog会检查QspiDefault.ini文件中的MemSize参数或与--qspiini选项一起提供的QSPI配置ini文件。对于nRF91设备，此操作不可用。--eraseuicr擦除UICR页。限制：对于nRF51设备，此操作仅在设备来自Nordic并预编程了SoftDevice时可用。对于nRF91设备，此操作不可用，请使用--eraseall。--erasepage&lt;start[-end]&gt;擦除从包含起始地址的闪存页开始，到包含结束地址的页（不包括在擦除范围内）结束的所有闪存页。限制：起始地址必须是4kB页的开始地址（例如，0x1000、0x2000、0x3000等）。如果结束地址省略，擦除操作将在起始地址处擦除一页。可以与--program操作结合使用。注意：与--erasepage一起使用的地址必须是设备的有效地址。对于nRF51设备，最大值是0xFFFFF000。对于nRF52设备，最大值是0xFFFFFFFF。对于nRF53设备，最大值是0x7FFFFFFF。-m–memrd从指定地址读取指定长度的内存区域并将其写入文件。对于地址和长度，指定的值应为十六进制。限制：对于nRF51设备和nRF53设备，地址必须在0x10000000到0x20000000之间。对于nRF52设备，地址和长度必须在设备的闪存范围内。-n–memwr从指定文件写入指定长度的内存区域。对于地址和长度，指定的值应为十六进制。限制：对于nRF51设备和nRF53设备，地址必须在0x10000000到0x20000000之间。对于nRF52设备，地址和长度必须在设备的闪存范围内。--program&lt;file&gt;将指定的二进制文件编程到设备的闪存中。如果指定的文件包含多个二进制文件，nrfjprog将自动将文件分为多个段并将它们分别编程到设备的闪存中。限制：nRF51设备仅支持将单个二进制文件编程到设备的闪存中。对于nRF52设备，如果指定的二进制文件的大小大于设备的闪存大小，程序将失败。如果指定的文件包含多个二进制文件，nrfjprog将自动将文件分为多个段并将它们分别编程到设备的闪存中。--verify&lt;file&gt;验证指定的二进制文件是否正确编程到设备的闪存中。验证成功时不会报告任何消息。限制：对于nRF51设备和nRF53设备，文件必须是二进制格式的文件。对于nRF52设备，文件必须是二进制格式的文件。--readqspi&lt;file&gt;将外部QSPI存储器中的数据读取到指定的文件中。限制：对于nRF51设备，此操作不可用。对于nRF52设备，没有QSPI外设的设备此操作不可用。对于nRF91设备，此操作不可用。--qspieepromrd&lt;file&gt;读取QSPIEEPROM的数据并将其写入指定的文件中。限制：对于nRF51设备，此操作不可用。对于nRF52设备，没有QSPI外设的设备此操作不可用。对于nRF91设备，此操作不可用。--qspieepromwr&lt;file&gt;将数据从指定的文件写入QSPIEEPROM。限制：对于nRF51设备，此操作不可用。对于nRF52设备，没有QSPI外设的设备此操作不可用。对于nRF91设备，此操作不可用。-a–aeroprobe&lt;probe_name&gt;在使用Aeroprobe调试探头时，可以使用该选项指定探头名称。限制：必须在–recover操作之前使用此选项。--discover自动发现设备。如果无法识别设备或多个设备被识别，可以使用--family选项来指定设备系列。限制：对于nRF51设备，必须与--recover操作结合使用。--copy&lt;src&gt;&lt;dst&gt;将文件从源路径复制到目标路径。限制：源路径必须为现有路径，目标路径必须为新路径。--disconnect断开与目标设备的连接。如果在连接之前没有执行任何操作，将不会报告错误。--snapshots创建设备状态快照。创建快照后，可以使用--restore命令将设备状态恢复到快照时的状态。-u–upload将设备的状态上传到服务器。如果指定的服务器路径无效，上传操作将失败。-o–output将命令输出保存到指定的文件中。必须与其他命令组合使用。</li>
  <li>一：nRF52常用指令芯片恢复出厂设置：nrfjprog–recover擦除整个芯片：nrfjprog–eraseall芯片复位：nrfjprog–reset烧录程序校验并复位：nrfjprog–programMERGED.hex–sectorerase–verify-r二：nRF9160常用指令烧录modem固件：nrfjprog–verify–programmfw_nrf9160_1.3.6.zip烧录app程序：nrfjprog–programapp.hex–sectorerase–verify-r三：nRF5340常用指令复位网络核指令：nrfjprog-fNRF53–coprocessorCP_NETWORK–recover擦除网络核程序指令：nrfjprog-fNRF53–coprocessorCP_NETWORK–eraseall烧录核程序指令：nrfjprog-fNRF53–coprocessorCP_NETWORK–programnet.hex–verify复位应用核指令：nrfjprog-fNRF53–recover擦除应用核程序指令：nrfjprog-fNRF53–eraseall烧录应用核程序指令：nrfjprog-fNRF53–programapp.hex–verify三：nRF54L15常用指令使用nrfjprog下载程序：nrfjprog--familynRF54L--recovernrfjprog--familynRF54L--program“zephyr.hex”--sectorerase--verify--reset使用nrfutil下载程序：nrfutildevicerecovernrfutildeviceprogram--firmwarezephyr.hex--traitsjlink--optionsreset=RESET_DEBUG,verify=VERIFY_READ,chip_erase_mode=ERASE_RANGES_TOUCHED_BY_FIRMWARE四：合并文件相关指令将文件A.hex和文件B.hex和合并成一个名称为MERGED.hex的文件：mergehex.exe-mA.hexB.hex-oMERGED.hex五：nrfutil相关指令nRF52840生成appdfu升级包生成dfu私钥：nrfutilkeysgenerateprivate.pem根据dfu私钥生成dfu公钥：nrfutilkeysdisplay–keypk–formatcodeprivate.pem–out_filedfu_public_key.cdfu生成settings文件：nrfutilsettingsgenerate–familyNRF52840–applicationAPP.hex–application-version3–bootloader-version2–bl-settings-version2ST.hexdfu生成升级包：nrfutilpkggenerate–key-fileprivate.pem–hw-version52–sd-req0x0100–applicationAPP.hex–application-version0xFFAPP.zip通过BLEdfu升级，通过mac识别设备：nrfutildfuble-icnRF52840-pkgAPP.zip-pCOM6-aD3:F1:96:04:74:0A-f通过BLEdfu升级，通过蓝牙名称识别设备：nrfutildfuble-icnRF52840-pkgAPP.hex-pCOM6-nNordic_UART-f通过串口dfu升级：nrfutildfuserial-pkgAPP.zip-pCOM8-b115200通过USBdfu升级：nrfutildfuusb-serial-pkgAPP.hex-pCOM7-b115200六：帮助文件nrfutilUsage:需要下载nrfutil.exe并添加到环境变量nrfutil.exe[OPTIONS]COMMAND[ARGS]...Options:-v,--verboseIncreaseverbosityofoutput.Canbespecifiedmorethanonce(upto-v-v-v-v).[x&gt;=0]-o,--output&lt;filename&gt;Logoutputtofile--helpShowthismessageandexit.Commands:dfuPerformaDeviceFirmwareUpdateoverserial,BLE,Thread,ZigbeeorANTtransportgivenaDFUpackage(zipfile).keysGenerateanddisplayprivateandpublickeys.pkgDisplayorgenerateaDFUpackage(zipfile).settingsGenerateanddisplayBootloaderDFUsettings.versionDisplaynrfutilversion.zigbeeZigbee-relatedcommandsandutilities.nrfjprogUsage:需要安装nrf-command-line-tools--------------------------------------------------------------------------------q--quietReducesthestdoutinfo.Mustbecombinedwithanothercommand.-h--helpDisplaysthishelp.-v--versionDisplaysthenrfjproganddllversions.--forceBypassallquestionstocontinue.Recommendedtousethisflagwhenscripting.--log[&lt;path&gt;]Enablelogging.Defaultoutputfileis"log.log".Setthe&lt;path&gt;optiontomodifylogfilelocationand/orname.Iftheparentfolderof&lt;path&gt;doesnotyetexist,nrfjprogwillattempttocreateit.Loggeroutputisalwaysappendedtothefile.Mustbecombinedwithanothercommand.--jdll&lt;file&gt;UsestheSegger'sJLinkARMdllspecifiedinthegivenfilepathinsteadofsearchingforthelatestversionofSegger'sJLinkARMdll.Mustbecombinedwithanothercommand.Limitations:Unicodepathsarenotsupported--config&lt;file&gt;Usesthenrfjprogsettingsfilespecifiedinthegivenfilepathinsteadofsearchingforthedefaultconfig.tomlfileintheinstallationfolder.TOMLconfigurationfilesmaycontainbothQSPIandnrfjprogtargetsettings.Mustbecombinedwithanothercommand.--storeconfig&lt;file&gt;Storesthenrfjprogsettingsloadedfrom--config/--ini/--qspiiniandcommandlineto&lt;file&gt;intomlformatting.Thisoptioncanbeusedtotranslateold.inifilesto.tomlfilesforexample.--ini&lt;file&gt;Deprecated:UseaTOMLfilewith--configinstead.Usesthenrfjprogsettingsfilespecifiedinthegiveninifilepathinsteadofsearchingforthedefaultconfig.tomlfileintheinstallationfolder.Mustbecombinedwithanothercommand.--qspiini&lt;file&gt;Deprecated:UseaTOMLfilewith--configinstead.UsestheQSPIsettingsfilespecifiedinthegivenfileinipathinsteadofsearchingforthedefaultconfig.tomlfileintheinstallationfolder.Mustbecombinedwitheither--erasepage,--memrd,--memwr,--program,--verify,--readqspior--qspieraseallcommands.Limitations:FornRF51devices,theoperationisnotavailable.FornRF52devices,theoperationisnotavailablefordeviceswithoutaQSPIperipheral.FornRF91devices,theoperationisnotavailable--qspicustominitDeprecated,thisoperationdoesnothing.-i--idsDisplaystheserialnumbersofallthedebuggersconnectedtothePC.--expandExpandstheinformationprintedby--ids.Thisis.usefulforseeingadditioninformationonnetworkconnecteddebugprobes.--comDisplaysalistoftheserialportassociatedwithallconnecteddebuggers.Ifcombinedwith--snr,itwilldisplayallcomportsassociatedwiththisdebugger--deviceversionDisplaysthetypeofdevicesconnected.Ifcombinedwith--snr,itwilldisplaythedeviceassociatedwiththisdebugger.Ifnotcombinedwith--snr,itwilldisplaythedeviceassociatedwithallconnecteddebuggers.-f--family&lt;family&gt;Selectsthedevicefamilyfortheoperation.ValidargumentoptionsareNRF51,NRF52,NRF53,NRF91,andUNKNOWN.IfUNKNOWNfamilyisgiven,anautomaticfamilydetectionofthedeviceisperformed.Notethatprovidingtheactualfamilyisfasterthanperformingtheautomaticfamilydetection.If--familyoptionisnotgiven,thedefaultistakenfromnrfjprog.ini.Mustbecombinedwithanothercommand.-s--snr&lt;serial_number&gt;SelectsthedebuggerwiththegivenserialnumberamongallthoseconnectedtothePCfortheoperation.Mustbecombinedwithanothercommand.--ip[&lt;hostname&gt;|&lt;ip&gt;|&lt;tunnel&gt;]Provideanetworkconnectionstringfortargetdebugger.ThisstringcanbeanIPv4addressorahostname.Theporttoconnecttocanbespecifiedwiththe--portoption.Passing--ipwithoutanyargumentsisequivalenttopassing--ifaceip.Itispossibletoconnecttoadebuggerrunningintunnelingmode.Shortenedtunnelconnectionstringformatisnotsupported.Anexampleofatunnelmodeconnectionstringis:"tunnel:123456789:pwd:jlink-europe.segger.com"ReadmoreaboutJLinkconnectiontypesat"https://wiki.segger.com/J-Link_Remote_Server".Mustbecombinedwithanothercommand.--port&lt;port&gt;Selectswhichporttousewhenestablishinganetworkconnectiontoadebugger.Mustbeusedtogetherwiththe--ipoption.Defaultportis19020.-c--clockspeed&lt;speed&gt;SetsthedebuggerSWDclockspeedinkHzresolutionfortheoperation.Thevalidclockspeedargumentsgofrom4kHzto50000kHz.Ifgivenclockspeedisabovethemaxiumumclockspeedsupportedbytheemulator,itsmaximumwillbeusedinstead.If--clockspeedoptionisnotgiven,thedefaultistakenfromnrfjprog.ini.Mustbecombinedwithanothercommand.--iface&lt;USB|IP&gt;[USB|IP]Setswhichinterfacestousewhensearchingforandconnectingtodebuggers.BothUSBandIPcanbelistedatthesametime.Bydefault,onlyUSBconnecteddebuggersaretargetedunlessthe--ipoptionispresent.Thisoptionismainlyintendedtobeusedtogetherwith--snrand--ids.Mustbecombinedwithanothercommand--recoverErasesalluseravailablenon-volatilememoryanddisablesthereadbackprotectionmechanismifenabled.--rbp&lt;level&gt;Enablesthereadbackprotectionmechanism.ValidargumentoptionsareCR0andALL.Limitations:FornRF52devices,theCR0argumentoptionisinvalid.Sideeffects:Afteran--rbpoperationisperformed,theavailableoperationsarereduced.FornRF51devices,andifargumentoptionALLisused,--pinresetwillnotworkoncertainolderdevices.FornRF52devices,only--pinreset,--debugresetor--recoveroperationsareavailableafter--rbp.--pinresetenableEnablesthepinresetbytheuseofUICRPSELRESETregisters.Limitations:FornRF51devices,thecommandisnotavailable.FornRF53devices,thecommandisnotavailable.FornRF91devices,thecommandisnotavailable.-p--pinresetPerformsapinreset.Corewillrunaftertheoperation.Canbecombinedwiththe--programoperation.Ifcombinedwiththe--programoperation,theresetwilloccuraftertheflashinghasoccurredtostartexecution.--hardresetPerformsahardreset.Corewillrunaftertheoperation.Canbecombinedwiththe--programoperation.Ifcombinedwiththe--programoperation,theresetwilloccuraftertheflashinghasoccurredtostartexecution.Limitations:FornRF51devices,thecommandisnotavailable.FornRF53devices,thecommandisnotavailable.FornRF91devices,thecommandisnotavailable.-r--resetPerformsasoftresetbysettingtheSysResetReqbitoftheAIRCRregisterofthecore.Thecorewillrunaftertheoperation.Canbecombinedwiththe--programoperation.Ifcombinedwiththe--programoperation,theresetwilloccuraftertheflashinghasoccurredtostartexecution.-d--debugresetPerformsasoftresetbytheuseoftheCTRL-AP.Thecorewillrunaftertheoperation.Canbecombinedwiththe--programoperation.Ifcombinedwiththe--programoperation,thedebugresetwilloccuraftertheflashinghasoccurredtostartexecution.Limitations:FornRF51devices,the--debugresetoperationisnotavailable.FornRF52devices,the--debugresetoperationisnotavailablefornRF52832_xxAA_ENGAdevices.-e--eraseallErasesalluseravailableprogramflashmemoryandtheUICRpage.Canbecombinedwiththe--qspierasealloperation.Limitations:FornRF51devices,ifthedevicecamefromNordicwithapre-programmedSoftDevice,onlytheuseravailablecodeflashandUICRwillbeerased.--qspieraseallErasesalltheflashoftheexternalmemorydevicewiththehelpoftheQSPIperipheral.Notethatdependingontheexternalmemorydevice'serasespeedtheoperationmighttakeminutes.Canbecombinedwiththe--erasealloperation.Limitations:FornRF51devices,theoperationisnotavailable.FornRF52devices,theoperationisnotavailablefordeviceswithoutaQSPIperipheral.FornRF52devices,theoperationisonlyavailablefordevicesconnectedtoanexternalmemorydevice.Todetermineifanexternalmemorydeviceisconnected,nrfjprogchecksMemSizeparameterfromtheQspiDefault.inifileortheQSPIconfigurationinifilethatisgivenwiththe--qspiinioption.FornRF91devices,theoperationisnotavailable--eraseuicrErasestheUICRpage.Limitations:FornRF51devices,theoperationisavailableonlyifthedevicecamefromNordicwithapre-programmedSoftDevice.FornRF91devices,theoperationisnotavailabletoeraseuicr,pleaseuse--eraseall--erasepage&lt;start[-end]&gt;Erasestheflashpagesstartingattheflashpagecontainingthestartaddressandendingatthepagecontainingtheendaddress(notincludedintheerase).Ifendaddressisnotgiven,onlyoneflashpagewillbeerased.IfyourdeviceisequippedwithaQSPIperipheral,thepagestoerasebelongtotheXIPregionofthedevice,andanexternalmemorydeviceispresent,thiscommanderases4kBpagesfromtheexternalmemorydevice.Thefirstaddressoftheregionisconsideredasaddress0oftheexternalmemorydevice.Todetermineifanexternalmemorydeviceispresent,nrfjprogcheckstheMemSizeparameterfromtheQspiDefault.inifileorfromtheQSPIconfigurationinifilegivenwiththe--qspiinioption.Limitations:FornRF51devices,thepagewillnotbeerasedifitbelongstoregion0.--program&lt;hex_file&gt;[--sectorerase|--chiperase|--sectoranduicrerase|--recover][--qspisectorerase|--qspichiperase]Programsthespecifiedimage_fileintothedevice.Supportedfileformatsare.hex,.ihex,.elf,.axf,and.bin.Avalidformatmustbespecifiedbythefilenameextension.Ifthetargetareatoprogramisnoterased,the--programoperationwillfailunlessaneraseoptionisgiven.Valideraseoperationsfortheinternalflashmemoryare--recover,--sectorerase,--sectoranduicreraseand--chiperase.If--chiperaseisgiven,alltheavailableusernon-volatilememory,includingUICR,willbeerasedbeforeprogramming.If--recoverisgiven,alltheavailableusernon-volatilememory,includingUICR,willbeerasedbeforeprogramming,evenifthedeviceisreadbackprotected.If--sectoreraseisgiven,onlythetargetednon-volatilememorypagesexcludingUICRwillbeerased.If--sectoranduicreraseisgiven,onlythetargetednon-volatilememorypagesincludingUICRwillbeerased.Notethatthe--sectoranduicreraseand--sectoreraseoperationsnormallytakesignificantlylongertimecomparedto--chiperaseoperationsousethemwithcaution.IfyourdeviceisequippedwithaQSPIperipheralandanexternalmemorydeviceispresent,datatargetingtheXIPregionwillbewrittentotheexternalmemorydevice.ThefirstaddressoftheXIPregionisconsideredasaddress0oftheexternalmemorydevice.Todetermineifanexternalmemorydeviceispresent,nrfjprogcheckstheMemSizeparamterfromQspiDefault.inifileorfromtheQSPIconfigurationinifilegivenwiththe--qspiinioption.Ifthetargetareatoprogramisnoterased,the--programoperationwillfailunlessaneraseoptionisgiven.Valideraseoperationsfortheexternalmemorydeviceare--qspichiperaseand--qspisectorerase.If--qspichiperaseisgiven,theexternalmemorydevicewillbeerased.Ifthe--qspisectoreraseisgiven,only4kBpagespagesfromthetargetedexternalmemorydevicewillbeerased.Notethat--qspichiperaseoperationmaytakeseveralminutes.The--programcommandcanbecombinedwiththe--verifyoperation.Itcanalsobecombinedwitheitherthe--reset,--debugreset,--hardresetandthe--pinresetoperations.Theresetwilloccuraftertheflashoperationinordertostarttheexecution.Limitations:For--hardresetlimitations,seetheusagetextfortherespectivecommand.FornRF51devices,the--sectoranduicreraseoperationisnotavailable.FornRF51devices,iftheimage_fileprovidedcontainssectorsbelongingtoregion0,the--programoperationwillfail.FornRF51devices,the--qspisectoreraseand--qspichiperaseoperationsarenotavailable.FornRF52devices,the--qspisectoreraseand--qspichiperaseoperationsarenotavailableunlessthedeviceisequippedwithaQSPIperipheralandanexternalmemoryisconnected.Todetermineifanexternalmemoryispresent,theMemSizeparameterfromQspiDefault.inifileorfromtheQSPIconfigurationinifilegivenwiththe--qspiinioptionisevaluated.FornRF91devices,the--qspisectoreraseand--qspichiperaseoperationsarenotavailable.--memwr&lt;addr&gt;--val&lt;val&gt;WritestotheprovidedaddressinmemorywiththehelpoftheNVMControlleror,ifyourdeviceisequippedwithaQSPIperipheralandtheaddresstowritebelongstotheXIPregion,withthehelpoftheQSPIperipheraltoanexternalmemorydevice.Todetermineifanexternalmemorydeviceispresent,nrfjprogcheckstheMemSizeparameterfromQspiDefault.inifileortheQSPIconfigurationinifilethatisgivenwiththe--qspiinioption.Thefirstaddressoftheregionisconsideredasaddress0oftheexternalmemorydevice.Ifthetargetaddressisflash(eitherinternalorintheexternalmemorydevice)andnoterased,theoperationwillfail.Thiscommandcanbecombinedwiththe--verifyoperation.--ramwr&lt;addr&gt;--val&lt;val&gt;WritestomemorywithoutthehelpoftheNVMControllertotheprovidedaddress.Ifthetargetaddressisinnon-volatilememory,--ramwrwillhavenoeffectunlessthenon-volatilememorycontroller(NVMC)hasbeenpreviouslyconfiguredbytheuserforawriteoperation.Canbecombinedwiththe--verifyoperation.--verify[&lt;image_file&gt;][--fast]Theprovidedimage_filecontentsarecomparedwiththecontentsinthedevicecodeflash,RAM,UICRandXIPregionsfordevicesequippedwithaQSPIperipheralconnectedtoanexternalmemorydevice,andfailifthereisamismatch.Supportedfileformatsare.hex,.ihex,.elf,.axf,and.bin.Avalidformatmustbespecifiedbythefilenameextension.Todetermineifanexternalmemorydeviceispresent,nrfjprogchecksMemSizeparameterfromQspiDefault.inifileorfromtheQSPIconfigurationinifilegivenwiththe--qspiinioption.Iftheoptional--fastparameterisgiven,nrfjprogwillcalculateahashoftheflashtargetareausingasha256algorithmandcompareittotheexpectedhashinsteadofreadingbacktheactualcontentsofthedevice'sflashinordertospeedtheoperation.Itcanbecombinedwiththe--program,--memwrand--ramwroperationsifprovidedwithouttheimage_fileparameter.Limitations:FornRF51devices,the--fastverifyingoptionisnotavailableFornRF91devices,the--fastverifyingoptionisnotavailable.--memrd&lt;addr&gt;[--w&lt;width&gt;][--n&lt;n&gt;]Readsnbytesfromtheprovidedaddress.Ifwidthisnotgiven,32-bitwordswillbereadifaddriswordaligned,16-bitwordsifaddrishalfwordaligned,and8-bitwordsotherwise.Ifnisnotgiven,onewordofsizewidthwillberead.Theaddressandnmustbealignedtothewidthparameter.Themaximumnumberofbytesthatcanbereadis1MB.Thewidthmustbe8,16or32.IfyourdeviceisequippedwithaQSPIperipheral,andtheaddressestoreadbelongtotheXIPregion,theQSPIperipheralisusedtoreadfromtheexternalmemorydeviceifpresent.Todetermineifanexternalmemorydeviceispresent,mrfjprogcheckstheMemSizeparameterfromQspiDefault.inifileortheQSPIconfigurationinifilethatisgivenwiththe--qspiinioption.Thefirstaddressoftheregionisconsideredasaddress0oftheexternalmemorydevice.Limitations:Asingle--memrdinstructioncannotbeusedtoreadaddressesfromboththeexternalmemorydeviceandthenRFdevice.--haltHaltstheCPUcore.--run[--pc&lt;pc_addr&gt;--sp&lt;sp_addr&gt;]StartstheCPU.If--pcand--spoptionsaregiven,thepc_addrandsp_addrareusedasinitialPCandstackpointer.Forpc_addrtobevaliditslastbitmustbeone.Forsp_addrtobevaliditmustbewordaligned.--readuicr&lt;file&gt;ReadsthedeviceUICRandstoresitinthegivenfilename.Canbecombinedwith--readram,--readcodeand--readqspi.Ifcombined,onlyoneinstructioncanprovideafilename.Supportedoutputformatsare.hex,.ihex,.elf,.axf,and.bin.Avalidformatmustbespecifiedbythefilenameextension.--readcode&lt;file&gt;Readsthedeviceflashandstoresitinthegivenfilename.Canbecombinedwith--readuicr,--readramand--readqspi.Ifcombined,onlyoneinstructioncanprovideafilename.Supportedoutputformatsare.hex,.ihex,.elf,.axf,and.bin.Avalidformatmustbespecifiedbythefilenameextension.--readram&lt;file&gt;Readsthedeviceramandstoresitinthegivenfilename.Canbecombinedwith--readuicr,--readcodeand--readqspi.Ifcombined,onlyoneinstructioncanprovideafilename.Supportedoutputformatsare.hex,.ihex,.elf,.axf,and.bin.Avalidformatmustbespecifiedbythefilenameextension.--readqspi&lt;file&gt;ReadstheQSPI-connectedexternalmemoryandstoresitinthegivenfilename.Canbecombinedwith--readuicr,--readcodeand--readram.Ifcombined,onlyoneinstructioncanprovideafilename.Supportedoutputformatsare.hex,.ihex,.elf,.axf,and.bin.Avalidformatmustbespecifiedbythefilenameextension.--readregs[first_register][second_register]Readsthecpuregisters.Ifnooptionalargumentsarespecified,allCPUregistersintheselectedcoreareprinted.Ifoptionalargumentfirst_registerisspecifiedonlythatregisterisprinted.Ifbothfirst_registerandsecond_registerisspecifiedtheregistersbetweenandincludingfirst_registerandsecond_registerareprinted.--coprocessor&lt;coprocessor&gt;Connectsthedevicetotheselectedcoprocessor.ValidargumentsareCP_APPLICATIONandCP_NETWORK.If--coprocessoroptionisnotused,CP_APPLICATIONwillbethetargetoftheotheroperation.Mustbecombinedwithanothercommand.</li>
  <li>一：示波器设置示波器打到如下挡位：10X示波器表笔打到挡位：10X电平耦合方式：交流电平显示：50mV窗口时间显示：20us被测nRF5蓝牙板子电源设置：示波器USB电源或干电池（纹波较小电源）</li>
  <li>nRF9160常用调试技巧没错，就是看log，没有log日志，没有数据，你分析个锤子。简介一般来讲，IOT类产品开发周期中三分之二时间用于调试和验证产品的性能。开发与量产阶段，如何验证产品的软硬件的好坏就显得至关重要？在IOT类产品中，由于网络状况的差异，无线类的调试比非无线类的调试更具有挑战性。当产品小批量生产时，没有留出来UARTSWDIOSWCLK等IO口时应该如何调试程序？当产品大批量生产时，送到客户手中时，没有技术能力的客户改如何协助你分析问题，排除bug？本地调试uartlog开启串口的宏定义通过printf函数连续打印程序状态rttlog开启rttlog的宏定义通过J-LinkRTTViewer连续查看log状态其他外设ledspi等调试通过不同外设的状态，间接分析程序运行到那一部分，比如说外设的初始化与反初始化状态，LED的指示灯状态，spi的初始化状态等远程调试flashlog通过printf函数打印与flash存储，连续记录log状态到flash中服务器log日志通过网络层协议mqtt等，连续发送log数据到服务器短信调试通过特定的触发机制，将关关键log信息通过短信形式发送到手机中hardfault等特殊错误通过addr2line工具借助PC和LR指针进行分析实时操作系统调试通过FreeRTOS+Trace动态分析程序过程链接通过Ozone调试链接</li>
  <li>一：nRF9160常见错误代码查询#defineEPERM1/*Notowner*/#defineENOENT2/*Nosuchfileordirectory*/#defineESRCH3/*Nosuchprocess*/#defineEINTR4/*Interruptedsystemcall*/#defineEIO5/*I/Oerror*/#defineENXIO6/*Nosuchdeviceoraddress*/#defineE2BIG7/*Arglisttoolong*/#defineENOEXEC8/*Execformaterror*/#defineEBADF9/*Badfilenumber*/#defineECHILD10/*Nochildren*/#defineEAGAIN11/*Nomoreprocesses*/#defineENOMEM12/*Notenoughspace*/#defineEACCES13/*Permissiondenied*/#defineEFAULT14/*Badaddress*/#ifdef__LINUX_ERRNO_EXTENSIONS__#defineENOTBLK15/*Blockdevicerequired*/#endif#defineEBUSY16/*Deviceorresourcebusy*/#defineEEXIST17/*Fileexists*/#defineEXDEV18/*Cross-devicelink*/#defineENODEV19/*Nosuchdevice*/#defineENOTDIR20/*Notadirectory*/#defineEISDIR21/*Isadirectory*/#defineEINVAL22/*Invalidargument*/#defineENFILE23/*Toomanyopenfilesinsystem*/#defineEMFILE24/*Filedescriptorvaluetoolarge*/#defineENOTTY25/*Notacharacterdevice*/#defineETXTBSY26/*Textfilebusy*/#defineEFBIG27/*Filetoolarge*/#defineENOSPC28/*Nospaceleftondevice*/#defineESPIPE29/*Illegalseek*/#defineEROFS30/*Read-onlyfilesystem*/#defineEMLINK31/*Toomanylinks*/#defineEPIPE32/*Brokenpipe*/#defineEDOM33/*Mathematicsargumentoutofdomainoffunction*/#defineERANGE34/*Resulttoolarge*/#defineENOMSG35/*Nomessageofdesiredtype*/#defineEIDRM36/*Identifierremoved*/#ifdef__LINUX_ERRNO_EXTENSIONS__#defineECHRNG37/*Channelnumberoutofrange*/#defineEL2NSYNC38/*Level2notsynchronized*/#defineEL3HLT39/*Level3halted*/#defineEL3RST40/*Level3reset*/#defineELNRNG41/*Linknumberoutofrange*/#defineEUNATCH42/*Protocoldrivernotattached*/#defineENOCSI43/*NoCSIstructureavailable*/#defineEL2HLT44/*Level2halted*/#endif#defineEDEADLK45/*Deadlock*/#defineENOLCK46/*Nolock*/#ifdef__LINUX_ERRNO_EXTENSIONS__#defineEBADE50/*Invalidexchange*/#defineEBADR51/*Invalidrequestdescriptor*/#defineEXFULL52/*Exchangefull*/#defineENOANO53/*Noanode*/#defineEBADRQC54/*Invalidrequestcode*/#defineEBADSLT55/*Invalidslot*/#defineEDEADLOCK56/*Filelockingdeadlockerror*/#defineEBFONT57/*Badfontfilefmt*/#endif#defineENOSTR60/*Notastream*/#defineENODATA61/*Nodata(fornodelayio)*/#defineETIME62/*Streamioctltimeout*/#defineENOSR63/*Nostreamresources*/#ifdef__LINUX_ERRNO_EXTENSIONS__#defineENONET64/*Machineisnotonthenetwork*/#defineENOPKG65/*Packagenotinstalled*/#defineEREMOTE66/*Theobjectisremote*/#endif#defineENOLINK67/*Virtualcircuitisgone*/#ifdef__LINUX_ERRNO_EXTENSIONS__#defineEADV68/*Advertiseerror*/#defineESRMNT69/*Srmounterror*/#defineECOMM70/*Communicationerroronsend*/#endif#defineEPROTO71/*Protocolerror*/#defineEMULTIHOP74/*Multihopattempted*/#ifdef__LINUX_ERRNO_EXTENSIONS__#defineELBIN75/*Inodeisremote(notreallyerror)*/#defineEDOTDOT76/*Crossmountpoint(notreallyerror)*/#endif#defineEBADMSG77/*Badmessage*/#defineEFTYPE79/*Inappropriatefiletypeorformat*/#ifdef__LINUX_ERRNO_EXTENSIONS__#defineENOTUNIQ80/*Givenlog.namenotunique*/#defineEBADFD81/*f.d.invalidforthisoperation*/#defineEREMCHG82/*Remoteaddresschanged*/#defineELIBACC83/*Can'taccessaneededsharedlib*/#defineELIBBAD84/*Accessingacorruptedsharedlib*/#defineELIBSCN85/*.libsectionina.outcorrupted*/#defineELIBMAX86/*Attemptingtolinkintoomanylibs*/#defineELIBEXEC87/*Attemptingtoexecasharedlibrary*/#endif#defineENOSYS88/*Functionnotimplemented*/#ifdef__CYGWIN__#defineENMFILE89/*Nomorefiles*/#endif#defineENOTEMPTY90/*Directorynotempty*/#defineENAMETOOLONG91/*Fileorpathnametoolong*/#defineELOOP92/*Toomanysymboliclinks*/#defineEOPNOTSUPP95/*Operationnotsupportedonsocket*/#defineEPFNOSUPPORT96/*Protocolfamilynotsupported*/#defineECONNRESET104/*Connectionresetbypeer*/#defineENOBUFS105/*Nobufferspaceavailable*/#defineEAFNOSUPPORT106/*Addressfamilynotsupportedbyprotocolfamily*/#defineEPROTOTYPE107/*Protocolwrongtypeforsocket*/#defineENOTSOCK108/*Socketoperationonnon-socket*/#defineENOPROTOOPT109/*Protocolnotavailable*/#ifdef__LINUX_ERRNO_EXTENSIONS__#defineESHUTDOWN110/*Can'tsendaftersocketshutdown*/#endif#defineECONNREFUSED111/*Connectionrefused*/#defineEADDRINUSE112/*Addressalreadyinuse*/#defineECONNABORTED113/*Softwarecausedconnectionabort*/#defineENETUNREACH114/*Networkisunreachable*/#defineENETDOWN115/*Networkinterfaceisnotconfigured*/#defineETIMEDOUT116/*Connectiontimedout*/#defineEHOSTDOWN117/*Hostisdown*/#defineEHOSTUNREACH118/*Hostisunreachable*/#defineEINPROGRESS119/*Connectionalreadyinprogress*/#defineEALREADY120/*Socketalreadyconnected*/#defineEDESTADDRREQ121/*Destinationaddressrequired*/#defineEMSGSIZE122/*Messagetoolong*/#defineEPROTONOSUPPORT123/*Unknownprotocol*/#ifdef__LINUX_ERRNO_EXTENSIONS__#defineESOCKTNOSUPPORT124/*Sockettypenotsupported*/#endif#defineEADDRNOTAVAIL125/*Addressnotavailable*/#defineENETRESET126/*Connectionabortedbynetwork*/#defineEISCONN127/*Socketisalreadyconnected*/#defineENOTCONN128/*Socketisnotconnected*/#defineETOOMANYREFS129#ifdef__LINUX_ERRNO_EXTENSIONS__#defineEPROCLIM130#defineEUSERS131#endif#defineEDQUOT132#defineESTALE133#defineENOTSUP134/*Notsupported*/#ifdef__LINUX_ERRNO_EXTENSIONS__#defineENOMEDIUM135/*Nomedium(intapedrive)*/#endif#ifdef__CYGWIN__#defineENOSHARE136/*Nosuchhostornetworkpath*/#defineECASECLASH137/*Filenameexistswithdifferentcase*/#endif#defineEILSEQ138/*Illegalbytesequence*/#defineEOVERFLOW139/*Valuetoolargefordefineddatatype*/#defineECANCELED140/*Operationcanceled*/#defineENOTRECOVERABLE141/*Statenotrecoverable*/#defineEOWNERDEAD142/*Previousownerdied*/#ifdef__LINUX_ERRNO_EXTENSIONS__#defineESTRPIPE143/*Streamspipeerror*/#endif#defineEWOULDBLOCKEAGAIN/*Operationwouldblock*/#define__ELASTERROR2000/*Userscanaddvaluesstartinghere*/#ifdef__cplusplus</li>
  <li>nRF9160常见可用例程介绍hello_world例程路径(ncs\v2.3.0\zephyr\samples)hello_world//通常用于构建最小工程application_development目录例程(ncs\v2.3.0\zephyr\samples\application_development)code_relocation_nocopyexternal_libout_of_tree_boardout_of_tree_driversysbuildapplications目录例程(ncs\v2.3.0\nrf\applications)asset_tracker_v2//资产追踪例程，可基于此例程做自己的追踪器connectivity_bridgemachine_learningmatter_weather_stationnrf_desktop//键鼠例程最大支持1K速率nrf5340_audio//LEAUDIO例程serial_lte_modem//增强版at例程，通常用做at模块的固件。zigbee_weather_stationnrf目录例程(ncs\v2.3.0\zephyr\samples\boards\nrf)batteryclock_skewdynamic_pinctrlieee802154meshnrf_led_matrixnrf53_sync_rtcnrfxnrfx_prss2ramsystem_offnrf9160目录例程(ncs\v2.3.0\nrf\samples\nrf9160)at_clientat_monitoraws_iotazure_fotaazure_iot_hubciphersuitescoap_clientdownloadfmfu_smp_svrgnsshttp_updatehttps_clientlocationlte_ble_gatewaylwm2m_carrierlwm2m_clientmemfaultmodem_callbacksmodem_shellmodem_trace_backendmodem_trace_flashniddnrf_cloud_mqtt_multi_servicenrf_cloud_rest_cell_locationnrf_cloud_rest_device_messagenrf_cloud_rest_fotapdnslm_shellsmsudpzephyr常见可用例程介绍basic目录例程(ncs\v2.3.0\zephyr\samples\basic)blinkyblinky_pwmbuttonfade_ledminimalrgb_ledservo_motorsys_heapthreadsdrivers目录例程(ncs\v2.3.0\zephyr\samples\drivers)adcaudiocanclock_control_litexcountercryptocurrent_sensingdacdisplayeepromespiflash_shellfpgaht16k33i2c_fujitsu_frami2sipmjesd216kscankscan_touchlcd_cyclonev_socdklcd_hd44780led_apa102led_apa102c_bitbangled_lp503xled_lp3943led_lp5562led_lpd8806led_pca9633led_pwmled_sx1509b_intensityled_ws2812led_xecloramboxmiscpecips2soc_flash_nrfspi_bitbangspi_flashspi_flash_at45spi_fujitsu_framuartw1watchdog</li>
  <li>一：nRF9160做纯AT模块开发步骤网盘下载地址烧录相关证书，并验证烧录结果（AT+CFUN=4AT%CMNG=1）烧录最新modem固件：mfw_nrf9160_1.3.4.zip固件烧录最新hex固件：serial_lte_modem.hex固件插入sim卡，中国大陆需要自行购买NB卡测试（开发板中自带sim卡不能使用）。使用LTELinkMonitor测试nRFConnectforDesktop-&gt;LTELinkMonitor连接到mqtt服务器测试二：烧录相关证书（如果使用TLSSSL等：CA.crtclient.crtclient.keysec_tag）通过LTELinkMonitor烧录证书打开LTELinkMonitor连接到nRF9160-DK发送AT指令：AT+CFUN=4，关闭射频切换到LTELinkMonitor-&gt;CERTIFICATEMANAGER选项卡点击Updatecertificates更新证书三：烧录最新modem固件（mfw_nrf9160_1.3.1.zip）通过Programmer烧录modem固件四：烧录最新hex固件（serial_lte_modem.hex）通过Programmer烧录hex固件五：使用LTELinkMonitor测试插入sim卡先连接上nRF9160-DK，发送下述AT指令查询射频开关状态：AT+CFUN?关闭射频：AT+CFUN=4设置模块为NB模式：AT%XSYSTEMMODE=0,1,0,0设置模块支持域名解析：AT%XEPCO=0保存已经设置的参数：AT+CFUN=0断开nRF9160-DK，再重新连接nRF9160-DK，可以看到以下测试结果六：连接到mqtt服务器测试windows客户端mqttx下载地址：链接mqtt测试服务器域名：mqtt.olib.cnmqtt测试服务器IP：216.240.134.140mqtt测试服务器端口:1883mqtt测试服务器用户名：test1mqtt测试服务器密码：123456mqtt测试服务器用户名：test2mqtt测试服务器密码：123456mqtt测试服务器用户名：test3mqtt测试服务器密码：123456mqtt测试服务器用户名：test4mqtt测试服务器密码：123456mqtt测试服务器用户名：test5mqtt测试服务器密码：123456mqtt测试服务器用户名：test6mqtt测试服务器密码：123456注意：请先用mqttx客户端测试服务器可用性，再做如下AT指令测试测试at指令连接到mqtt服务器开始//Peter编辑的测试指令：//关闭射频和GPS，进入飞行模式AT+CFUN=4注意：仅需要执行此指令一次，避免之前的设置影响下边的指令设置//恢复出厂设置AT%XFACTORYRESET=0注意：如果之前没有烧录sec_tag为16842753的证书，则此指令会报错，请忽略报错//删除sec_tag为16842753的证书AT%CMNG=3,16842753,0//切换到CERTIFICATEMANAGE面板，烧录sec_tag为16842753的CA证书AT%CMNG=0,16842753,0,”—–BEGINCERTIFICATE—–MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5—–ENDCERTIFICATE—–“//设置支持域名解析AT%XEPCO=0//设置模块工作模式为NB模式AT%XSYSTEMMODE=0,1,0,0//开启射频，注册到网络AT+CFUN=1//注意：需要等待至少15秒左右（网络环境差会更久），然后再查询注册到网络的IP，//如果查询到ip，则可以继续测试，如果没有获取到IP，无需以下步骤测试。AT+CGDCONT?//如果之前的mqtt连接没有断开，则断开之前的mqtt连接AT#XMQTTCON=0//连接到mqtt服务器AT#XMQTTCON=1,“MyMQTT-Client-ID”,“test1”,“123456”,“mqtt.olib.cn”,1883//发布消息,至多一次AT#XMQTTPUB=“test1”,“nRF9160msgQOS0”,0,0//发布消息，至少一次AT#XMQTTPUB=“test1”,“nRF9160msgQOS1”,1,0//发布消息，只有一次AT#XMQTTPUB=“test1”,“nRF9160msgQOS2”,2,0//msg为空则进入数据模式//进入数据模式指令,此处需更换测试工具为sscom而不可以用LTELinkMonitorv2.3.0AT#XMQTTPUB=“test1”,””,0,0//data模式发送数据//任意字符12309/*#’“”？？0123456789注意：+++后边不可以有换行和回车符号//退出数据模式指令+++</li>
  <li>创芯工坊nRF9160脱机烧录器预览扫码获取创芯工坊nRF9160烧录器购买链接</li>
  <li>一、修改main.c文件在函数staticvoidble_evt_handler(ble_evt_tconst*p_ble_evt,void*p_context)中注释到代码//caseBLE_GAP_EVT_SEC_PARAMS_REQUEST:////Pairingnotsupported//err_code=sd_ble_gap_sec_params_reply(m_conn_handle,BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP,NULL,NULL);//APP_ERROR_CHECK(err_code);//break;在函数staticvoidble_evt_handler(ble_evt_tconst*p_ble_evt,void*p_context)中增加代码//PeteraddstartcaseBLE_GAP_EVT_PASSKEY_DISPLAY:{charpasskey[BLE_GAP_PASSKEY_LEN+1];memcpy(passkey,p_ble_evt-&gt;evt.gap_evt.params.passkey_display.passkey,BLE_GAP_PASSKEY_LEN);passkey[BLE_GAP_PASSKEY_LEN]=0x00;NRF_LOG_INFO("===PASSKEY:%s=====",nrf_log_push(passkey));NRF_LOG_INFO("PressButton3toconfirm,Button4toreject");}break;//Peteraddend在函数voidbsp_event_handler(bsp_event_tevent)中增加代码//Peteraddstartexternvoidnum_comp_reply(boolaccept);caseBSP_EVENT_KEY_3:{num_comp_reply(1);//接受配对绑定}break;//Peteraddend在main.c中注释代码///**@briefFunctionforstartingadvertising.//*///staticvoidadvertising_start(void)//{//uint32_terr_code=ble_advertising_start(&amp;m_advertising,BLE_ADV_MODE_FAST);//APP_ERROR_CHECK(err_code);//}在函数intmain(void)中增加代码peer_manager_init();//Peteradd在函数intmain(void)中修改代码advertising_start(erase_bonds);//Peterchange在函数intmain(void)上方插入以下代码//Peteraddpairandbondstart#include"peer_manager.h"#include"peer_manager_handler.h"#defineSEC_PARAM_BOND1/**&lt;Performbonding.*/#defineSEC_PARAM_MITM1/**&lt;ManInTheMiddleprotectionnotrequired.*/#defineSEC_PARAM_LESC0/**&lt;LESecureConnectionsnotenabled.*/#defineSEC_PARAM_KEYPRESS0/**&lt;Keypressnotificationsnotenabled.*/#defineSEC_PARAM_IO_CAPABILITIESBLE_GAP_IO_CAPS_DISPLAY_YESNO//BLE_GAP_IO_CAPS_NONE/**&lt;NoI/Ocapabilities.*/#defineSEC_PARAM_OOB0/**&lt;OutOfBanddatanotavailable.*/#defineSEC_PARAM_MIN_KEY_SIZE7/**&lt;Minimumencryptionkeysize.*/#defineSEC_PARAM_MAX_KEY_SIZE16/**&lt;Maximumencryptionkeysize.*/staticpm_peer_id_tm_peer_id;/**@briefFunctionforsettingfilteredwhitelist.**@param[in]skipFilterpassedto@refpm_peer_id_list.*/staticvoidwhitelist_set(pm_peer_id_list_skip_tskip){pm_peer_id_tpeer_ids[BLE_GAP_WHITELIST_ADDR_MAX_COUNT];uint32_tpeer_id_count=BLE_GAP_WHITELIST_ADDR_MAX_COUNT;ret_code_terr_code=pm_peer_id_list(peer_ids,&amp;peer_id_count,PM_PEER_ID_INVALID,skip);APP_ERROR_CHECK(err_code);NRF_LOG_INFO("\tm_whitelist_peer_cnt%d,MAX_PEERS_WLIST%d",peer_id_count+1,BLE_GAP_WHITELIST_ADDR_MAX_COUNT);err_code=pm_whitelist_set(peer_ids,peer_id_count);APP_ERROR_CHECK(err_code);}/**@briefClearbondinformationfrompersistentstorage.*/staticvoiddelete_bonds(void){ret_code_terr_code;NRF_LOG_INFO("Erasebonds!");err_code=pm_peers_delete();APP_ERROR_CHECK(err_code);}/**@briefFunctionforstartingadvertising.*/staticvoidadvertising_start(boolerase_bonds){if(erase_bonds==true){delete_bonds();//AdvertisingisstartedbyPM_EVT_PEERS_DELETE_SUCCEEDEDevent.}else{whitelist_set(PM_PEER_ID_LIST_SKIP_NO_ID_ADDR);ret_code_tret=ble_advertising_start(&amp;m_advertising,BLE_ADV_MODE_FAST);APP_ERROR_CHECK(ret);}}/**@briefFunctionforhandlingPeerManagerevents.**@param[in]p_evtPeerManagerevent.*/staticvoidpm_evt_handler(pm_evt_tconst*p_evt){pm_handler_on_pm_evt(p_evt);pm_handler_disconnect_on_sec_failure(p_evt);pm_handler_flash_clean(p_evt);switch(p_evt-&gt;evt_id){casePM_EVT_CONN_SEC_SUCCEEDED:m_peer_id=p_evt-&gt;peer_id;break;casePM_EVT_PEERS_DELETE_SUCCEEDED:advertising_start(false);break;casePM_EVT_PEER_DATA_UPDATE_SUCCEEDED:if(p_evt-&gt;params.peer_data_update_succeeded.flash_changed&amp;&amp;(p_evt-&gt;params.peer_data_update_succeeded.data_id==PM_PEER_DATA_ID_BONDING)){NRF_LOG_INFO("NewBond,addthepeertothewhitelistifpossible");//Note:Youshouldcheckonwhatkindofwhitelistpolicyyourapplicationshoulduse.whitelist_set(PM_PEER_ID_LIST_SKIP_NO_ID_ADDR);}break;casePM_EVT_CONN_SEC_CONFIG_REQ:{pm_conn_sec_config_tcfg;cfg.allow_repairing=true;pm_conn_sec_config_reply(p_evt-&gt;conn_handle,&amp;cfg);}break;default:break;}}/**@briefFunctionforthePeerManagerinitialization.*/staticvoidpeer_manager_init(void){ble_gap_sec_params_tsec_param;ret_code_terr_code;err_code=pm_init();APP_ERROR_CHECK(err_code);memset(&amp;sec_param,0,sizeof(ble_gap_sec_params_t));//Securityparameterstobeusedforallsecurityprocedures.sec_param.bond=SEC_PARAM_BOND;sec_param.mitm=SEC_PARAM_MITM;sec_param.lesc=SEC_PARAM_LESC;sec_param.keypress=SEC_PARAM_KEYPRESS;sec_param.io_caps=SEC_PARAM_IO_CAPABILITIES;sec_param.oob=SEC_PARAM_OOB;sec_param.min_key_size=SEC_PARAM_MIN_KEY_SIZE;sec_param.max_key_size=SEC_PARAM_MAX_KEY_SIZE;sec_param.kdist_own.enc=1;sec_param.kdist_own.id=1;sec_param.kdist_peer.enc=1;sec_param.kdist_peer.id=1;err_code=pm_sec_params_set(&amp;sec_param);APP_ERROR_CHECK(err_code);err_code=pm_register(pm_evt_handler);APP_ERROR_CHECK(err_code);}voidnum_comp_reply(boolaccept){uint8_tkey_type;ret_code_terr_code;NRF_LOG_INFO("m_conn_handle%d",m_conn_handle);if(m_conn_handle==BLE_CONN_HANDLE_INVALID){return;}if(accept){NRF_LOG_INFO("NumericMatch");key_type=BLE_GAP_AUTH_KEY_TYPE_PASSKEY;}else{NRF_LOG_INFO("NumericREJECT");key_type=BLE_GAP_AUTH_KEY_TYPE_NONE;}err_code=sd_ble_gap_auth_key_reply(m_conn_handle,key_type,NULL);APP_ERROR_CHECK(err_code);}//Peteraddend二、修改sdk_config.h配置文件使能fds宏定义#ifndefFDS_ENABLED#defineFDS_ENABLED1#endif使能FS存储宏定义#ifndefNRF_FSTORAGE_ENABLED#defineNRF_FSTORAGE_ENABLED1#endif使能配对绑定宏定义//&lt;e&gt;PEER_MANAGER_ENABLED-peer_manager-PeerManager//==========================================================#ifndefPEER_MANAGER_ENABLED#definePEER_MANAGER_ENABLED1#endif//&lt;o&gt;PM_MAX_REGISTRANTS-Numberofeventhandlersthatcanberegistered.#ifndefPM_MAX_REGISTRANTS#definePM_MAX_REGISTRANTS3#endif//&lt;o&gt;PM_FLASH_BUFFERS-Numberofinternalbuffersforflashoperations.//&lt;i&gt;DecreasethisvaluetolowerRAMusage.#ifndefPM_FLASH_BUFFERS#definePM_FLASH_BUFFERS4#endif//&lt;q&gt;PM_CENTRAL_ENABLED-Enable/disablecentral-specificPeerManagerfunctionality.//&lt;i&gt;Enable/disablecentral-specificPeerManagerfunctionality.#ifndefPM_CENTRAL_ENABLED#definePM_CENTRAL_ENABLED0#endif//&lt;q&gt;PM_SERVICE_CHANGED_ENABLED-Enable/disabletheservicechangedmanagementforGATTserverinPeerManager.//&lt;i&gt;IfnotusingaGATTserver,orusingaserverwihoutaservicechangedcharacteristic,//&lt;i&gt;disablethistosavecodespace.#ifndefPM_SERVICE_CHANGED_ENABLED#definePM_SERVICE_CHANGED_ENABLED1#endif//&lt;q&gt;PM_PEER_RANKS_ENABLED-Enable/disablethepeerrankmanagementinPeerManager.//&lt;i&gt;SetthistofalsetosavecodespaceifnotusingthepeerrankAPI.#ifndefPM_PEER_RANKS_ENABLED#definePM_PEER_RANKS_ENABLED1#endif//&lt;q&gt;PM_LESC_ENABLED-Enable/disableLESCsupportinPeerManager.//&lt;i&gt;Ifsettotrue,youneedtocallnrf_ble_lesc_request_handler()inthemainlooptorespondtoLESC-relatedBLEevents.IfLESCsupportisnotrequired,setthistofalsetosavecodespace.#ifndefPM_LESC_ENABLED#definePM_LESC_ENABLED0#endif//&lt;e&gt;PM_RA_PROTECTION_ENABLED-Enable/disableprotectionagainstrepeatedpairingattemptsinPeerManager.//==========================================================#ifndefPM_RA_PROTECTION_ENABLED#definePM_RA_PROTECTION_ENABLED0#endif//&lt;o&gt;PM_RA_PROTECTION_TRACKED_PEERS_NUM-Maximumnumberofpeerswhoseauthorizationstatuscanbetracked.#ifndefPM_RA_PROTECTION_TRACKED_PEERS_NUM#definePM_RA_PROTECTION_TRACKED_PEERS_NUM8#endif//&lt;o&gt;PM_RA_PROTECTION_MIN_WAIT_INTERVAL-Minimumwaitinginterval(inms)beforeanewpairingattemptcanbeinitiated.#ifndefPM_RA_PROTECTION_MIN_WAIT_INTERVAL#definePM_RA_PROTECTION_MIN_WAIT_INTERVAL4000#endif//&lt;o&gt;PM_RA_PROTECTION_MAX_WAIT_INTERVAL-Maximumwaitinginterval(inms)beforeanewpairingattemptcanbeinitiated.#ifndefPM_RA_PROTECTION_MAX_WAIT_INTERVAL#definePM_RA_PROTECTION_MAX_WAIT_INTERVAL64000#endif//&lt;o&gt;PM_RA_PROTECTION_REWARD_PERIOD-Rewardperiod(inms).//&lt;i&gt;Thewaitingintervalisgraduallydecreasedwhennonewfailedpairingattemptsaremadeduringrewardperiod.#ifndefPM_RA_PROTECTION_REWARD_PERIOD#definePM_RA_PROTECTION_REWARD_PERIOD10000#endif//&lt;/e&gt;//&lt;o&gt;PM_HANDLER_SEC_DELAY_MS-Delaybeforestartingsecurity.//&lt;i&gt;Thismightbenecessaryforinteroperabilityreasons,especiallyasperipheral.#ifndefPM_HANDLER_SEC_DELAY_MS#definePM_HANDLER_SEC_DELAY_MS0#endif//&lt;/e&gt;三、增加文件到工程增加文件夹nRF_BOND，添加以下文件到工程.\..\..\..\..\..\..\components\ble\peer_manager\gatt_cache_manager.c.\..\..\..\..\..\..\components\ble\peer_manager\gatts_cache_manager.c.\..\..\..\..\..\..\components\ble\peer_manager\id_manager.c.\..\..\..\..\..\..\components\ble\peer_manager\peer_data_storage.c.\..\..\..\..\..\..\components\ble\peer_manager\peer_database.c.\..\..\..\..\..\..\components\ble\peer_manager\peer_id.c.\..\..\..\..\..\..\components\ble\peer_manager\peer_manager.c.\..\..\..\..\..\..\components\ble\peer_manager\peer_manager_handler.c.\..\..\..\..\..\..\components\ble\peer_manager\security_dispatcher.c.\..\..\..\..\..\..\components\ble\peer_manager\security_manager.c.\..\..\..\..\..\..\components\ble\peer_manager\auth_status_tracker.c.\..\..\..\..\..\..\components\ble\peer_manager\pm_buffer.c.\..\..\..\..\..\..\components\libraries\fds\fds.c.\..\..\..\..\..\..\components\libraries\fstorage\nrf_fstorage.c.\..\..\..\..\..\..\components\libraries\fstorage\nrf_fstorage_sd.c</li>
  <li>BLE常见射频测试方法根据实际开发或生产需要及成本考虑，蓝牙常见测试方法有：RSSI测试丢包率测试DTM测试方法。成本低成本中成本高可靠性低RSSI测试可靠性中丢包率测试可靠性高DTM测试一、BLE射频测试-开发板测试RSSI需要准备以下工具黄金样品：nRF52系列开发板一个：PCA10056(nRF52840)/PCA10040(nRF52832)/PCA10100(nRF52833)/PCA10095(nRF5340)待测设备（DUT）屏蔽箱测试程序（读取RSSI，并设定阈值，通过则常亮绿灯，不通过的闪烁绿灯报警）烧录到黄金样品中。测试治具。电脑测试方法1将黄金样品放到屏蔽箱中，将待测样品放到屏蔽箱治具中。合上屏蔽箱，通过屏蔽箱外按键启动测试，通过屏蔽箱外边指示灯判断测试结果。测试方法2将黄金样品放到屏蔽箱中，将待测样品放到屏蔽箱治具中。通过电脑上位机启动测试，通过电脑上位机测试判断结果，并保存测试结果到测试日志中。二、BLE射频测试-Python脚本测试丢包率需要准备以下工具黄金样品：nRF52系列开发板一个：PCA10056(nRF52840)/PCA10040(nRF52832)/PCA10100(nRF52833)/PCA10095(nRF5340)待测设备（DUT）屏蔽箱测试文档nAN34测试程序Python脚本测试治具。电脑测试方法需要搭建测试环境Python2.7.2withpySerial2.6//安装pySerial2.6指令pythonsetup.pyinstall将黄金样品和待测设备（DUT）接到电脑上，通过电脑设备管理器查看COM口需要修改example.py中的黄金样品COM口和待测设备（DUT）运行测试脚本查看测试结果//打开Python脚本测试指令pythonexample.py三、BLE射频测试-CMW500BLEDTM(DirectTestMode)模式测试概念解释：非信令测试模式：待测设备(DUT)与测试设备形成闭环，启动测试模式后自动发送测试指令完成测试。信令测试模式：待测设备(DUT)需要人手动发送测试指令。需要准备以下工具待测设备（DUT）屏蔽箱测试程序：dtm测试固件，需要烧录到待测设备中测试程序：nRFgo/nRFConnect-&gt;DirectTestMode测试治具电脑CMW500/MT8852B/TLF3000测试方法1：非信令模式测试用nRFgo给待测设备（DUT）烧录dtm测试固件，默认dtm固件路径：nRF5_SDK_17.1.0_ddde560\examples\dtm\direct_test_mode\hex\待测设备IO口TXD=P0.06RXD=P0.08接USB转串口TTL小板（注意电平匹配），然后接电脑，如果P0.06口和P0.08口没有留出来，则需要改DTM固件串口管脚。打开nRFgo切换到DirectTestMode选项卡，设置COM口为USB转串口小板的COM口（可以从电脑设备管理器查看）,默认设置无需修改，点击Starttest进入dtm测试模式。测试方法2：信令模式测试用nRFgo给待测设备（DUT）烧录dtm测试固件，默认dtm固件路径：nRF5_SDK_17.1.0_ddde560\examples\dtm\direct_test_mode\hex\待测设备IO口TXD=P0.06RXD=P0.08接USB转串口TTL小板（注意电平匹配），然后接CMW500/MT8852B/TLF3000，如果P0.06口和P0.08口没有留出来，则需要改DTM固件串口管脚。设置设备CMW500/MT8852B/TLF3000进入DTM测试模式。BLE射频测试补充选项四、BLE射频测试-CMW500BLE广播模式测试需要准备以下工具待测设备（DUT）测试程序：在373839通道上自动广播的固件，需要烧录到待测设备中烧录工具：nRFgo电脑CMW500/MT8852B/TLF3000测试方法：烧录hex程序到待测设备（DUT）上设置CMW500进入测试模式查看测试结果：丢包率何接收灵敏度五、BLE射频测试-LitePointOTA模式测试需要准备以下工具测试文档nWP_028待测设备（DUT）测试例程：nRF5_SDK_17.1.0_ddde560\examples\ble_peripheral\ble_app_hrs需要修改广播间隔为400-650ms需要修改广播时间为一直广播需要修改的参数：#defineAPP_ADV_INTERVAL100#defineAPP_ADV_TIMEOUT_IN_SECONDS0测试仪器：LitePointBluetoothAdvanced测试方法1：见文档nRF5xOTATestingwithLitePointBluetoothAdvancednWP_028测试方法2：联系第三方实验室</li>
  <li>nRF52xFlashMemorylayoutUsagenRF52840nRF52833nRF52832nRF52820nRF52811nRF52810nRF52805Flashsize1MB512kB512/256kB256kB192kB192kB192kBBootloadersettings4kB4kB4kB4kB4kB4kB4kBMBRparameterstotage4kB4kB4kB4kB4kB4kB4kBBootloader24kB24kB24kB24kB24kB24kB24kBApplicationdata+Free+application836kB880kB324kB368kB328/380kB72/124kB68/124kB60kB60kB60kBSoftDevices140152kBs113108kBs140152kBs113108kBs132148kBs11296kBs140152kBs11296kBs11296kBs11296kBs11296kBMBR4kB4kB4kB4kB4kB4kB4kBnRF52xRAMMemorylayoutUsagenRF52840nRF52833nRF52832nRF52820nRF52811nRF52810nRF52805RAMsize256kB128kB64/32kB32kB24kB24kB24kBMBR8B8B8B8B8B8B8BSoftDevices1405.6kBs1134.4kBs1405.6kBs1134.4kBs1325.6kBs1123.7kBs1405.6kBs1123.7kBs1123.7kBs1123.7kBs1123.7kBSoftDeviceSTACKs1401.5kBs1131.75kBs1401.5kBs1131.75kBs1321.75kBs1121.75kBs1401.5kBs1121.75kBs1121.75kBs1121.75kBs1121.75kBHEAP8kB8kB8kB8kB8kB8kB8kBSTACK8kB8kB8kB8kB8kB8kB8kBSoftDevice工程s14010.8kBs1139.6kBs14010.8kBs1139.6kBs13210.8kBs1128.7kBs14010.8kBs1128.7kBs1128.7kBs1128.7kBs1128.7kBbootloaderorapplication245kB246kB117kB118kB53/21kB55/23kB21kB23kB15kB15kB15kBnRF52xFLASHstartandendaddressFlashAddressFlashAreanRF528400x000FF000-&gt;0x00100000nRF528330x0007F000-&gt;0x00080000nRF528320x0003F000-&gt;0x00040000nRF528200x0003F000-&gt;0x00040000nRF528110x0002F000-&gt;0x00030000nRF528100x0002F000-&gt;0x00030000nRF528050x0002F000-&gt;0x00080000BootloadersettingsnRF528400x000FE000-&gt;0x000FF000nRF528330x0007E000-&gt;0x0007F000nRF528320x0003E000-&gt;0x0003F000nRF528200x0003E000-&gt;0x0003F000nRF528110x0002E000-&gt;0x0002F000nRF528100x0002E000-&gt;0x0002F000nRF528050x0002E000-&gt;0x0002F000MBRparameterstoragenRF528400x000F8000-&gt;0x000FE000nRF528330x00078000-&gt;0x0007E000nRF528320x00038000-&gt;0x0003E000nRF528200x00038000-&gt;0x0003E000nRF528110x00028000-&gt;0x0002E000nRF528100x00028000-&gt;0x0002E000nRF528050x00078000-&gt;0x0002E000BootloaderApplicationdataFree0x00019000-&gt;…0x0001C000-&gt;…0x00026000-&gt;…0x00027000-&gt;…Applications1120x00001000-&gt;0x00019000s1130x00001000-&gt;0x0001C000s1320x00001000-&gt;0x00026000s1400x00001000-&gt;0x00027000SoftDevice0x00000000-&gt;0x00001000MBR参考资料nRF5_SDK_17.1.0_ddde560\components\softdevice\s140\doc\s140_nrf52_7.2.0_release-notes.pdfnRF5_SDK_17.1.0_ddde560\components\softdevice\s132\doc\s132_nrf52_7.2.0_release-notes.pdfnRF5_SDK_17.1.0_ddde560\components\softdevice\s112\doc\s112_nrf52_7.2.0_release-notes.pdfnRF5_SDK_17.1.0_ddde560\components\softdevice\s122\doc\s122_nrf52_8.0.0_release-notes.pdf</li>
  <li>一、芯片EOS/ESD损坏初步判定测试芯片VDD与GND之间电阻：万用表打到电阻挡位，红表笔接VDD，黑表笔接GND，电阻13MΩ左右，则初步判断芯片OK。测试芯片VDD与GND之间电阻：万用表打到电阻挡位，红表笔接VDD，黑表笔接GND，电阻1MΩ以下，则初步判断芯片有ESD/EOS损伤。二、芯片EOS/ESD损坏问题定位万用表打到测量二极管挡位，依次测试每个GPIO口钳位二极管压降（不包括晶振、天线和VDD口）GPIO与GND之间钳位二极管测试：万用表打到二极管挡位-&gt;万用表红表笔接GND，万用表黑表笔接GPIO口，读取二极管压降，并记录GPIO与VDD之间钳位二极管测试：万用表打到二极管挡位-&gt;万用表黑表笔接VDD，万用表红表笔接GPIO口，读取二极管压降，并记录钳位二极管压降，正常数值范围：0.5-0.7V左右钳位二极管压降，异常数值范围：小于0.4V</li>
  <li>一、nRF52x移植工程到自己layout的板子上需要做如下配置如果没有板载32.768kHz晶振，需要修改为内部晶振//使用内部晶振，推荐配置：应用程序至少8秒校准一次，温度每4秒变化0.5摄氏度#defineNRF_SDH_CLOCK_LF_SRC0//修改晶振为内部RC#defineNRF_SDH_CLOCK_LF_RC_CTIV16//设置每4秒校准一次，0.25*16=4秒，校准定时器间隔，单位为0.25秒，范围为0.25-31.75秒#defineNRF_SDH_CLOCK_LF_RC_TEMP_CTIV2//如果温度恒定则设备可以（16*0.25）*2=8秒校准一次，即每4秒温度变化0.5摄氏度。#defineNRF_SDH_CLOCK_LF_ACCURACY1//设置晶振精度为500ppm如果没有串口可以打印log，需要开启rtt打印log#defineNRF_LOG_BACKEND_RTT_ENABLED1//开启rttlog#defineNRF_LOG_DEFAULT_LEVEL4//开启debug模式如果串口RX引脚悬空且没有配置上拉电阻则需要注释掉此部分代码//APP_ERROR_HANDLER(p_event-&gt;data.error_communication);如果使用了复位脚作为普通IO口，需注释掉对应宏定义-&gt;完全擦除芯片-&gt;重新烧录程序修改宏定义CONFIG_GPIO_AS_PINRESET-&gt;xCONFIG_GPIO_AS_PINRESET/*ConfigureGPIOpadsaspPinResetpinifPinResetcapabilitiesdesired.IfCONFIG_GPIO_AS_PINRESETisnotdefined,pinresetwillnotbeavailable.OneGPIO(seeProductSpecificationtoseewhichone)willthenbereservedforPinResetandnotavailableasnormalGPIO.*/#ifdefined(CONFIG_GPIO_AS_PINRESET)if(((NRF_UICR-&gt;PSELRESET[0]&amp;UICR_PSELRESET_CONNECT_Msk)!=(UICR_PSELRESET_CONNECT_Connected&lt;&lt;UICR_PSELRESET_CONNECT_Pos))||((NRF_UICR-&gt;PSELRESET[1]&amp;UICR_PSELRESET_CONNECT_Msk)!=(UICR_PSELRESET_CONNECT_Connected&lt;&lt;UICR_PSELRESET_CONNECT_Pos))){nvmc_config(NVMC_CONFIG_WEN_Wen);NRF_UICR-&gt;PSELRESET[0]=RESET_PIN;nvmc_wait();NRF_UICR-&gt;PSELRESET[1]=RESET_PIN;nvmc_wait();nvmc_config(NVMC_CONFIG_WEN_Ren);NVIC_SystemReset();}#endif如果使用了NFC管脚作为普通IO口，需要注释掉对应宏定义-&gt;完全擦除芯片-&gt;重新烧录程序加入宏定义CONFIG_NFCT_PINS_AS_GPIOS如果是bootloader文件需要用nfc管脚，则需要查看文件system_nrf52.c中，函数voidSystemInit(void)中是否有如下代码，如果没有则要自己加入：/*ConfigureNFCTpinsasGPIOsifNFCTisnottobeusedinyourcode.IfCONFIG_NFCT_PINS_AS_GPIOSisnotdefined,twoGPIOs(seeProductSpecificationtoseewhichones)willbereservedforNFCandwillnotbeavailableasnormalGPIOs.*/#ifdefined(CONFIG_NFCT_PINS_AS_GPIOS)&amp;&amp;defined(NFCT_PRESENT)if((NRF_UICR-&gt;NFCPINS&amp;UICR_NFCPINS_PROTECT_Msk)==(UICR_NFCPINS_PROTECT_NFC&lt;&lt;UICR_NFCPINS_PROTECT_Pos)){nvmc_config(NVMC_CONFIG_WEN_Wen);NRF_UICR-&gt;NFCPINS&amp;=~UICR_NFCPINS_PROTECT_Msk;nvmc_wait();nvmc_config(NVMC_CONFIG_WEN_Ren);NVIC_SystemReset();}#endif二、nRF52x移植工程到不同的官方开发板上需要做如下配置可以配置的开发板有以下几种：BOARD_PCA10056BOARD_PCA10100BOARD_PCA10040可以配置的芯片型号有以下几种：NRF52805_XXAANRF52810_XXAANRF52811_XXAANRF52820_XXAANRF52832_XXAANRF52833_XXAANRF52840_XXAA修改工程到不同开发板需要做以下更改修改芯片型号为对应的芯片修改板子为对应的板子调整芯片ROM起始地址与大小RAM起始地址与大小参考文件：MemorylayoutWhenaddingabootloadertoyourdevice,youmustbeawareofwhereinthedevicememorythedifferentfirmwarecomponentsarelocated.ThefollowingtableshowsthememorylayoutforthedifferentchipswithcurrentSoftDevices:ThefollowingfigureshowsthedefaultmemorylayoutfornRF52devices,wherenRF52832hasaflashsizeof512kB,nRF52840hasaflashsizeof1024kB,nRF52810hasaflashsizeof192kB,andnRF52833hasaflashsizeof512kB:Note:Thesizeofthebootloaderisfixedforthelifetimeofthedevice.Thisisbecausethelocation(MBR_BOOTLOADER_ADDR)thatstoresthestartaddressofthebootloaderisnot(safely)updateable.SeetheSoftDeviceSpecificationformoreinformation.nRF52811开发需要做如下配置：参考文件：DevelopingfornRF52811nRF52820开发需要做如下配置：参考文件：DevelopingfornRF52820nRF52805开发需要做如下配置：参考文件：[DevelopingfornRF52805SDK_v17.0.0_nRF52805_Patch.zip</li>
  <li>一、nRF9160常用prj.conf配置介绍nRF9160通过prj.conf配置网络模式为：CAT-M模式CONFIG_LTE_NETWORK_MODE_LTE_M=yCONFIG_LTE_NETWORK_MODE_LTE_M_GPS=ynRF9160通过prj.conf配置网络模式为：CAT-NB模式CONFIG_LTE_NETWORK_MODE_NBIOT=yCONFIG_LTE_NETWORK_MODE_NBIOT_GPS=yInnRFConnectSDKversions&gt;=2.1.0nRF9160通过prj.conf配置启用modemlogCONFIG_NRF_MODEM_LIB_TRACE=yInnRFConnectSDKversions1.5.0-2.0.0nRF9160通过prj.conf配置启用modemlogCONFIG_NRF_MODEM_LIB_TRACE_ENABLED=yInnRFConnectSDKversionsbefore1.5.0nRF9160通过prj.conf配置启用modemlogCONFIG_BSD_LIBRARY_TRACE_ENABLED=ynRF9160通过prj.conf配置不需要服务器回复最后一个ackCONFIG_UDP_RAI_ENABLE=nCONFIG_LTE_RAI_REQ_VALUE=“4”nRF9160通过prj.conf配置进入PSM模式CONFIG_UDP_PSM_ENABLE=y##设置PSM唤醒间隔30s，需要卡支持设置此参数，否则设置无效，进入PSM模式后，PSM周期仍为卡原始设置CONFIG_LTE_PSM_REQ_RPTAU=“10000001”##设置PSM唤醒后活动时间2秒CONFIG_LTE_PSM_REQ_RAT=“00000001”nRF9160通过prj.conf配置进入eDRX模式CONFIG_UDP_EDRX_ENABLE=n##设置EDRX周期为20.48s需要卡支持设置此参数，否则设置无效，进入EDRX模式后，EDRX周期仍为卡原始设置#CONFIG_LTE_EDRX_REQ_VALUE_LTE_M=“0010”##设置EDRX周期为20.48s需要卡支持设置此参数，否则设置无效，进入EDRX模式后，EDRX周期仍为卡原始设置CONFIG_LTE_EDRX_REQ_VALUE_NBIOT=“0010”nRF9160按键唤醒时进入低功耗配置CONFIG_GPIO_NRF_INT_EDGE_USING_SENSE=y二、nRF160常用AT指令介绍nRF9160所有调制解调器数据恢复出厂设置AT%XFACTORYRESET=0nRF9160查询硬件版本AT%HWVERSION%HWVERSION:nRF9160SICAB0AOKnRF9160进入离线模式(关闭射频暂时降低功耗)AT+CFUN=44nRF9160设置网络模式为：CAT-NBAT%XSYSTEMMODE=0,1,0,0nRF9160设置网络模式为：CAT-MAT%XSYSTEMMODE=1,0,1,0nRF9160查询sim卡号AT%XICCIDnRF9160查询sim卡识别码AT+CIMInRF9160查询pin码解锁剩余次数AT+CPINR=“SIMPIN”nRF9160查询IP地址AT+CGDCONT?nRF9160设置支持解析域名AT%XEPCO=0CONFIG_LTE_LEGACY_PCO_MODE=y或CONFIG_PDN=yCONFIG_PDN_LEGACY_PCO=ynRF9160设置发送完数据后释放网络，不需要回复（快速进入省电模式）AT%XRAI=4nRF9160锁频段指令设置锁频B4（或其他频段发送AT指令：AT%XBANDLOCK=2,“1000”）nRF9160设置非信令模式测试指令接收测试：打开%XRFTEST=0,1,1,21400,-65,1%XRFTEST:-17002OKNote:-17002/256=-66.4dBm%XRFTEST=1,1,5,8300,17,1,1,6,0,0,3,3,0%XRFTEST:271OK接收测试：关闭%XRFTEST=0,0OK发射测试：打开%XRFTEST=1,1,5,8300,17,1,1,6,0,0,3,3,0%XRFTEST:271OK发射测试：关闭%XRFTEST=1,0OK三、nRF9160所有AT指令介绍通用at指令nRF9160查询模块厂商AT+CGMINordicSemiconductorASAOKnRF9160查询模块型号AT+CGMMnRF9160-SICAOKnRF9160查询模块modem版本AT+CGMRmfw_nrf9160_1.1.1OKnRF9160查询模块IMEIAT+CGSN352656100367872OKnRF9160查询软件版本AT%SHORTSWVER%SHORTSWVER:nrf9160_1.1.2OKnRF9160查询硬件版本AT%HWVERSION%HWVERSION:nRF9160SICAB0AOKnRF9160查询UUIDAT%XMODEMUUID%XMODEMUUID:25c95751-efa4-40d4-8b4a-1dcaab81fac9OKnRF9160设置ODISAT+ODIS=“HDID01”,“HDMAN01”,“HDMOD01”,“HDSW01”OKnRF9160查询ODISAT+ODIS?+ODIS:“HDMAN01”,“HDMOD01”,“HDSW01”OKnRF9160启用ODISNTF通知AT+ODISNTF=1OKnRF9160读取二维码序列号IDAT%2DID%2DID:“F1413BQF072303”OK移动终端modem控制与状态指nRF9160禁用射频发射电路、LTE服务、GNSS服务，并保现有设置到NVM。AT+CFUN=0OKnRF9160使能射频发射电路与并依据%XSYSTEMMODE设定配置LTE服务、GNSS服务。AT+CFUN=1OKnRF9160仅仅开启接收功能，用于评估与%CONEVAL连接AT+CFUN=2OKnRF9160进入飞行模式，禁用射频发射和接收电路，禁用LTE和GNSS服务AT+CFUN=4OKnRF9160禁用LTE服务，不关闭GNSS服务AT+CFUN=20OKnRF9160使能LTE服务，但不改变GNSS服务AT+CFUN=21OKnRF9160不关闭LTE服务，禁用GNSS服务AT+CFUN=30OKnRF9160不改变LTE服务，使能GNSS服务AT+CFUN=31OKnRF9160停用UICCAT+CFUN=40OKnRF9160激活UICCAT+CFUN=41OKnRF9160不关闭UICC情况下设置设备为飞行模式AT+CFUN=44OKnRF9160开启射频开关状态查询AT+CFUN?+CFUN:1OKnRF9160列出所有可用的AT指令列表AT+CLACAT+CFUNAT+COPS…OKnRF9160modem激活时返回接收到信号质量AT+CESQ+CESQ:99,99,255,255,31,62OK0rsrq0–RSRPnRF9160订阅扩展信号质量AT+CESQ=1+CESQ:99,99,255,255,255,255OKnRF9160读取2G和3G信号质量AT+CSQ+CSQ:99,99OKnRF9160列出支持的信号质量AT+CSQ=?+CSQ:(99),(99)OKnRF9160读取信噪比质量AT%XSNRSQ=1OKnRF9160读取信噪比质量AT%XSNRSQ?%XSNRSQ:39,168,0OKnRF9160订阅信噪比质量AT%XSNRSQ=1OKnRF9160检查设备活动状态AT+CPAS+CPAS:0OKnRF9160启用服务和消息指示灯AT+CIND=1,0,1OKnRF9160读取指示灯状态AT+CIND?+CIND:1,0,1OKnRF9160读取当前IPV6地址格式AT+CGPIAF?+CGPIAF:1,1,1,0OKnRF9160读取当前频段AT%XCBAND%XCBAND:13OKnRF9160返回支持的频段列表AT%XCBAND=?%XCBAND:(1,2,3,4,12,13)OKnRF9160读取相邻基站RSRPAT%NBRGRSRPOKOKnRF9160设置操作模式48小时存储到NVM，modem关闭时才可以使用此指令AT+CEMODE=0OK0–PSmode2ofoperation2–CS/PSmode2ofoperationnRF9160锁定频段band4AT%XBANDLOCK=1,“1000”OKnRF9160设置运行频段为band4band13AT%XBANDLOCK=2,“1000000001000”OK0–Removebandlocks1–Setpermanentbandmask2–SetruntimebandmasknRF9160读取频段AT%XBANDLOCK?%XBANDLOCK:“”,“0000000000000000000000000000000000000000000000000000000000000000000000000001000000001001”OKnRF9160设置模块功耗级别AT%XDATAPRFL=1OK&lt;power_level&gt;0–Ultra-lowpower1–Lowpower2–Normal3–Performance4–HighperformancenRF9160读取模块功耗级别AT%XDATAPRFL?AT%XDATAPRFL:2OKnRF9160启动连通性统计AT%XCONNSTAT=1OKnRF9160停止连通性统计AT%XCONNSTAT=0OKnRF9160读取连通性统计AT%XCONNSTAT?%XCONNSTAT=2,3,45,60,708,650OKnRF9160读取电池供电电压AT%XVBAT%XVBAT:3600OKnRF9160订阅电池电压过低通知AT%XVBATLVL=1OK%XVBATLOWLVL:3700nRF9160设置低压报警阈值AT%XVBATLOWLVL?%XVBATLOWLVL:3500OKnRF9160设置3000mv下电警告AT%XPOFWARN=1,30OKnRF9160客户生产完成，预防modem降级指令禁用%XRFTEST指令AT%XPRODDONEOKAT%XPRODDONE=0OK%XRFTEST指令可用AT%XPRODDONE=1OK0–Permanentlydisable%XRFTESTand%XEMPR1–Leave%XRFTESTand%XEMPRusablenRF9160订阅温度通知AT%XTEMP=1OK%XTEMP:1,37%XTEMP:2,56%XTEMP:3,91nRF9160显示当前modem温度AT%XTEMP?%XTEMP:50OKnRF9160高温阈值设置AT%XTEMPHIGHLVL=60OKnRF9160高温阈值读取AT%XTEMPHIGHLVL?%XTEMPHIGHLVL:60OKnRF9160设置UTC时区AT+CCLK=“18/12/06,22:10:00+08”OKnRF9160读取UTC时区AT+CCLK?+CCLK:“18/12/06,22:10:00+08”OKnRF9160使能调制解调器跟踪AT%XMODEMTRACE=1,1OKOperation0–Deactivatetraces1–Activatepredefinedtraceset2–Activatetracebitmap.TobeusedonlyonrequestbyNordiccustomersupport.3–Readtracebitmap.TobeusedonlyonrequestbyNordiccustomersupport.&lt;set_id&gt;Integer.Predefinedtracesetidentifier.1–Coredumponly2–Generic3–LWM2M4–IPonly5–LWM2M_GenericnRF9160禁止调制解调器跟踪AT%XMODEMTRACE=0OKnRF9160CAT-NB模式启用短信回退功能AT%XSMSFALLBACK=1OKnRF9160设置modem工作模式nRF9160启用CAT-M和GNSS模式AT%XSYSTEMMODE=1,0,1,0OKnRF9160启用CAT-NB和GNSS模式AT%XSYSTEMMODE=0,1,1,0OK&lt;LTE_M_support&gt;0–LTE-Mnotsupported1–LTE-Msupported&lt;NB_IoT_support&gt;0–NB-IoTnotsupported1–NB-IoTsupported&lt;GNSS_support&gt;0–GNSSnotsupported1–GNSSsupported&lt;LTE_preference&gt;0–Nopreference.InitialsystemselectionisbasedonhistorydataandUniversalSubscriberIdentityModule(USIM).v1.1.xv1.2.xv1.3.x1–LTE-Mpreferred.v1.3.x2–NB-IoTpreferred.v1.3.x3–Networkselectionprioritiesoverridesystempriority,butifthesamenetworkorequalprioritynetworksarefound,LTE-Mispreferred.v1.3.x4–Networkselectionprioritiesoverridesystempriority,butifthesamenetworkorequalprioritynetworksarefound,NB-IoTispreferred.v1.3.xNote:If&lt;LTE_preference&gt;issettoanon-zerovalue,&lt;LTE_M_support&gt;or&lt;NB_IoT_support&gt;orbothmustbeset.nRF9160读取modem工作模式AT%XSYSTEMMODE?%XSYSTEMMODE:1,0,0,0OKnRF9160设置分页时间窗口PagingTimeWindow(PTW).AT%XPTW=4,“1000”OKnRF9160查询分页时间窗口PagingTimeWindow(PTW).AT%XPTW?%XPTW:4,“0110”%XPTW:5,“1110”OK&lt;Requested_ptw_value&gt;String.Halfabytein4-bitformat.ThePTWvaluereferstobitsfrom8to5ofoctet3oftheeDRXparametersinformationelement(see3GPPTS24.008,subclause10.5.5.32).Optional.Ifnotpresent,thevalueoftherequestedAcT-typeisresettothemanufacturer-specificdefault.LTE-MmodeBit4321–PTWlength0000–1.28seconds0001–2.56seconds0010–3.84seconds0011–5.12seconds0100–6.4seconds0101–7.68seconds0110–8.96seconds0111–10.24seconds1000–11.52seconds1001–12.8seconds1010–14.08seconds1011–15.36seconds1100–16.64seconds1101–17.92seconds1110–19.20seconds1111–20.48secondsNB-IoTmodeBit4321–PTWlength0000–2.56seconds0001–5.12seconds0010–7.68seconds0011–10.24seconds0100–12.8seconds0101–15.36seconds0110–17.92seconds0111–20.48seconds1000–23.04seconds1001–25.6seconds1010–28.16seconds1011–30.72seconds1100–33.28seconds1101–35.84seconds1110–38.4seconds1111–40.96secondsnRF9160NB-IoT模式下所有频段下功率降低1dbAT%XEMPR=0,0,2OKnRF9160LTE-M模式下频段5和8降低1db频段13降低0.5dbAT%XEMPR=1,3,5,2,8,2,13,1OKnRF9160删除现有配置AT%XEMPROKnRF9160写入内容到文件写入GNSS年历到文件AT%XFILEWRITE=1,“f0ea0200312a080000000031…”,”bf38c845eab79f459f7b3ef4393f1a2860d309952832a0073b990f12a7274e64”OKnRF9160覆盖增强模式通知订阅未经请求的CE通知命令AT+CEINFO=1OKnRF9160读取CE模式信息+CEINFO:1,1,C,5,3,-50,10OKnRF9160所有调制解调器数据恢复出厂设置AT%XFACTORYRESET=0nRF9160用户配置的数据恢复出厂设置AT%XFACTORYRESET=1nRF9160订阅modem睡眠通知睡眠最短时间为60s，睡眠结束前1秒发送通知AT%XMODEMSLEEP=1,1000,60000PSM持续时间为320小时的通知%XMODEMSLEEP:1,1152000000nRF9160TAU周期性通知示例，最短指示周期30秒，在TAU之前2秒发送通知AT%XT3412=1,2000,30000nRF9160国别信息优化下面的命令示例写入两个国家元素。在第一个country元素中，是LTEM，是244，是3，是1207。在第二个country元素中，是NB-loT，是212，是20，是6150，是13，没有具体的:AT%XCOUNTRYDATA=1,”4,244,3,1207”,“5,242,20,6175,13,0”OK从modem中删除国家数据示例AT%XCOUNTRYDATA=0OKnRF9160读取国家数据的命令示例如下:AT%XCOUNTRYDATA?%XCOUNTRYDATA:”4,244,3,1207”,“5,242,20,6175,13,5180”nRF9160移动设备(ME)过热，因此调制解调器被禁用:%MDMEV:MEOVERHEATEDnRF9160电池电压低，因此调制解调器被禁用:%MDMEV:MEBATTERYLOWnRF9160调制解调器表示正在进行的光搜索状态:%MDMEV:SEARCHSTATUS1nRF9160Modem表示搜索完成状态:%MDMEV:SEARCHSTATUS2nRF9160调制解调器检测到复位回路:%MDMEV:RESETLOOPnRF9160订阅调制解调器通知的命令示例如下:AT%MDMEV=1OKnRF9160开始邻近单元格测量的命令示例如下:AT%NCELLMEASOK下面的通知示例表示完成的测量。结果包含服务单元和两个相邻单元:%NCELLMEAS:0,“00011B07”,“26295”,“00B7”,10512,2300,7,63,31,150344527,2300,8,60,29,0,2400,11,55,26,184,9034nRF9160开始邻居单元格测量并成功停止测量，命令示例如下:AT%NCELLMEASOKAT%NCELLMEASSTOP%NCELLMEAS:1OKnRF9160下面的命令示例开始邻近的单元测量并试图停止测量，但是在给出stop命令之前测量已经完成。例如，响应可以包含服务小区和两个相邻小区:AT%NCELLMEASOKAT%NCELLMEASSTOP%NCELLMEAS:0,“00011B07”,“26295”,“00B7”,2300,7,63,31,2300,8,60,29,0,2400,11,55,26,0OKnRF9160当邻居小区测量命令&amp;NCELLMEAS已经给出，但调制解调器由于其他优先级活动尚未开始测量时，停止邻居小区测量的命令示例如下:AT%NCELLMEASOKAT%NCELLMEASSTOPOKnRF9160请求预评估连接的命令示例如下:AT%CONEVAL%CONEVAL:0,1,5,8,2,14,“011B0780”,“26295”,7,1575,3,1,1,23,16,32,130OK引脚配置相关at指令nRF9160启用GPS时设置COEX0为1(关闭GPS时设置O)为例。COEXO不用于其他频率(或LTE):AT%XCOEX0=1,1,1570,1580OKnRF9160以启用GPS或LTE频率为600-800MHz或2000-2180MHz时，COEX0设置为1为例:AT%XCOEX0=3,1,1570,1580,1,2000,2180,1,600,800OKnRF9160如果命令不带任何参数，则删除前面写的值:AT%XCOEX0OKnRF9160下面的命令示例将7个范围写入设备的RAM:AT%XMAGPIO=1,1,1,7,1,746,803,2,698,746,2,1710,2200,3,849,894,4,894,960,6,803,849,7,1574,1577OKnRF9160下面的命令示例将三个范围写入设备的RAM:AT%XMAGPIO=1,1,1,3,0,1574,1577,1,705,747,6,748,804OKnRF9160删除前面写的值的命令示例如下:AT%XMAGPIOOKnRF9160下面的命令示例返回存储的配置:AT%XMAGPIO?AT%XMAGPIO:1,1,1,3,0,1574,1577,1,705,747,6,748,804OKnRF9160read命令返回使用&amp;XMIPIRFFEDEV命令为设备提供的介绍信息，以及在8XMIPIRFFECTRL命令中提供的特定于阶段的配置。没有•xmipirffectrl的专用*读取命令。响应的语法:%XMIPIRFFEDEV?%XMIPIRFFEDEV:&lt;dev_id&gt;,&lt;def_usid&gt;,&lt;prod_id&gt;,&lt;man_id&gt;,&lt;pm_trig&gt;INIT:ON:OFF:PWROFF:OKnRF9160如果前面给出了一个有效的&amp;XMIPIRFFEDEV命令，那么“%XMIPIRFFEDEV”行的读响应参数和它们的描述在第91页的Set命令中定义。否则，该行为空。后面的特定于阶段的行(INIT、ON、OFF、PWROFF)包含为该阶段提供的参数，或者为空。在下面的命令示例中，给出了以下命令:AT%XMIPIRFFEDEV=1,7,171,331,184OKAT%XMIPIRFFECTRL=1,1,1,28,56,6,1,2,2,3,750,3,8,850,18,9,1000,20,12,1700,35,19,1900,37,25,2200OKnRF9160在以下命令示例中，read命令返回结果如下:AT%XMIPIRFFEDEV?%XMIPIRFFEDEV:1,7,171,331,184INIT:ON:1,1,1,28,56,6,1,2,2,3,750,3,8,850,18,9,1000,20,12,1700,35,19,1900,37,25,2200OFF:PWROFF:OKnRF9160只删除ON阶段的配置:AT%XMIPIRFFECTRL=&lt;dev_id&gt;,1,0,0nRF9160删除PWROFF阶段配置的示例如下:AT%XMIPIRFFECTRL==&lt;dev_id&gt;,3,0nRF9160下面的命令示例将ANT输入定向到AUX输出:AT%XANTCFG=1OKnRF9160删除上述配置的命令示例如下:AT%XANTCFGOKnRF9160下面的命令示例返回当前激活的配置:AT%XANTCFG?%XANTCFG:1OKnRF9160设置COEX2引脚中间定时的命令示例如下:AT%XCOEX2=2OKnRF9160以读取COEX2引脚的当前配置为例。AT%XCOEX2?%XCOEX2:2OK域名与包配置相关AT指令nRF9160配置APN示例AT+CGDCONT=1,“IP”,“IOT_apn”OKnRF9160读取已经配置的APN示例AT+CGDCONT?+CGDCONT:0,“IP”,“internet”,“10.0.1.1”,0,0+CGDCONT:1,“IP”,“IOT_apn”,“10.0.1.2”,0,0OKnRF9160订阅CGEV通知的命令示例如下:AT+CGEREP=1OKnRF9160读取当前模式的命令示例如下:AT+CGEREP?+CGEREP:1,0OKnRF9160下面的命令示例列出了支持的模式和缓存设置:AT+CGEREP=?+CGEREP:(0,1),(0)OKnRF9160下面的通知示例显示了初始的PDN连接被激活:+CGEV:MEPDNACT0nRF9160设备与网络分离的通知示例如下:+CGEV:MEDETACHnRF9160下面的通知示例显示了由具有临时有效性的节流引起的限制。+CGEV:RESTR2,2nRF9160使用实例激活配置了CID1的承载:AT+CGACT=1,1OKnRF9160下面的命令示例返回一个状态连接列表:AT+CGACT?+CGACT:0,1+CGACT:1,1OKnRF9160下面的命令示例返回支持的状态列表:AT+CGACT=?+CGACT:(0,1)OKnRF9160请求分配一个新的上下文标识符的命令示例如下:AT%XNEWCID?%XNEWCID:2OKnRF9160将上下文标识符映射为PDNID0的示例如下:AT%XGETPDNID=0%XGETPDNID:1OKnRF9160下面的命令示例返回一个带有Qos参数的上下文列表:AT+CGEQOSRDP+CGEQOSRDP:0,0,,+CGEQOSRDP:1,2,,+CGEQOSRDP:2,4,,,1,65280000OKnRF9160下面的命令示例返回上下文1的IP地址:AT+CGPADDR=1+CGPADDR:1,“10.0.0.130”,“1050:0000:0000:0000:0005:0600:300c:326b”OKnRF9160下面的命令示例返回一个定义的值列表:AT+CGPADDR=?+CGPADDR:(0,1)OKnRF9160初始PDN连接读取动态参数的示例如下:AT+CGCONTRDP=0+CGCONTRDP:0,,“internet”,””,””,“10.0.0.1”,“10.0.0.2”,,,,,1028OKnRF9160执行EPS连接的命令示例如下:AT+CGATT=1OKnRF9160读取EPSattach状态的命令示例如下:AT+CGATT?+CGATT:1OKnRF9160下面的命令示例返回支持的状态列表:AT+CGATT=?+CGATT:(0,1)OKnRF9160选择节能优先级的命令示例如下:AT+CEPPI=1OKnRF9160下面的命令示例列出了系统支持的节能参数:AT+CEPPI=?+CEPPI:(0,1)nRF9160订阅E-UTRA信号质量通知的命令示例如下:AT%XPCO=1OK下面是一个关于FFOOh容器的PCO通知的例子:%XPCO:65280,“A1B1C1D1”nRF9160禁用ePCO并选择PCO的命令示例如下域名解析配置:AT%XEPCO=0OKnRF9160读取ePCO/PCO使用状态的命令示例如下:AT%XEPCO?%XEPCO:1OKnRF9160下面的命令示例为读取APN类3:AT%XAPNCLASS=0,3%XAPNCLASS:3,“VZWAPN”,“IPV4V6”OKnRF9160使用默认上下文标识符0表示modem无法解析IPv6地址:AT%XIPV6FAIL=0,1OKnRF9160设置CID=1context的认证参数示例如下:AT+CGAUTH=1,1,“username”,“password”OKnRF9160启用3级指示的命令示例如下:AT+CSCON=3OK以下是一个3级相关的主动提示示例:+CSCON:1,7,4nRF9160读取当前信令连接状态时，出现如下响应，表示不允许主动提示，modem处于空闲状态:AT+CSCON?+CSCON:0,0OKnRF9160当显示如下信息时，表示开启主动提示，modem模式为1，已连接E-UTRAN，且无线接入类型为E-UTRANFDD:AT+CSCON?+CSCON:3,1,7,4OKnRF9160下面的命令示例返回支持的值:AT+CSCON=?+CSCON:(0,1,2,3)OKnRF9160禁用InternetAPN的示例如下:AT%XAPNSTATUS=0,“internet”nRF9160使用InternetAPN的示例如下:AT%XAPNSTATUS=1,“internet”nRF9160下面的命令示例读取禁用APNS的列表:AT%XAPNSTATUS?%XAPNSTATUS:”APN_1”,”APN_2”OKnRF9160初始PDN连接时设置PDN为always-on的示例如下:AT%XPDNCFG=1OKnRF9160删除初始PDN连接的PDN设置为always-on的示例如下:AT%XPDNCFG=0OKnRF9160读取PDN初始配置的命令示例如下:AT%XPDNCFG?%XPDNCFG:1OKnRF9160以请求CID1为例。APN速率控制打开，仅剩一分钟:AT%APNRATECTRL=0,1%APNRATECTRL:0,1,1,60OKnRF9160以请求CID2为例。APN速率控制为OFF:AT%APNRATECTRL=0,2%APNRATECTRL:0,2,0OKnRF9160下面以请求配置APN速率控制为例进行说明。CID1和CID2配置APN速率控制:AT%APNRATECTRL=1%APNRATECTRL:1,1,10,180%APNRATECTRL:1,2,100,60OKnRF9160下面以请求配置APN速率控制为例进行说明。只有CIDO处于激活状态。APN速率控制未配置:AT%APNRATECTRL=1%APNRATECTRL:1,0,0OK网络服务相关AT指令nRF9160选择自动网络选择的命令示例如下:AT+COPS=0OKnRF9160手动选择网络24407:AT+COPS=1,2,“24407”OKnRF9160读取当前选择模式和网络的命令示例如下:AT+COPS?+COPS:0,2,“26201”,7OKnRF9160下面的命令示例以字母数字格式读取当前的选择模式和网络:AT+COPS?+COPS:0,0,“RADIOLINJA”,7OKnRF9160手动网络搜索的示例如下:AT+COPS=?+COPS:(2,””,””,“26201”,7),(1,””,””,“26202”,7)OKnRF9160手动网络搜索的示例如下:AT%COPS=?%COPS:(2,””,””,“26201”,7),(1,””,””,“26202”,7)OKnRF9160以开启省电模式和设置定时器值为例。设置Periodic-TAUtimer为10分钟，Active-Time为1分钟:AT+CPSMS=1,””,””,“10101010”,“00100001”OKnRF9160禁用省电模式命令示例如下:AT+CPSMS=0OKnRF9160禁用省电模式并设置timer为默认值的命令示例如下:AT+CPSMS=OKnRF9160读取当前省电模式设置的命令示例如下:AT+CPSMS?+CPSMS:1,,,“10101111”,“01101100”OKnRF9160使用实例启用eDRX并设置请求的eDRX值:AT+CEDRXS=1,4,“1000”OKnRF9160使用2时的主动通知:+CEDRXP:4,“1000”,“0101”,“1011”OKnRF9160读取请求的eDRX值的示例如下:AT+CEDRXS?+CEDRXS:4,“0001”OKnRF9160读取支持的参数值的命令示例如下:AT+CEDRXS=?+CEDRXS:(0-3),(4-5),(“0000”-“1111”)OKnRF9160读取eDRX参数的示例如下:AT+CEDRXRDP+CEDRXRDP:4,“0011”,“0010”,“1001”OKnRF9160下面的命令示例读取操作符名称:AT+COPNOKnRF9160订阅级别为2的通知命令示例如下:AT+CEREG=2OKnRF9160未经请求的通知级别1，试图附加:+CEREG:2nRF9160第2级主动通知，注册:+CEREG:1,“002F”,“0012BEEF”,7nRF9160读取当前注册状态的命令示例如下:AT+CEREG?+CEREG:2,1,“002F”,“0012BEEF”,7OKnRF9160下命令示例显示了支持的未经请求的结果代码:AT+CEREG=?+CEREG:(0-5)OKnRF9160订阅通知的命令示例如下:AT%XOPNAME=1OKnRF9160一个关于完整和短操作符名称的主动通知示例:%XOPNAME:“88D6B23CAD7FBB41D7B4BCCC2ECFE7”,“8B56FD15”,“556776”nRF9160一个短操作符名称的主动通知示例:%XOPNAME:,“8B56FD15”,“556776”nRF9160订阅通知的命令示例如下:AT%XTIME=1OK一个包含所有参数的网络时间主动通知示例:%XTIME:“08”,“81109251714208”,“01”一个不带本地时区的网络时间的主动通知示例:%XTIME:,“81109251714208”,“01”nRF9160下面的命令示例设置RAI，当应用程序有一个数据包要发送，并且不需要网络的响应时:AT%XRAI=4OKnRF9160例如:RAI，响应为“Controlplanenoresponse”:AT%XRAI?%XRAI:4OKnRF9160下面的命令示例返回操作员ID:AT%XOPERID%XOPERID:1OKnRF9160下面的命令示例读取调制解调器参数:v1.0。xv1.1.xAT%XMONITOR%XMONITOR:1,“EDAV”,“EDAV”,“26295”,“00B7”,7,4,“00011B07”,7,2300,63,39,””,“11100000”,“11100000”OKnRF9160调制解调器参数如下所示。xv1.3.xAT%XMONITOR%XMONITOR:1,“EDAV”,“EDAV”,“26295”,“00B7”,7,4,“00011B07”,7,2300,63,39,””,“11100000”,“11100000”,“00000000”OKnRF9160禁用网络时间支持的命令示例如下:AT%XNETTIME=0OKnRF9160网络时间支持命令示例如下:AT%XNETTIME?%XNETTIME:0OKnRF9160启用深度搜索支持的示例如下:AT%XDEEPSEARCH=1OKnRF9160下面的命令示例读取深度搜索可用性:AT%XDEEPSEARCH?%XDEEPSEARCH:1OKnRF9160触发深度搜索的命令示例如下:AT%XDEEPSEARCH=?AT%XDEEPSEARCHOKnRF9160设置Verizon运营商配置的命令示例如下:AT%XOPCONF=2OKnRF9160读取配置的操作符示例如下:AT%XOPCONF?AT%XOPCONF:2OKnRF9160启用RAI特性支持的命令示例如下:AT%RAI?%RAI:1OKnRF9160下面的命令示例设置了对MAC不活动监控、频率间连接模式和频率内RSRQ测量模式的支持:AT%REL14FEAT=1,0,0,0,1OKnRF91603GPPRelease14特性支持状态如下:AT%REL14FEAT?AT%REL14FEAT:1,0,0,0,1OKnRF9160下面的命令示例配置了一个没有可选参数&lt;time_to_final_sleep&gt;的范围类型搜索模式:AT%PERIODICSEARCHCONF=0,0,0,10,“0,60,3600,,600”OKnRF9160读取配置的命令示例如下:AT%PERIODICSEARCHCONF=1%PERIODICSEARCHCONF:0,0,10,“0,60,3600,,600”OKnRF9160下面的命令示例配置了一个带有可选&lt;time_to_final_sleep&gt;参数的范围类型搜索模式，以及另外一个带有三个sleep时间值的表类型搜索模式，当模式结束时，这些值将被循环:AT%PERIODICSEARCHCONF=0,1,0,10,“0,60,3600,300,600”,“1,60,120,3600”OKnRF9160下面的命令示例请求进行额外的搜索:AT%PERIODICSEARCHCONF=3OKnRF9160清除配置的命令示例如下:AT%PERIODICSEARCHCONF=2OKnRF9160在没有存储配置的情况下读取配置，示例如下:AT%PERIODICSEARCHCONF=1%PERIODICSEARCHCONF:OKnRF9160调制解调器为&amp;XDATAPRFL命令中定义的每个功率级别使用特定的周期性搜索模式。下面的命令对应于每个功率级别使用的搜索模式配置。它们是默认配置，任何特定的周期性单元搜索配置都将覆盖它们。超低功率:AT%PERIODICSEARCHCONF=0,0,0,1,“0,10,40,,5”,“1,300,600,1800,1800,3600”低功耗:AT%PERIODICSEARCHCONF=0,0,0,1,“0,10,40,,5”,“1,300,600”正常:AT%PERIODICSEARCHCONF=0,0,0,1,“0,10,40,5,15”,“1,60,90,300”性能:AT%PERIODICSEARCHCONF=0,0,0,1,“0,10,40,5,15”,“1,60,90”高性能:AT%PERIODICSEARCHCONF=0,0,0,1,“1,10”,“0,10,40,,15”移动终端终止错误nRF9160启用错误码的命令示例如下:AT+CMEE=1OKnRF9160读取当前错误码设置的命令示例如下:AT+CMEE?+CMEE:1OKnRF9160下面的命令示例返回支持的值:AT+CMEE=?+CMEE:(0,1)OKnRF9160启用CNEC_ESM错误码的示例如下:AT+CNEC=16OKnRF9160读取“+CNEC错误码”设置，同时使能CNEC_EMM和CNEC_ESM的示例如下:AT+CNEC?+CNEC:24OKnRF9160下面的命令示例返回+CNEC错误码设置值:AT+CNEC?+CNEC:(0,8,16,24)OKnRF9160modem存储的最新失败信息如下所示:AT+CEER+CEER:“SMS301”OK短信相关指令nRF9160设置消息格式为PDU模式的命令示例如下:AT+CMFG=0OKnRF9160读取当前消息格式的命令示例如下:AT+CMGF?+CMGF:0OKnRF9160支持的消息格式如下:AT+CMGF=?+CMGF:(0)OKnRF9160命令示例注册为移动终端短信和状态报告的客户端:AT+CNMI=3,2,0,1OKnRF9160下面的命令示例读取了如何指示新消息的配置:AT+CNMI?+CNMI:3,2,0,1,1OKnRF9160期望在之后的同一条命令中收到。不支持交互模式。PDU由十六进制数组成，每八位包含两个IRA字符。以“LTE短信测试”为例，发送地址为+358401234567，服务中心地址为+448888888:AT+CMGS=42069144888888F811000C9153481032547600000B20D4F29C9E769F4161D0BC3D07B5CBF379F89C769F416F7B590E62D3CB+CMGS:2OKnRF9160下面的示例返回一个收到的消息“正在Ite上测试短信”的通知，该消息来自+358401234567，服务中心地址+448888888:+CMT:“+358401234567”,28069144888888F8D4F29C9E769F4161D0BC3D07B5CBF379F89C769F416F7B590E62D3CBnRF9160下面的示例返回一个包含收件人地址、服务中心时间戳和邮件传递时间的传递状态通知:+CDS:25060C91534810325476171160316255001711603152120000OKnRF9160下面的命令示例确认接收到时间戳为06/11/207113:26:31的消息:AT+CNMA=1,9010017116031621300OKnRF9160test命令参数及其定义值如下:AT+CNMA=?+CNMA:(0-2)OKnRF9160下面的命令示例以文本模式发送新消息ACK:AT+CNMAOKnRF9160支持的下发状态如下所示:AT+CNMA=?+CNMA:(0-2)OKnRF9160配置使用的内存存储的命令示例如下:AT+CPMS=“MT”,“MT”,“MT”+CPMS:0,0,0,0,0,0OKnRF9160读取内存存储配置信息的示例如下:AT+CPMS?+CPMS:“MT”,0,0,“MT”,0,0,“MT”,0,0OKnRF9160支持的内存示例如下:AT+CPMS=?+CPMS:(“MT”),(“MT”),(“MT”)OKnRF9160选择电路交换短信服务的命令示例如下:AT+CGSMS=1OKnRF9160读取当前短信服务的命令示例如下:AT+CGSMS?+CGSMS:1OKnRF9160支持的短信服务示例如下:AT+CGSMS=?+CGSMS:(1)OKnRF9160以触发短信层发送RP-SMMA释放已满内存为例情况和接受回应:AT%XSMMAOK生产测试功能AT指令nRF9160在此命令之后，引脚状态被设置回正常(high-Z)。下面的命令示例设置MAGPIO引脚2为输入模式，并设置内部上拉。在此之后，在命令响应中读取和报告引脚状态。命令执行后，引脚状态恢复正常(高阻抗状态):AT%XANTDETMAGPIO=2%XANTDETMAGPIO:0OKnRF9160在Band1,2140.0MHz，-65dbm,NB-loT模式下开启射频接收器的示例如下:AT%XRFTEST=0,1,1,21400,-65,0%XRFTEST:-17002OKNote:−17002/256=−66.4dBmnRF9160禁用射频接收器的命令示例如下:AT%XRFTEST=0,0OKnRF9160在频段5、830.0MHz、+17dBm、NB-lot、BPSK、12音调、音调起始位置O、子载波间隔15kHz、系统带宽NB1、NB索引0、TXburst模式禁用的情况下，启用射频发射机的示例如下:AT%XRFTEST=1,1,5,8300,17,0,3,12,0,0,0,0,0%XRFTEST:271OKNote:271/16=16.9dBmnRF9160在频段5、830MHz、+17dBm、LTE-M、16QAM、6RB、RB起始位置O、子载波间距15kHz、系统带宽5MHz、NB索引3、TX突发模式禁用的情况下，启用射频发射机的示例如下:AT%XRFTEST=1,1,5,8300,17,1,1,6,0,0,3,3,0%XRFTEST:271OKnRF9160禁用射频发射机的命令示例如下:AT%XRFTEST=1,0OKnRF9160在频段5、830MHz、+17dBm、LTE-M、16QAM、6RB、RB起始位置O、子载波间距15kHz、系统带宽5MHz、NB索引3、启用TX突发模式的情况下，开启射频发射机的示例如下:AT%XRFTEST=1,1,5,8300,17,1,1,6,0,0,3,3,1OK禁用AFC的GPS信噪比测试示例如下:AT%XRFTEST=2,1,0,0%XRFTEST:514,-19968OKNote:514/16=32.125dBand−19968/256=−78dBm.nRF9160下面的dommand示例执行-80dbm的GPS信噪比测试。AFC校正是启用的，并使用以前的AFC测量或AFC设置的结果。而不是默认的接收频率设置为1575.0MHz:AT%XRFTEST=2,1,-80,1,15750%XRFTEST:312,-20480OKNote:312/16=19.5dBand-20480/256=-80dBm.nRF9160启用波段1,2140.0MHz，-65dbm,LTE-M模式下的RX信噪比测量和RF接收机，并启用AFC校正:AT%XRFTEST=3,1,1,21400,-65,1,1%XRFTEST:496,-17002OKNote:496/16=31dBand−17002/256=−66.4dBm.nRF9160测量频段1,2140.0MHz，-40dBm的AFC误差值的命令示例如下:AT%XRFTEST=4,1,1,21400,-40%XRFTEST:349,175OKnRF9160设置AFCerror值为349hz的命令示例如下:AT%XRFTEST=4,3,349,0OKnRF9160当=3时的响应语法:%XRFTEST:OKnRF9160当=3时，响应以毫伏为单位给出。下面的命令示例测量PA温度约为20.4摄氏度:AT%XRFTEST=10,1,0%XRFTEST:20355OKnRF9160下面的命令示例将所有引脚配置为输出，并将它们的状态设置为低:AT%XGPIOTEST=0,127,0%XGPIOTEST:OKnRF9160下面的命令示例将所有引脚设置为输入，并读取每个引脚的状态:AT%XGPIOTEST=1,127,127%XGPIOTEST:0x9OKnRF9160将AT命令配置同步并存储到调制解调器的NVM中:AT%XFSSYNCOKnRF9160以读取设备ID为1的MIPIRFFE设备的寄存器O为例:AT%XMIPIRFFEDBG=1,1,0%XMIPIRFFEDBG:0,2OKnRF9160写入值5，将MIPIRFFE设备的37注册到ID为1的设备上。AT%XMIPIRFFEDBG=1,0,37,5%XMIPIRFFEDBG:0,5OKnRF9160输入PIN1234命令示例如下:AT+CPIN=“1234”OKnRF9160下面的命令示例显示如何使用PIN响应检查是否需要PIN码代码是必需的:AT+CPIN?+CPIN:“SIMPIN”OKnRF9160下面的命令示例检查剩余的PIN条目:AT+CPINR=“SIMPIN”+CPINR:“SIMPIN”,3OKnRF9160禁用PIN码查询的命令示例如下:AT+CLCK=“SC”,0,””OKnRF9160当网络个性化服务不活跃时，检查网络个性化服务状态的示例如下:AT+CLCK=”PN”,2+CLCK:0OKnRF9160修改SIMPIN码的命令示例如下:AT+CPWD=“SC”,“1234”,“5678”OKnRF9160下面的命令示例返回支持的工具列表和密码长度:AT+CPWD=?+CPWD:(“SC”,8),(“P2”,8)OKnRF9160下面的命令示例创建了一个非永久的网络个性化:AT%XUSIMLCK=1,“PN”,“12345678”,0,“100.200”OKnRF9160取消网络个性化配置的命令如下:AT%XUSIMLCK=2,“PN”,“12345678”OKnRF9160禁用网络个性化:AT%XUSIMLCK=3,“PN”OKnRF9160该命令以非永久方式将设备锁定到第一个插入的USIM:AT%XUSIMLCK=4,“PS”,“12345678”,0OKnRF9160该命令将USIM个性化为IMSI100200777777777(MCC=100,MNC=200，其他数字为7)。设备PS永久锁定为密码“12345678”。在去人化之后，没有其他钥匙可以用于这个设施:AT%XUSIMLCK=1,“PS”,“12345678”,1,“100200777777777”OKnRF9160下面的命令示例为受限制的+CMD命令提供了鉴权访问:AT%XSUDO=28,“c2lnbmF0dXJl”;+CMD=…OKnRF9160写公钥的命令示例如下:AT%XPMNG=0,”—–BEGINPUBLICKEY—–…—–ENDPUBLICKEY—–”OKnRF9160读取公钥的命令示例如下:AT%XPMNG=2%XPMNG:“—–BEGINPUBLICKEY—–…—–ENDPUBLICKEY—–”OKnRF9160写根证书的命令示例如下:AT%CMNG=0,12345678,0,”—–BEGINCERTIFICATE—–MIIDSjCCA……bKbYK7p2CNTUQ—–ENDCERTIFICATE—–”OKnRF9160写客户端证书的命令示例如下:AT%CMNG=0,567890,1,”—–BEGINCERTIFICATE—–MIIBc464……bW9aAa4—–ENDCERTIFICATE—–”OKnRF9160写私钥的命令示例如下:AT%CMNG=0,123,2,”—–BEGINENCRYPTEDPRIVATEKEY—–MIICz……ukBu—–ENDENCRYPTEDPRIVATEKEY—–”,”abcdefg”OKnRF9160下面的命令示例通过指定标签和类型列出了单个项目:AT%CMNG=1,12345678,0%CMNG:12345678,0,“978C…02C4”OKnRF9160下面的命令示例列出了单个标签:AT%CMNG=1,12345678%CMNG:12345678,0,“978C…02C4”%CMNG:12345678,1,“1A8C…02BB”OKnRF9160下面的命令示例列出了所有存储的凭据:AT%CMNG=1%CMNG:12345678,0,“978C…02C4”%CMNG:567890,1,“C485…CF09”%CMNG:123,2,“92E1…8AC8”%CMNG:654321,3,“E0C9…511D”OKnRF9160读取标签为12345678的根证书的示例如下:AT%CMNG=2,12345678,0%CMNG:12345678,0,“978C…02C4”,“—–BEGINCERTIFICATE—–MIIBc464……bW9aAa4—–ENDCERTIFICATE—–”OKnRF9160删除标签为123的客户端证书的命令示例如下:AT%CMNG=3,123,1OKnRF9160下面的命令示例读取一个标签为4567的不存在的根证书。返回错误码513:AT%CMNG=2,4567,0+CMEERROR:513nRF9160请求认证令牌的命令示例如下:AT%ATTESTTOKEN%ATTESTTOKEN:“9aiUFOq7SOwtdPfEgdkPxV_vTYLoGeE0-gzV2e5c.jUfK3OpdVBVYWnsoaOjIZcSTAwdqQQJWrrY2Lnc”OKnRF9160下面的命令示例为TLS生成密钥。密钥存储到&lt;sec_tag&gt;11。&lt;key_type&gt;是客户端私钥，它包括可选的&lt;key_usage&gt;参数:AT%KEYGEN=11,2,0,,“101010000”%KEYGEN:“ckijfiok.jdiqhdn”OKnRF9160下面的命令示例为TLS生成密钥。密钥存储到&lt;sec_tag&gt;11。&lt;key_type&gt;是客户端私钥，它包括可选参数和&lt;key_usage&gt;:AT%KEYGEN=11,2,0,“O=NordicSemiconductor,L=Trondheim,C=no”,“101010000”%KEYGEN:“MIIBHDCBwAIBADBAMR0wGwYDVQQKDBROb3JkaWMgU2VtaWNvbmR1Y3RvcjESMBAGA1UEBwwJVHJvbmRoZWltMQswCQYDVQQGEwJubzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABAP6p4ZjYNG0FFdz5axZkbcQzfO8Fkzws4o2unhS5qqgON5BA6jj0TbHJ5imPbVXWNiDVCNc0us41NtL3TygDdqgHjAcBgkqhkiG9w0BCQ4xDzANMAsGA1UdDwQEAwIDqDAMBggqhkjOPQQDAgUAA0kAMEYCIQDnFWQl-x25qjEPBtLrvH5wwecrA5KmjUcK_b3eok5nmQIhALsSKRmuqDM3H09-q4R0MSpYprWZZp5iPjRMtZbjataH.0oRDoQEmoQRBIVhL2dn3hQlQUFAwQTYzQ7CAwwEaNJbawEELWCD7er2zKHc8yAMi8x-1jAuCEqaLmJ3PMZTHIYSrmIR0tlD7CDRaW–s0c7XA4pI3r9wWEAQOGVg5VejmHx9o_sF1RcGBMClw-MkN_wMrS2ryM8CdA427j96z_4wjLgBvejVnYGAl7qqL77qlEbBEzXOkLx4”OKnRF9160下面的命令示例生成背书密钥。密钥存储在&lt;sec_tag&gt;33中。&lt;key_type&gt;是背书私钥:AT%KEYGEN=33,8%KEYGEN:“vdofjihew.cnjeiwhfok”OKnRF9160下面的命令示例显示nRF9160调制解调器接收加密供应信息:%KEYINJECT=“2GCEQ6EBCqEFTS6b97seIkh_t5cLNhpYikK5miurjQrYHxWuPaA_LQFo5Qk2s9g3xO71g8ec-AVvKRyk4Gdo2DCRL9q3gGOZxgrYEN9R44F1WOdaGhnaypjtdNwqgu-Kv-6DlZRqyxKkSvrZLuOq3R6GdLPK2BZ5pQNYkeN8dIPhJujbA5Bb_bt_iUrlYA2jIF3MR395PDtd4BlTb4ikatVeoGDRKEBOBiiIKQBAiABIVgg8zFHgdz6a3LjQ2Nq7V-jMu9CM3KxI9XjPajLT8fOKGkiWCDi4YnIiCDQisIPWoCaucAnUUti4heazw1UMX3LR3X_ARCGC1A.0oRYH6MBJjoAAQAAULUTc_owres5hDTJSUsd4r46AAEAAQShBEMZAtP2WEAIQ9Gw3O2-ymC1_bMChHdYorwSPGSK7okxl9Xkj3V7JVrUW1UK7QeWM1ajtaxNYs7wJARQdeSmMbNTF6R0_VuD”%KEYINJECT:“2dn3gwVQ________RK2Afv__z-ihGIEA”OKnRF9160下面的命令示例创建了一个JWT:AT%JWT:0,3600,“ClientAuth”,“urn:server”nRF9160订阅UICC状态通知的命令示例如下:AT%XSIM=1OKnRF9160下面的通知示例表明UICC没有被初始化:%XSIM:0nRF9160下面的通知示例表示UICC初始化完成:%XSIM:1nRF9160下面的命令示例读取UICC状态。响应表示UICC初始化完成:AT%XSIM?%XSIM:1OKnRF9160下面的命令示例读取UICC状态。提示需要输入PIN码:AT%XSIM?%XSIM:0,1OKnRF9160读取IMSI字符串的命令示例如下:AT+CIMI284011234567890OKnRF9160请求USIM卡的ICCID的示例如下:AT%XICCID%XICCID:8901234567012345678FOKnRF9160读取SIM卡中存储的用户号码，示例如下:AT+CNUM+CNUM:,”+1234567891234”,145OKnRF9160读取禁止的PLMN列表的命令示例如下:AT+CRSM=176,28539,0,0,12+CRSM:144,0,“64F01064F040FFFFFFFFFFFF”OKnRF9160下面的命令示例执行MANAGECHANNEL命令打开逻辑通道。SIM卡返回通道号01，成功状态为9000:AT+CSIM=10,“0070000001”+CSIM:6,“019000”OKnRF9160下面的命令示例打开逻辑通道并选择GSMA通用eUICC测试配置文件中的IP多媒体服务标识模块(ISIM)应用程序:AT+CCHO=“A0000000871004FF49FF0589”+CCHO:2OKnRF9160关闭之前打开的逻辑通道的命令示例如下:AT+CCHC=2OKnRF9160下面的命令示例是Status命令，它返回通道上当前选择的AID:AT+CGLA=2,10,“80F2000100”+CGLA:32,“840CA0000000871004FF49FF05899000”OKnRF9160通过使用envelope命令SMS-pp数据下载，SMS已经收到并发送到UICC:%USATEV:SMSReceivenRF9160通过使用主动命令SENDSHORTMESSAGE发送UICC请求的短信:%USATEV:SMSSendnRF9160BIP通道连接进程已经按照UICC的要求通过使用主动命令OPENchannel启动:%USATEV:BIPConnectingnRF9160已成功完成BIP通道连接过程，提供UICC访问，例如SIMover-air(OTA)服务器:%USATEV:BIPConnectednRF9160BIP通道连接尝试失败或通道已被UICC通过使用主动命令CLOSEchannel关闭:%USATEV:BIPClosednRF9160已从UICC收到主动刷新命令，表明UICC内容已被更改:%USATEV:REFRESHRequested&lt;refresh_type&gt;nRF9160刷新命令完成，结果显示在&lt;refresh_result&gt;中:%USATEV:REFRESHEnd&lt;refresh_result&gt;nRF9160下面的命令示例订阅所有可用USAT事件的通知:AT%USATEV=1OKnRF9160下面的命令示例只订阅与BIP通道相关的USAT事件的通知:AT%USATEV=1,“001”OKnRF9160以下命令示例只订阅BIP通道和SMS相关USAT事件的通知:AT%USATEV=1,“101”OKnRF9160取消订阅所有USAT事件通知的命令示例如下:AT%USATEV=0OKnRF9160以下命令示例在BIP或REFRESH活动不进行时获取USAT信息:AT%USATINFO%USATINFO:0,0OKnRF9160以下命令示例获取正在进行REFRESH时的USAT信息:AT%USATINFO%USATINFO:1,0OKnRF9160当BIP通道连接到SIMOTA服务器时，接收USAT信息的示例如下:AT%USATINFO%USATINFO:0,2OKnRF9160使用OpensSL生成私钥和公钥:opensslecparam-nameprime256v1-genkey-noout-out[privatekeyPEMfile]opensslec-in[privatekeyPEMfile]-out[publickeyPEMfile]-puboutnRF9160使用AT命令写入公钥:AT%XPMNG=0,””OKnRF9160计算AT命令签名。a)为验证通过的AT命令创建AT命令文本文件。例如:%CMNG=0,1,0,”TESTROOTCERTIFICATE”nRF9160使用AT命令创建一个需要验证的摘要文件:%CMNG=0,1,0,”TESTROOTCERTIFICATE”nRF9160使用AT命令创建一个需要验证的摘要文件:opensslsha256-binary[ATcommandtextfile]&gt;[digestfile]nRF9160从摘要文件中创建一个OpenSSL签名文件:opensslpkeyutl-sign-in[digestfile]-out[signaturefile]-inkey[privatekeyPEMfile]nRF9160将signaturel转换为Base64格式:base64&lt;[signaturefile]&gt;[signaturebase64file]nRF9160写入经过身份验证的AT命令。“&amp;XSUDO”命令用于对“&amp;CMNG”命令进行鉴权。例如:AT%XSUDO=35,””;%CMNG=0,1,0,”TESTROOTCERTIFICATE”OK</li>
  <li>一：nRF9160做纯AT模块常用文档AT数据手册在线文档链接serial_lte_modem例程位置：ncs\v2.3.0\nrf\applications\serial_lte_modemserial_lte_modem例程AT指令集在线文档serial_lte_modem例程AT指令集本地文档：ncs\v2.3.0\nrf\applications\serial_lte_modem\docserial_lte_modem例程错误代码本地文档：ncs\v2.3.0\modules\lib\picolibc\newlib\libc\include\sys\errno.h二：nRF9160做纯AT模块开发步骤烧录相关证书，并验证烧录结果（AT+CFUN=4AT%CMNG=1）烧录最新modem固件：mfw_nrf9160_1.3.4.zip固件烧录最新hex固件：serial_lte_modem.hex固件插入sim卡，中国大陆需要自行购买NB卡测试（开发板中自带sim卡不能使用）。使用LTELinkMonitor测试nRFConnectforDesktop-&gt;LTELinkMonitor网盘下载地址三：烧录相关证书（如果使用TLSSSL等：CA.crtclient.crtclient.keysec_tag）通过LTELinkMonitor烧录证书打开LTELinkMonitor连接到nRF9160-DK发送AT指令：AT+CFUN=4，关闭射频切换到LTELinkMonitor-&gt;CERTIFICATEMANAGER选项卡点击Updatecertificates更新证书通过pynrfjprog脚本烧录证书四：烧录最新modem固件（mfw_nrf9160_1.3.1.zip）通过Programmer烧录modem固件通过pynrfjprog脚本烧录modem固件通过nrfjprog烧录modem固件nrfjprog–verify–programmfw_nrf9160_1.3.4.zip五：烧录最新hex固件（serial_lte_modem.hex）通过Programmer烧录hex固件通过批处理烧录hex固件六：使用LTELinkMonitor测试插入sim卡先连接上nRF9160-DK，发送下述AT指令查询射频开关状态：AT+CFUN?关闭射频：AT+CFUN=4设置模块为NB模式：AT%XSYSTEMMODE=0,1,0,0设置模块支持域名解析：AT%XEPCO=0保存已经设置的参数：AT+CFUN=0断开nRF9160-DK，再重新连接nRF9160-DK，可以看到以下测试结果</li>
  <li>一：NCS开发环境搭建必装的三个软件nRFConnectforDesktop：工具箱nRFCommandLineTools：命令行工具nRFConnectSDKpynrfjprogpython命令行工具网盘下载地址二：nRFConnectforDesktop常见安装问题不显示小工具列表，如下图所示：下载此文“.nrfconnect-apps.zip，并解压。在我的电脑中打开文件夹：%userprofile%复制解压后的文件夹“.nrfconnect-apps”覆盖%userprofile%目录中对应的“.nrfconnect-apps”文件夹，如下图所示：重新打开nRFConnectforDesktop就可以看到app列表安装nRFConnectforDesktop失败或提示缺少*.dll控件安装跟windows系统版本对应的命令行工具：“nRFCommandLineTools”，然后再重新打开nRFConnectforDesktop，如果不可用，再继续执行下边步骤。使用软件DirectXRepairV3.9给系统打补丁，然后重新安装nRFConnectforDesktop再打nRFConnectforDesktop。如果安装失败，可以复制别人安装好的“nRFConnectforDesktop”目录到自己电脑。三：ToolchainManager安装ncssdk常见问题如果网盘有ncsv2.5.0则可以：直接下载压缩包，然后解压到目录”D:\ncs\v2.5.0”。设置SETTINGS目录Installationdirectory到”D:\ncs”。如下图所示：将toolchains目录解压后覆盖目录”D:\ncs\toolchains\31f4403e35”如果想自己在ToolchainManager下载并安装“nRFConnectSDKv2.5.0”，且在ToolchainManager中总是安装一半失败，则可以采用如下方法：打开ToolchainManager找到ncsv2.5.0，点击install等待工具链接安装完成:“D:\ncs\toolchains\c57af46cb7”，如下图所示：打开ToolchainManager找到ncsv2.5.0，打开命令行工具Openbash，并执行”westinit-mhttps://github.com/nrfconnect/sdk-nrf–mrv2.5.0”，如果westinit…指令出错则需要删除文件夹：“D:\ncs\v2.5.0”中的文件重新执行westinit…指令。如下图所示：如果westinit…指令执行完毕且没有错误后，则再cd到nrf目录执行westupdate，如果更新过程中出现错误，则继续执行”westupdate”，直到没有报错，sdk包就完整下载下来了。如下图所示：如果想自己在ToolchainManager下载并安装“nRFConnectSDKv2.5.0”，且在ToolchainManager中总是安装一半失败，则可以采用如下方法：打开ToolchainManager找到ncsv2.5.0，点击install等待工具链接安装完成:“D:\ncs\toolchains\c57af46cb7”，如下图所示：打开目录：“D:\ncs\v2.5.0”新建文件夹”.west”，然后在目录：”D:\ncs\v2.5.0.west“中新建文件”config”,，然后在config文件中粘贴代码：[manifest]path=nrffile=west.yml[zephyr]base=zephyr打开ToolchainManager找到ncsv2.5.0，打开命令行工具Openbash，并执行指令：“gitclone-bv2.5.0https://github.com/nrfconnect/sdk-nrf.gitnrf”，执行成功后，再执行指令：“cdnrf”然后再执行指令：“westupdate”，如果更新过程中出现错误，则继续执行”westupdate”，直到没有报错，sdk包就完整下载下来了。如下图所示：四：pynrfjprog命令行工具安装常见问题首先安装软件包管理工具（chocolatey），方便安装各种常见软件：以管理员权限运行WindowsPowerShell并粘贴以下脚本，按enter键安装Set-ExecutionPolicyBypass-ScopeProcess-Force;[System.Net.ServicePointManager]::SecurityProtocol=[System.Net.ServicePointManager]::SecurityProtocol-bor3072;iex((New-ObjectSystem.Net.WebClient).DownloadString(‘https://community.chocolatey.org/install.ps1’))打开软件包列表，搜索需要安装的软件，如搜索python找到安装指令“chocoinstallpython”重新以管理员权限运行WindowsPowerShell键入安装指令，按enter键，根据提示，输入y继续按enter键完成安装chocoinstallpython重新打开WindowsPowerShell窗口，输入下述python安装指令,完成相关工具安装，至此你可以使用命令行工具，烧录modem或者CA证书pipinstallpynrfjprogpipinstallintelhex常用测试用命令下载：5.网盘下载地址</li>
  <li>一：按键切换LED与串口外设进入低功耗模式与唤醒测试环境：ncsv1.8.0例程路径：ncs\v1.8.0\nrf\applications\serial_lte_modem测试固件：ncs\v1.8.0\nrf\applications\serial_lte_modem\build\zephyr\merged.hexmodem固件：mfw_nrf9160_1.3.0例程源码：链接测试例程（功耗外设DFUFDSAT）/nRF91/v1.8.0/serial_lte_modem.zipAT+CFUN=1附着网络后电流：651uAAT#XSLEEP=2后电流：64uA相关at指令//serial_lte_modem增强at指令Powersaving#XSLEEP====================The``#XSLEEP``commandmakesthenRF91developmentkitgointoidleorsleepmode.IfyouaregoingtodopowermeasurementsonthenRF9160DKwhilerunningtheSLMapplicationitisrecommendedtodisableunusedperipherals.BydefaultUART2isenabledinthe:file:`nrf9160dk_nrf9160_ns.overlay`filesodisabletheUART2byswitchingthestatus.Changetheline``status="okay"``to``status="disabled"``andthensavethe:file:`nrf9160dk_nrf9160_ns.overlay``filetomakesureyouwillgettheexpectedpowerconsumptionnumberswhendoingthemeasurements.Setcommand-----------ThesetcommandmakesthenRF91developmentkitgointoeitheridleorsleepmode,oritpowersofftheUARTdevice.Syntax~~~~~~::#XSLEEP=&lt;shutdown_mode&gt;The``&lt;shutdown_mode&gt;``parameteracceptsonlythefollowingintegervalues:*``0``-EnterIdle.Inthismode,theSLMserviceisterminated,buttheLTEconnectionismaintained.*``1``-EnterSleep.Inthismode,boththeSLMserviceandtheLTEconnectionareterminated.*``2``-PoweroffUART.Inthismode,boththeSLMserviceandtheLTEconnectionaremaintained.*IncaseofIdle,itwillexitbyinterfaceGPIO.*IncaseofSleep,itwillwakeupbyinterfaceGPIO.*IncaseofUARTpoweroff,UARTwillbepoweredonbyinterfaceGPIOorinternallybySLMwhenneeded.Examples~~~~~~~~::AT#XSLEEP=0OK::AT#XSLEEP=1OK::AT#XSLEEP=2OKReadcommand------------Thereadcommandisnotsupported.Testcommand------------ThetestcommandteststheexistenceoftheATcommandandprovidesinformationaboutthetypeofitssubparameters.Syntax~~~~~~::#XSLEEP=?Responsesyntax~~~~~~~~~~~~~~~::#XSLEEP:&lt;listofshutdown_mode&gt;Example~~~~~~~::#XSLEEP:(0,1,2)OK测试log2022-02-10T07:50:49.602ZDEBUGmodem&gt;&gt;AT+CFUN=12022-02-10T07:50:49.645ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.409ZINFOModemportisclosed2022-02-10T07:50:51.415ZINFOModemportisopened2022-02-10T07:50:51.419ZDEBUGmodem&gt;&gt;AT+CFUN?2022-02-10T07:50:51.433ZDEBUGmodem&lt;&lt;+CFUN:12022-02-10T07:50:51.434ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.437ZDEBUGmodem&gt;&gt;AT+CGSN=12022-02-10T07:50:51.446ZDEBUGmodem&lt;&lt;+CGSN:"352656100375701"2022-02-10T07:50:51.447ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.451ZDEBUGmodem&gt;&gt;AT+CGMI2022-02-10T07:50:51.464ZDEBUGmodem&lt;&lt;NordicSemiconductorASA2022-02-10T07:50:51.467ZDEBUGmodem&lt;&lt;2022-02-10T07:50:51.468ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.470ZDEBUGmodem&gt;&gt;AT+CGMM2022-02-10T07:50:51.484ZDEBUGmodem&lt;&lt;nRF9160-SICA2022-02-10T07:50:51.485ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.494ZDEBUGmodem&gt;&gt;AT+CGMR2022-02-10T07:50:51.511ZDEBUGmodem&lt;&lt;mfw_nrf9160_1.3.12022-02-10T07:50:51.512ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.513ZINFONordicSemiconductorASAnRF9160-SICA[mfw_nrf9160_1.3.1]SerNr:3526561003757012022-02-10T07:50:51.514ZDEBUGmodem&gt;&gt;AT+CEMODE?2022-02-10T07:50:51.528ZDEBUGmodem&lt;&lt;+CEMODE:02022-02-10T07:50:51.529ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.534ZDEBUGmodem&gt;&gt;AT%XCBAND=?2022-02-10T07:50:51.547ZDEBUGmodem&lt;&lt;%XCBAND:(1,2,3,4,5,8,12,13,17,19,20,25,26,28,66)2022-02-10T07:50:51.550ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.562ZDEBUGmodem&gt;&gt;AT+CMEE?2022-02-10T07:50:51.578ZDEBUGmodem&lt;&lt;+CMEE:02022-02-10T07:50:51.579ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.582ZDEBUGmodem&gt;&gt;AT+CMEE=12022-02-10T07:50:51.594ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.599ZDEBUGmodem&gt;&gt;AT+CNEC?2022-02-10T07:50:51.613ZDEBUGmodem&lt;&lt;+CNEC:02022-02-10T07:50:51.614ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.618ZDEBUGmodem&gt;&gt;AT+CNEC=242022-02-10T07:50:51.629ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.632ZDEBUGmodem&gt;&gt;AT+CGEREP?2022-02-10T07:50:51.646ZDEBUGmodem&lt;&lt;+CGEREP:0,02022-02-10T07:50:51.648ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.650ZDEBUGmodem&gt;&gt;AT+CGDCONT?2022-02-10T07:50:51.661ZDEBUGmodem&lt;&lt;+CGDCONT:0,"","","",0,02022-02-10T07:50:51.662ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.667ZDEBUGmodem&gt;&gt;AT+CGACT?2022-02-10T07:50:51.678ZDEBUGmodem&lt;&lt;+CGACT:0,02022-02-10T07:50:51.679ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.684ZDEBUGmodem&gt;&gt;AT+CGEREP=12022-02-10T07:50:51.695ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.699ZDEBUGmodem&gt;&gt;AT+CIND=1,1,12022-02-10T07:50:51.711ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.713ZDEBUGmodem&gt;&gt;AT+CEREG=52022-02-10T07:50:51.727ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.731ZDEBUGmodem&gt;&gt;AT+CEREG?2022-02-10T07:50:51.745ZDEBUGmodem&lt;&lt;+CEREG:5,2,"1D2D","008D2752",92022-02-10T07:50:51.747ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.752ZDEBUGmodem&gt;&gt;AT%CESQ=12022-02-10T07:50:51.761ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.766ZDEBUGmodem&gt;&gt;AT+CESQ2022-02-10T07:50:51.783ZDEBUGmodem&lt;&lt;+CESQ:99,99,255,255,17,602022-02-10T07:50:51.785ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.793ZDEBUGmodem&gt;&gt;AT%XSIM=12022-02-10T07:50:51.800ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.802ZDEBUGmodem&gt;&gt;AT%XSIM?2022-02-10T07:50:51.812ZDEBUGmodem&lt;&lt;%XSIM:12022-02-10T07:50:51.813ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.817ZDEBUGmodem&gt;&gt;AT+CPIN?2022-02-10T07:50:51.828ZDEBUGmodem&lt;&lt;+CPIN:READY2022-02-10T07:50:51.830ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.835ZDEBUGmodem&gt;&gt;AT+CPINR="SIMPIN"2022-02-10T07:50:51.849ZDEBUGmodem&lt;&lt;+CPINR:"SIMPIN",32022-02-10T07:50:51.852ZDEBUGmodem&lt;&lt;2022-02-10T07:50:51.853ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.864ZDEBUGmodem&gt;&gt;AT+CIMI2022-02-10T07:50:51.877ZDEBUGmodem&lt;&lt;4600464284077752022-02-10T07:50:51.878ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:51.879ZINFOIMSIdentity:4600464284077752022-02-10T07:50:51.915ZDEBUGmodem&lt;&lt;%CESQ:60,3,18,22022-02-10T07:50:52.315ZDEBUGmodem&lt;&lt;%CESQ:60,3,24,32022-02-10T07:50:53.357ZDEBUGmodem&lt;&lt;+CGEV:MEPDNACT0,02022-02-10T07:50:53.359ZDEBUGmodem&lt;&lt;+CNEC_ESM:50,02022-02-10T07:50:53.361ZDEBUGmodem&gt;&gt;AT+CGDCONT?2022-02-10T07:50:53.364ZDEBUGmodem&lt;&lt;+CEREG:1,"1D2D","008D2752",9,,,"11100000","11100000"2022-02-10T07:50:53.365ZDEBUGmodem&lt;&lt;2022-02-10T07:50:53.366ZDEBUGmodem&lt;&lt;+CIND:"service",12022-02-10T07:50:53.366ZDEBUGmodem&lt;&lt;2022-02-10T07:50:53.377ZDEBUGmodem&lt;&lt;+CGDCONT:0,"IP","cmnbiot","100.114.178.20",0,02022-02-10T07:50:53.379ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:53.384ZDEBUGmodem&gt;&gt;AT+CGACT?2022-02-10T07:50:53.395ZDEBUGmodem&lt;&lt;+CGACT:0,12022-02-10T07:50:53.396ZDEBUGmodem&lt;&lt;OK2022-02-10T07:50:54.326ZDEBUGmodem&lt;&lt;%CESQ:60,3,29,42022-02-10T07:50:56.126ZDEBUGmodem&lt;&lt;%CESQ:60,3,23,32022-02-10T07:50:57.326ZDEBUGmodem&lt;&lt;%CESQ:60,3,29,42022-02-10T07:50:58.326ZDEBUGmodem&lt;&lt;%CESQ:60,3,24,32022-02-10T07:50:59.926ZDEBUGmodem&lt;&lt;%CESQ:60,3,29,42022-02-10T07:51:01.326ZDEBUGmodem&lt;&lt;%CESQ:60,3,24,32022-02-10T07:51:05.127ZDEBUGmodem&lt;&lt;%CESQ:60,3,29,42022-02-10T07:51:06.326ZDEBUGmodem&lt;&lt;%CESQ:60,3,24,3二：执行AT+CFUN=1，无信号情况下再执行AT+CFUN=0，进入不了低功耗，需使用AT+CFUN=44测试环境测试板子DK板PCA100900.9.02019.21测试例程：serial_lte_modem功耗分析仪器：例如PPK2附着网络时，网络信号正常关闭网络时，把DK板放入屏蔽箱中测试步骤：低功耗设置：AT+CPSMS=1,,,“00111000”,“00011110”打开射频：AT+CFUN=1等待附着到网络打开Socket:socket_fd=nrf_socket(NRF_AF_INET,NRF_SOCK_STREAM,NRF_IPPROTO_TCP);获取IP：nrf_getaddrinfo();连接Socket:nrf_connect(socket_fd,&amp;ipv4Address,sizeof(nrf_sockaddr_in_t));关闭Socket:ret=nrf_close(pContext-&gt;socket_fd);关闭射频：测试一：AT+CFUN=0功耗较高测试二：AT+CFUN=44功耗较低三：参考文档nRFConnectDocDevzone：CaseID:228923Devzone：CaseID:226439</li>
  <li>一：按键切换LED与串口外设进入低功耗模式与唤醒测试环境：ncsv1.8.0例程路径：ncs\v1.8.0\peter\0_uart_off_button测试固件：ncs\v1.8.0\peter\0_uart_off_button\merged.hex例程源码：链接测试例程（功耗外设DFUFDSAT）/nRF91/v1.8.0/0_uart_off_button.zip唤醒状态电流：522uAPM_STATE_RUNTIME_IDLE模式电流：3.5uAPM_STATE_SOFT_OFF模式电流：1.8uAspmprj.conf配置##Copyright(c)2019NordicSemiconductorASA##SPDX-License-Identifier:LicenseRef-Nordic-5-Clause#CONFIG_NCS_SAMPLES_DEFAULTS=yCONFIG_IS_SPM=yCONFIG_FW_INFO=yCONFIG_GPIO=nCONFIG_MAIN_STACK_SIZE=4096CONFIG_SERIAL=n#ImagesthatsetCONFIG_BOOTLOADER_MCUBOOTgetthisvaluesetbydefault.#TheSPMimagewillnothaveCONFIG_BOOTLOADER_MCUBOOTsetbydefaultwhen#beingbuiltbyaparentimage.HencewesetitheretoensurethatSPM#cleansupthecoreduringboot.CONFIG_INIT_ARCH_HW_AT_BOOT=y#AvoidusingfeaturethatallocatesPPIchannelsCONFIG_UART_0_ENHANCED_POLL_OUT=nCONFIG_UART_1_ENHANCED_POLL_OUT=n0_uart_off_buttonprj.conf配置CONFIG_PM=y#RequiredtodisabledefaultbehaviorofdeepsleepontimeoutCONFIG_PM_DEVICE=yCONFIG_GPIO=yCONFIG_GPIO_NRF_INT_EDGE_USING_SENSE=ymain.c测试代码/**Copyright(c)2019NordicSemiconductorASA**SPDX-License-Identifier:Apache-2.0*/#include&lt;stdio.h&gt;#include&lt;zephyr.h&gt;#include&lt;device.h&gt;#include&lt;init.h&gt;#include&lt;pm/pm.h&gt;#include"retained.h"#include&lt;hal/nrf_gpio.h&gt;#include"sys/printk.h"#include&lt;drivers/gpio.h&gt;#include"logging/log.h"LOG_MODULE_REGISTER(main,CONFIG_LOG_DEFAULT_LEVEL);#defineON1#defineOFF0#defineCONSOLE_LABELDT_LABEL(DT_CHOSEN(zephyr_console))#defineSW0_NODEDT_ALIAS(sw0)//按键P0.06//指示灯P0.02//测试，指示灯亮，程序进入工作模式，指示灯灭，程序进入低功耗模式staticconststructgpio_dt_specbutton=GPIO_DT_SPEC_GET_OR(SW0_NODE,gpios,{0});staticstructgpio_callbackbutton_cb_data;staticstructgpio_dt_specled=GPIO_DT_SPEC_GET_OR(DT_ALIAS(led0),gpios,{0});conststructdevice*cons;staticuint8_tpower_state=0;/*Preventdeepsleep(systemoff)frombeingenteredonlongtimeouts*or`K_FOREVER`duetothedefaultresidencypolicy.**Thishastobedonebeforeanythingtriestosleep,whichmeans*beforethethreadingsystemstartsupbetweenPRE_KERNEL_2and*POST_KERNEL.DoitatthestartofPRE_KERNEL_2.*/staticintdisable_ds_1(conststructdevice*dev){ARG_UNUSED(dev);pm_constraint_set(PM_STATE_SOFT_OFF);return0;}SYS_INIT(disable_ds_1,PRE_KERNEL_2,0);voidbutton_callback(conststructdevice*dev,structgpio_callback*cb,uint32_tpins){if(!power_state){power_state=1;}else{power_state=0;}}voidbutton_init(void){LOG_INF("buttoninit\r\n");intret;if(!device_is_ready(button.port)){LOG_INF("Error:buttondevice%sisnotready\n",button.port-&gt;name);return;}ret=gpio_pin_configure_dt(&amp;button,GPIO_INPUT);if(ret!=0){LOG_INF("Error%d:failedtoconfigure%spin%d\n",ret,button.port-&gt;name,button.pin);return;}ret=gpio_pin_interrupt_configure_dt(&amp;button,GPIO_INT_EDGE_TO_ACTIVE);if(ret!=0){LOG_INF("Error%d:failedtoconfigureinterrupton%spin%d\n",ret,button.port-&gt;name,button.pin);return;}gpio_init_callback(&amp;button_cb_data,button_callback,BIT(button.pin));gpio_add_callback(button.port,&amp;button_cb_data);LOG_INF("Setupbuttonat%spin%d\n",button.port-&gt;name,button.pin);if(!device_is_ready(led.port)){LOG_INF("Error:leddevice%sisnotready\n",led.port-&gt;name);led.port=NULL;}if(led.port&amp;&amp;!device_is_ready(led.port)){LOG_INF("Error%d:LEDdevice%sisnotready;ignoringit\n",ret,led.port-&gt;name);led.port=NULL;}ret=gpio_pin_configure_dt(&amp;led,GPIO_OUTPUT);if(ret!=0){LOG_INF("Error%d:failedtoconfigureLEDdevice%spin%d\n",ret,led.port-&gt;name,led.pin);led.port=NULL;}else{LOG_INF("SetupLEDat%spin%d\n",led.port-&gt;name,led.pin);}gpio_pin_set_dt(&amp;led,OFF);}voidmain(void){intrc;cons=device_get_binding(CONSOLE_LABEL);button_init();printk("Powerupenterlowpowermode\r\n");printk("Press9160DKButton1(P0.06)enteractivemode:enableuartenableled1(P0.02)\r\n");printk("ncsv1.8.0nrfsamplesspmprj.confneedaddconfig:CONFIG_SERIAL=n\r\n");printk("ncsv1.8.0peter0_uart_off_buttonprj.confneedaddconfig:CONFIG_GPIO_NRF_INT_EDGE_USING_SENSE=y\r\n");while(1){staticuint8_tspower_state=1;if(spower_state^power_state){spower_state=power_state;if(power_state){gpio_pin_set_dt(&amp;led,ON);//使能串口rc=pm_device_state_set(cons,PM_DEVICE_STATE_ACTIVE);//设置芯片恢复正常状态pm_power_state_force((structpm_state_info){PM_STATE_ACTIVE,0,0});k_msleep(100);printk("PressButton1enterWakeupmodeI=522uA\r\n");}else{printk("PressButton1enterPM_STATE_RUNTIME_IDLEmodeI=3.5uA\r\n");printk("PressButton1enterPM_STATE_SUSPEND_TO_IDLEmodeI=3.5uA\r\n");printk("PressButton1enterPM_STATE_STANDBYmodeI=3.6uA\r\n");printk("PressButton1enterPM_STATE_SUSPEND_TO_DISKmodeI=3.5uA\r\n");printk("PressButton1enterPM_STATE_SOFT_OFFmodeI=1.7uA\r\n");k_msleep(100);gpio_pin_set_dt(&amp;led,OFF);//禁用串口rc=pm_device_state_set(cons,PM_DEVICE_STATE_SUSPENDED);//3.5uA左右电流//设置芯片进入低功耗pm_power_state_force((structpm_state_info){PM_STATE_RUNTIME_IDLE,0,0});}}k_msleep(3000);//延时3秒钟}}二：参考文档DevzonenRFConnectSdkdoc</li>
  <li>芯园电子科技阿里旺旺nRF5x系列一拖二脱机烧录器nRF5x系列一拖四脱机烧录器</li>
  <li>一：设置内部RC晶振默认修改sdk_config.h文件中的以下宏定义//&lt;0=&gt;NRF_CLOCK_LF_SRC_RC//&lt;1=&gt;NRF_CLOCK_LF_SRC_XTAL//&lt;2=&gt;NRF_CLOCK_LF_SRC_SYNTH//设置为内部RC晶振#defineNRF_SDH_CLOCK_LF_SRC0//&lt;o&gt;NRF_SDH_CLOCK_LF_RC_CTIV-SoftDevicecalibrationtimerinterval.//设置250ms*6=8s校准一次RC时钟#defineNRF_SDH_CLOCK_LF_RC_CTIV16//&lt;o&gt;NRF_SDH_CLOCK_LF_RC_TEMP_CTIV-SoftDevicecalibrationtimerintervalunderconstanttemperature.//&lt;i&gt;Howoften(innumberofcalibrationintervals)theRCoscillatorshallbecalibrated//&lt;i&gt;ifthetemperaturehasnotchanged.//温度变化0.5摄氏度每4秒校准一次#defineNRF_SDH_CLOCK_LF_RC_TEMP_CTIV2//&lt;o&gt;NRF_SDH_CLOCK_LF_ACCURACY-ExternalclockaccuracyusedintheLLtocomputetiming.//&lt;0=&gt;NRF_CLOCK_LF_ACCURACY_250_PPM//&lt;1=&gt;NRF_CLOCK_LF_ACCURACY_500_PPM//&lt;2=&gt;NRF_CLOCK_LF_ACCURACY_150_PPM//&lt;3=&gt;NRF_CLOCK_LF_ACCURACY_100_PPM//&lt;4=&gt;NRF_CLOCK_LF_ACCURACY_75_PPM//&lt;5=&gt;NRF_CLOCK_LF_ACCURACY_50_PPM//&lt;6=&gt;NRF_CLOCK_LF_ACCURACY_30_PPM//&lt;7=&gt;NRF_CLOCK_LF_ACCURACY_20_PPM//&lt;8=&gt;NRF_CLOCK_LF_ACCURACY_10_PPM//&lt;9=&gt;NRF_CLOCK_LF_ACCURACY_5_PPM//&lt;10=&gt;NRF_CLOCK_LF_ACCURACY_2_PPM//&lt;11=&gt;NRF_CLOCK_LF_ACCURACY_1_PPM//设置内部RC的精度为500PPM，即500万分之500，如果是外部晶体，则为20PPM#defineNRF_SDH_CLOCK_LF_ACCURACY1二：不启用softdevice情况下校准内部RC，常用于bootloader或app使能softdevice前使用//启用softdevice前设置内部RC时钟校准voidlfclk_calibrate(void){NRF_CLOCK-&gt;LFCLKSRC=(CLOCK_LFCLKSRC_SRC_RC&lt;&lt;CLOCK_LFCLKSRC_SRC_Pos);NRF_CLOCK-&gt;EVENTS_LFCLKSTARTED=0;NRF_CLOCK-&gt;TASKS_LFCLKSTART=1;while(NRF_CLOCK-&gt;EVENTS_LFCLKSTARTED==0);NRF_CLOCK-&gt;EVENTS_HFCLKSTARTED=0;NRF_CLOCK-&gt;TASKS_HFCLKSTART=1;while(NRF_CLOCK-&gt;EVENTS_HFCLKSTARTED==0);NRF_CLOCK-&gt;EVENTS_DONE=0;NRF_CLOCK-&gt;TASKS_CAL=1;while(NRF_CLOCK-&gt;EVENTS_DONE==0);NRF_CLOCK-&gt;TASKS_HFCLKSTOP=1;}//使用方法：放在main入口处调用：voidmain(void){lfclk_calibrate();//...其他代码}注意事项使用内部RC注意事项：蓝牙主从机连接时，时间戳需要对准，才能正常收发。如果内部RC误差较大，有没有即使的校准，就会导致蓝牙连接时，主从机时间戳对不上，进而导致连接断开三：检测晶振是否有运行使能低频时钟(softdevice启用后自动管理此函数)voidnrf_drv_clock_lfclk_request(nrf_drv_clock_handler_item_t*p_handler_item);检测低频时钟是否运行起来（常用于检测外部晶振是否工作正常）/***@briefFunctionforcheckingtheLFCLKstate.**@retvaltrueIftheLFCLKisrunning.*@retvalfalseIftheLFCLKisnotrunning.*/boolnrf_drv_clock_lfclk_is_running(void);使能高频时钟(softdevice启用后自动管理此函数)voidnrf_drv_clock_hfclk_request(nrf_drv_clock_handler_item_t*p_handler_item);检测高频时钟是否运行起来（常用于检测外部晶振是否工作正常）/***@briefFunctionforcheckingtheHFCLKstate.**@retvaltrueIftheHFCLKisrunning(for\nRFXXXTALsource).*@retvalfalseIftheHFCLKisnotrunning.*/boolnrf_drv_clock_hfclk_is_running(void);</li>
  <li>一：烧录程序连接开发板到电脑。打开nRFgo，选择nRF52developmentdongles。烧录dtm程序到开发板。二：启动dtm测试打开nRFgo，选择DirectTestMode。设置射频参数：（1）选择com口从设备管理器查看对应com口。（2）选择Transmit发送模式。（3）选择Channel信道=19。（4）选择单载波模式Constantcarrier。点击Starttest启动dtm测试。三：注意事项如果是自己的pcb板子，而不是开发板，则需进行如下修改。修改dtm串口对应引脚，以nRF52840为例，程序路径：nRF5_SDK_17.1.0_ddde560\examples\dtm\direct_test_mode\pca10056\blank\arm5_no_packs\direct_test_mode_pca10056.uvprojx修改串口RX引脚为：P0.22修改串口TX引脚为：P1.05编译并下载程序，然后开始测试dtm。四：参考资料参考文档：链接测试工具nRFgo：链接测试例程：dtm:nRF5sdk链接nRF52840例程路径：nRF5_SDK_17.1.0_ddde560\examples\dtm\direct_test_mode\hex\direct_test_mode_pca10056.hexnRF52840+nRF21540(PA)例程路径：nRF5_SDK_17.1.0_ddde560\examples\dtm\direct_test_mode\hex\direct_test_mode_pca10112.hexnRF52833例程路径：nRF5_SDK_17.1.0_ddde560\examples\dtm\direct_test_mode\hex\direct_test_mode_pca10100.hexnRF52820例程路径：nRF5_SDK_17.1.0_ddde560\examples\dtm\direct_test_mode\hex\direct_test_mode_pca10100e.hexnRF52832例程路径：nRF5_SDK_17.1.0_ddde560\examples\dtm\direct_test_mode\hex\direct_test_mode_pca10040.hexnRF52810例程路径：nRF5_SDK_17.1.0_ddde560\examples\dtm\direct_test_mode\hex\direct_test_mode_pca10040e.hexnRF52811例程路径：nRF5_SDK_17.1.0_ddde560\examples\dtm\direct_test_mode\hex\direct_test_mode_pca10040e.hex</li>
</ul>