问题现象描述:
SDK版本17.1.0
在 mergehex工具 合并以下文件
setting.hex
bootloader.hex
app.hex
sortdevice.hex
之后烧录固件第一次运行
程序一直运行在bootloader,蓝牙名称显示 DFUTARG ,必须要进行一次OTA才进入APP
注意:如果你连DFUTARG都没有搜到,说明打包步骤不对,以下步骤只适用于能搜带DFUTARG蓝牙后
!!! 仔细检查打包程序步骤,不能有误,不然依然进入不了app
解决步骤1 :修改宏定义
1:用 keil 打开bootloader工程:
nRF5_SDK_17.1.0_ddde560\examples\dfu\secure_bootloader\pca10040e_s112_ble\arm5_no_packs
2:打开keil 工程设置的 C\C++ 的define
添加芯片型号 NRF52832_XXAA的宏定义,
注意,如果用的是52832,但是里面却出现了52810_XXAA类似的其他型号的宏定义记得删掉
步骤2 :修改代码
3: 打开这个文件 :
nrf_bootloader_app_start_final.c
4:修改函数:
这个值有问题:BOOTLOADER_SETTINGS_ADDRESS
直接换成我们自己的型号setting.hex的起始位置
ret_code_t nrf_bootloader_flash_protect(uint32_t address, uint32_t size)
{
if ((size & (CODE_PAGE_SIZE - 1)) || (address > BOOTLOADER_SETTINGS_ADDRESS))
{
return NRF_ERROR_INVALID_PARAM;
}
。。。
修改后代码如下:
0x0007E000UL是根据宏定义追代码进去看到的,
52832的setting是放在flash顶部的;512k大小型号的是放在0x0007E000UL地址,版本2的setting占了2page
ret_code_t nrf_bootloader_flash_protect(uint32_t address, uint32_t size)
{
if ((size & (CODE_PAGE_SIZE - 1)) || (address > 0x0007E000UL)) //BOOTLOADER_SETTINGS_ADDRESS
{
return NRF_ERROR_INVALID_PARAM;
}
。。。
修改main.c中代码:
屏蔽led的无用代码
/**
* @brief Function notifies certain events in DFU process.
*/
static void dfu_observer(nrf_dfu_evt_type_t evt_type)
{
switch (evt_type)
{
case NRF_DFU_EVT_DFU_FAILED:
case NRF_DFU_EVT_DFU_ABORTED:
case NRF_DFU_EVT_DFU_INITIALIZED:
// bsp_board_init(BSP_INIT_LEDS);
// bsp_board_led_on(BSP_BOARD_LED_0);
// bsp_board_led_on(BSP_BOARD_LED_1);
// bsp_board_led_off(BSP_BOARD_LED_2);
break;
case NRF_DFU_EVT_TRANSPORT_ACTIVATED:
// bsp_board_led_off(BSP_BOARD_LED_1);
// bsp_board_led_on(BSP_BOARD_LED_2);
break;
case NRF_DFU_EVT_DFU_STARTED:
break;
default:
break;
}
}
步骤3 :检查falsh中固件存放位置
使用工具 Programmer v4.2.0
点击add file 把setting bootloader app 加进去看flash位置有没有冲突
把bootloader放在挨着setting.hex的地方 ,这个只需要去修改keil里面ROM的位置就行了
我的seting放在0x7E000的位置 减去bootloader的大小,刚刚好从0x78000开始放
bootloader的大小用上面的progammer软件就可以确定,鼠标放在途中红色位置就会显示大小和起始位置