SDK11中的bootloader 提供了两个方式进入升级模式,一种是上电按住按键进入升级状态,另一种是手机点击升级,
bootloader相关代码如下
如果是手机APP通过点击图标直接升级,那么在APP跳转到bootloader进行升级前就会设置,NRF_POWER->GPREGRET
这个寄存器的值,所以bootlaoder代码中开始就是判断这个寄存器中的值来判断是不是手机触发进入DFU
模式 下面的代码会判断是否有设备上的按键按下,如果在上电过程中按下按键也会进入DFU模式。
无论通过手机上的DFU图标进入升级模式,还是通过设备上的按键进入升级模式都需要bootloader的
两种方式只是进入升级模式的方式不同而已。
对bootloader代码进行修改:
在example中样例ble_app_hrs中 就有 DFU服务:
D:\myfile\test\examples\ble_peripheral\ble_app_hrs\pca10028\s130_with_dfu\arm5_no_packs
在main中的services_init函数的最后添加,创建DFU服务的代码:
事件派发函数中 添加DFU的事件处理函数以及device_manager模块的事件处理函数
再添加相关函数和代码:
再下载程序后可以使用nordic官方软件nrf toolbox或nrf master control pannel 软件 进行DFU
再点击DFU图标后会发送一条启动命令,dfu_app_on_dfu_evt函数中会处理这条指令
Bootloader_start函数会做一些设置跳转到bootloader中去
上面的sd_power_gpregret_set函数就是设置一个标记,表明是从app中启动进入bootloader和前面说的bootloader代码中的开头判断对应
sdk中的bootloader例子是基于32k ram51422,如果是使用16kram的51822需要修改如下地址:
另外,一旦烧录bootoader 后上电顺序不再是协议栈-》APP而是协议栈-》bootloader->app
子bootloader中会对app是否有效做判断,sdk中的实现只有通过DFU模式升级APP才会别人为有效,应为DFU模式
升级后会设置一些相关标志,DFU判断APP是不是有效判断这些标志,所以如果你用烧录软件烧录APP,因为没有做一些标志,所以bootloader会人为APP无效,
从而不会启动APP。
不过可以通过修改一下变量实现,计算通过烧录软件烧录APP,bootloader也可以正常启动APP,
打开bootloader工程中的bootloader_settings.c文件,修改如下变量就可以了。
以上代码都经过本人验证