Lu Blog

Segment fault!

nRF24LU1P Bootloader

研究了一下nRF24LU1P官方的bootloader程序,官方的nRF24LU1P的bootloader是写在Flash的最后,占用2KB空间,起始位置为0x7800,它在Flash的0x0000位置写入了0x02,0x78,0x00,用来转跳到bootloader。
ida.png

需要注意的是,如果用户程序大于30KB,可能会破坏或者覆盖bootloader。

我们也可以从自己的代码里转跳到bootloader

方法一

不推荐这种方法,它可能会破坏原来的代码。
通过修改flash 0x0000 位置,写入0x02,0x78,0x00。然后通过看门狗复位mcu,让mcu启动时直接跳到bootloader里。
注意:hal_flash_page_erase(0)会擦除flash的page0,请不要把程序放在page0里

void hard_nordic_bootloader()
{
  EA = 0;
    
  // Change reset vector to 0x7800
  hal_flash_page_erase(0);
  hal_flash_byte_write(0x0000, 0x02);
  hal_flash_byte_write(0x0001, 0x78);    
  hal_flash_byte_write(0x0002, 0x00); 

  // Reset MCU by activating watchdog
  REGXH = 0;
  REGXL = 1;
  REGXC = 0x08;
}

方法二

通过代码直接转跳到0x7800位置,启动bootloader。

void soft_nordic_bootloader()
{
    EA = 0;
    // Jump to 7800
    ((void(code *)(void))0x7800)();
}

EOF
nRF24LU1P Bootloader官方文档:nRFGo SDK - nRF24LU1+ USB Bootloader
bootlu1p.exe与boot24lu1p-f32.hex下载:nrf24lu1p_boot.zip

评论卡