NRF52832修改OTA升级时的bootloader蓝牙MAC

NRF52832在OTA升级时,修改了APP的蓝牙MAC会导致无法升级,原因是OTA程序的蓝牙MAC没有被修改所以手机扫描蓝牙时无法连接

解决办法

方法1:在bootloader的程序里面加入修改蓝牙mac地址的代码
方法2:将地址设置为在引导加载程序中保存在寄存器的地址中

方法1实现原理(不推荐方法1):

在bootloader蓝牙广播开启之前修改蓝牙mac
通过让bootloader去加载app保存在flash中的mac地址信息
然后进行设置即可

1:添加fsd模块
在sdkconfig.h中加入fds的宏定义
根据编译报错添加所需要的文件及其路径
直到fds组件编译通过
注意:app中修改的mac地址也必须用fds写入flash,
不然bootloader找不到存mac的信息块,并且尽量让
两个fds的大小,page,等配置参数一样(直
接从app的sdkconfig复制过来用就一样了)

2:添加代码
初始化fds
读出mac信息
修改蓝牙

1:打开文件:nrf_dfu_ble.c 找到函数 ble_dfu_transport_init()
2:在advertising_start(); 调用前修改mac	
/**User app code**/
    /****/
    flash_app_init(); //初始化fds

    s_dvc_ble_info_t dvc_ble_info = {0}; //这个是自定义变量用来存mac的
    if (dvc_ble_info_load(&dvc_ble_info) == 0) //读出mac信息
    {
        ble_gap_addr_t bleAddr;
        sd_ble_gap_addr_get(&bleAddr);

        bleAddr.addr[0] = dvc_ble_info.ble_mac[5];
        bleAddr.addr[1] = dvc_ble_info.ble_mac[4];
        bleAddr.addr[2] = dvc_ble_info.ble_mac[3];
        bleAddr.addr[3] = dvc_ble_info.ble_mac[2];
        bleAddr.addr[4] = dvc_ble_info.ble_mac[1];
        bleAddr.addr[5] = dvc_ble_info.ble_mac[0];

        bleAddr.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC; // 公共类型的广播地址;  如果是静态随机,最高2位需要为11:  addr[5]|0xC0
        if (bleAddr.addr_type == BLE_GAP_ADDR_TYPE_RANDOM_STATIC)
        {
            bleAddr.addr[5] = (dvc_ble_info.ble_mac[0] | 0xC0);
        }

        err_code = sd_ble_gap_addr_set(&bleAddr); //设置mac
        APP_ERROR_CHECK(err_code);
    }

    /****/
    /**User app code**/
    err_code = advertising_start();
    VERIFY_SUCCESS(err_code);

3:注意增加代码之后的bootloader的ROM大小不要和其他文件地址冲突了

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

方法二:

将地址设置为您在引导加载程序中保存在UICR中的地址
有一个用户寄存器,可以存一些信息在里面,所以只需往里面写入和拿出来用即可
寄存器就叫UICR,可以查看定义NRF_UICR_Type,其中只有部分可用
主要步骤:
读出 NRF_UICR 的全部内容
写入mac地址
将新的 NRF_UICR  全部写进去

头文件:
#include "nrf52.h"
#include "nrf_nvmc.h"
	NRF_UICR_Type t_uicr = {0};
    memcpy((uint8_t *)&t_uicr, (uint8_t *)NRF_UICR, sizeof(NRF_UICR_Type));
    memcpy((uint8_t *)&t_uicr.UNUSED0, &dvc_ble_info.ble_mac[0], 6);

    nrf_nvmc_page_erase((uint32_t)&NRF_UICR->UNUSED0); // 一次擦除连续写入
    nrf_nvmc_write_bytes((uint32_t)&NRF_UICR->UNUSED0, (uint8_t *)&t_uicr, sizeof(NRF_UICR_Type));

注意:写 NRF_UICR 寄存器需要在ble 协议栈初始化之前完成,否则宕机

最后在bootloder中,只需要拿出寄存器直接取字节来用即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漏洞百出

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值