logo资料库

nrf51822 sdk12.2空中升级笔记.doc

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
使用环境: 硬件:艾克姆 nordic 51822 开发板 编译工具:mdk5.3 Sdk 版本: nRF5_SDK_12.2.0_f012efa 一、 编译 dfu 官方 sdk 包中已经包含了空中升级的例子,路径如下: nRF5_SDK_12.2.0_f012efa\examples\dfu\bootloader_secure\pca10028\arm5_n o_packs 但这直接编译这个工程是编译不过去的,报了以下两个错误: 先看一下官方给的测试 dfu 的说明:http://infocenter.nordicsemi.com/index.jsp 以下是截取的测试步骤:
1. 解决 uEcc.h 错误 点击第 2 步的 install micro-ecc 跳转到如下页面 for 由上面可以看出第一步是安装 gcc for arm,点击 ARM’s Launchpad 就跳转到 gcc 与 nRF5_SDK_12.2.0_f012efa\components\toolchain\gcc\Makefile.windows 内 容 对 应 的 版 本 , sdk12 用 的 是 这 个 版 本 C:/Program Files (x86)/GNU Tools ARM Embedded/4.9 2015q3,如果下载的不是这个版本,到时就要修改这个文件。 arm 工 具 第二步是安装 MinGW,同样是点击链接过去下载。默认安装这几个选项就 下 载 , 可以了,点出 Apply Changes 就联网下载安装。 打开安装目录把 mingw32-make.exe 重命名为 make.exe,配置环境变量
第三步编译 micro-ecc,首先点击 micro-ecc GitHub repository 下载源码。 源码复制到\external\micro-ecc 目录下,micro-ecc-master 改名为 micro-ecc,并解 压文件如下 进入 external\micro-ecc\nrf51_keil\armgcc 这个路径这里使用的是 nrf51 和 keil 编 译器,在这个目录中有 Makefile 文件,shift+鼠标右键在此处打开 DOS 命令,输 入 make , 则 开 始 编 译 创 建 micro_ecc_lib_nrf52.lib 库 文 件 , 生 成 之 后 编 译 bootloader,第一个错误已经解决 2. 解决 key 无效错误
Zip 文件的打包和 key 的生成需要用到 nrfutil 软件,注意,是新版本的 nrfutil 软件(version 1.5.0 or later)与以前不一样的是,是 Python Package,首先在 GitHub 下载 nrfutil 的相关文件,在这里我安装了 Python2.7,使用 Python 来安装 nrfutil。 Nrfutil 相关文件下载地址: https://github.com/NordicSemiconductor/pc-nrfutil/ 1、安装 Python2.7,将 Python 的路径添加到系统的环境变量中。(方法与上面 安装 WinGW 类似) 2、安装好了 Python2.7 之后 pip 已经安装上了,将 pip 的路径配置到环境变 量中,打开 cmd, 输入 pip 出现命令列表则表示已经安装成功 我的 Python 和 pip 路径分别为: 3. 下载完 nrfutil,解压压缩包并打开有 setup.py 文件的目录,在此处打开 dos 命 令(shift+右键打开),输入 python setup.py install 这步骤需要有网络的时候运行, 安装可能需要等待几分钟时间,安装时会下载一些东西,有时候会下载失败,就 重新多试几次,可以把下载失败的网址复制到浏览器自己下载一下,再重新输入 python setup.py install 感觉会快一点。 4. 安装成功之后,这个时候\Python27\Scripts 的目录下出现 了 nrfutil.exe 则表示安装完成。 5. 在 DOS 命令下输入 nrfutil 出现以下信息,则表示 nrfutil 安装成功。 可以用 nrfutil --help 获取一些帮助信息。
接下来就是生成 key 相关文件: 1. 生成 key 文件,在某个目录下打开 dos 命令(shift+右键打开) 输入 nrfutil.exe keys generate private.key 就会在当前目录生成 private.key 文件。 2. 生成 key.c 文件,在有 key 文件的目录下打开 dos 命令(shift+右键打开) 输入 nrfutil keys display --key pk --format code private.key --out_file dfu_public_key.c 生 成相关的.c 文件 3. 把 生 成 的 .c 文 件 替 代 examples\dfu\bootloader_secure 这 个 路 径 下 的 dfu_public_key.c 此时再编译,整个工程就编译通过了。这时在 build_目录下会生成的 bootloader 的 hex 文件,可以用 nRFgo Studio 下载 bootloader 了。注意,还是 和以前步骤一样,先下载协议栈,再下载 bootloader。 二、 生成升级包 把 app 的 hex 文件与刚才生成的 private.key 放在同一目录下,名字改为 application.hex。执行以下指令。 生成升级包指令: nrfutil pkg application.hex --sd-req 0x87 --key-file private.key application.zip 指令解析: --hw-version 51 --application-version 1 这个可以自己定义 --application application.hex 要打包的 hex 文件 --sd-req 0x87 --key-file private.key 生成的 key 文件,与程序中的 key 相对应 application.zip 生成的升级包 (dfu_req_handling.c softdevice 版本号,可以在 nRFgo studio 程序下载页面看到 generate --hw-version 51 --application-version 1 --application --> NRF_DFU_HW_VERSION) 这个宏定义 三、 升级 1. nRFgo studio 烧写 softdevice 和 bootloader. 2. 安卓手机安装 nRF Toolbox 软件,我用的是 2.4 版本的,把上一步生成的.zip 文件传到手机 3. 打开 nrf toolbox 软件的 dfu 页面,选择.zip 升级包,连接蓝牙”DfuTarg”,点击 升级,显示升级完成即可。从 app 跳转到 bootloader 升级新的 app 程序也是一样 的步骤,只是连接的蓝牙不一样而已,不过要注意你的 app 是否加入的空中升级 的服务。 四、 编译带空中升级功能的应用程序 上面可以用通过升级包从 bootloader 升级 app 了,但是升级完后从 app 升级 却跳不到 bootloader 去升级新的 app。这是因为很多模板程序是没加入空中升级 服 务 的 。 不 过 不 用 担 心 , 因 为 官 方 提 供 了 带 此 服 务 的 app 。 示 例 位 于 nRF5_SDK_12.2.0_f012efa\examples\ble_peripheral\experimental_ble_app_buttonl ess_dfu 此示例有一个 bug,所以也是跳转不到 bootloader。要修改以下一个地方:
添加红色方框这句,这修改就可以跳转了。 五、生成 bootloader_setting 文件 把上面的 softdevice、bootloadet、app 通过 nrf studio 烧进去之后,发现程 序还是运行在 bootloader,有没办法可以烧完程序后运行在 app 呢,那就是烧多 一个 bootloader_setting.hex 文件,以下是生成 setting 文件的指令: nrfutil --application-version bootloader_setting.hex NRF51 --bootloader-version --application 1 --bl-settings-version application.hex 1 1 settings generate --family 此时 nrf studio 烧写的步骤是,softdevice --> bootloader_setting --> bootloader --> app 烧写完后程序就自动运行在 app 了。注意 bootloader_setting 的烧写的 app 烧写 是一样方法的,在同一个选项卡烧写,只是选的文件不一样而已。 另外遇到的问题: App 开了狗后,升级进入 bootloader 没有喂狗,要另外添加喂狗代码,具体位于 nrf_dfu.c 文件 wait_for_event() { If (NRF_WDT->RUNSTATUS & WDT_RUNSTATUS_RUNSTATUS_Msk) NRF_WDT->RR[0] = WDT_RR_RR_Reload; While(true) { ...... } }
分享到:
收藏