Nordic 52832 —— OTA 流程源码分析(二)

写在前面:

之前已经写过OTA过程是如何跳转进入bootloader的,在跳转之前主要做了什么,请参考以下文章,使用的SDK为SDK12.2.0,个人QQ:993650814

Nordic 52832 —— OTA 流程源码分析(一),

正文:

一、 准备工作:如何编译bootloader以及让他正常工作请参考如下文章:

          DFU升级 ,非常感谢这位大牛的贡献。

二、OTA基本知识储备:

    1、MBR了解:

    如果bootloader存在的话,Master Boot Record(MBR)的作用是为了启动bootloader,因此,MBR必须要知道bootloader所在的起始地址,bootloader的起始地址定义在UICR.BOOTLOADERADDR之中,具体是0x10001014,代码中定义如下:



MBR是如何获取bootloader地址的呢?

在nrf_bootloader_info.c中有个宏定义,



这样UICR就得到了bootloader的起始地址,然后每次启动时,MBR都会检查boot是否存在。

2、52832 Memory Laylout 须知:



3. Nordic OTA分dual bank和single bank,application、协议栈、和bootloader都可以升级,这里只分析OTA application:

dual bank updates:


single bank updates:


三、源码分析:

1、OTA的setting结构体,里面包含了OTA过程中的一些信息,定义在nrf_dfu_types.h中:


2、nrf_dfu_settings_init 函数



3.nrf_dfu_continue 函数

这个函数的作用是通过setting中的信息判断目前使用的是哪个bank,并以此来决定是否进行代码搬运


4、nrf_dfu_continue_bank

这个函数的作用是判断需要搬运的是app、bootloader、SoftDevice还是bootloader+SoftDevice


5、 nrf_dfu_enter_check 函数


6、nrf_dfu_app_is_valid 函数


7、


8、nrf_dfu_transports_init 函数


注意这里面的 init_func函数和close_func函数是在nrf_ble_dfu.c中赋值的


所以实际上调用的是 ble_dfu_transport_init 这个函数

9、ble_dfu_transport_init函数

这个函数就是初始化了一下ble的参数之类的


在gap_params_init函数中调用了 gap_address_change来讲蓝牙地址改了


10.通过Ble 接受数据然后教研然后写flash的操作等的细节这里不讲。

11、最后,检查app的有效性,然后跳转运行




猜你喜欢

转载自blog.csdn.net/weixin_40204595/article/details/80669501
OTA