1 问题描述
1)在用到nrfjprog对hex文件进行升级时,发现第一次升级后无法跳到app中,进入updater,要再次进行升级才可以跳到app
2)如果将板子的flash清空,即全部擦除,再用nrfjprog对hex文件进行升级,则可跳到app中
2 问题解决
1)怀疑我们烧进去的bin文件,在往板子里烧的过程中被篡改,导致烧录前及烧进板子里的bin有差异
用J-Flash将板子内的bin读出来,与烧录前的bin进行对比,发现确实有出入,如下图中,左边为烧进去后又通过J_Flash读出来的bin,右边为烧录前的bin文件,在地址20002和20003处烧进去后被篡改。
读取板子内的flash方法如下:
打开J-Flash,Target——>connect
Target——>Manual Programming——>Read back——>Range 输入起始地址即可读出bin
2)怀疑使用sectorerase并不能将想要擦除的区域(比如updater区)全部擦除掉,只是在擦的时候,会先计算下你给的hex文件有多大区域,根据这个hex文件的大小去擦除相应的区域,而不是整个区域全部擦除,这样,如果这一次升级的hex文件比板子离已有的hex文件小的话,就会有一部分没有被擦除,导致hex文件会遗留上次的一部分,运行起来就会出问题
3)在nordic的论坛上发现一个帖子,也是讲的Flashing issue with nrfjprog
https://devzone.nordicsemi.com/f/nordic-q-a/23161/flashing-issue-with-nrfjprog
大致意思是讲使用sectorerase+hex文件进行擦除flash会出现崩溃nrfjprog -f nrf52 --sectorerase --program application.hex,但改为 erasepage+擦除地址进行擦除操作nrfjprog -f nrf52 --erasepage 0x20000-0x30000就能解决此问题
看论坛上nordic给了相应的回复:说在某些情况下sectorerase是无法擦除整个区域,在nrfjprog9.7.0版本得到修复
4)在此网页下下载了nrfjprog9.7.3版本,安装后,进行验证,发现还是会出现无法跳到app的情况,烧录前后的bin文件依旧不一致,最后,我们采用更改makefile的形式,强制使用--erasepage对flash区域进行擦除,再使用--program进行写操作
https://www.nordicsemi.com/eng/Products/Bluetooth-low-energy/nRF52832#Downloads
原makefile中使用--program+sectorerase的擦除再写的代码为:
# Provide the ability to support time/date stamped images, or alternative paths.
BUILD_DIR ?= build
PROJECT_FLASH_IMAGE_NAME ?= $(abspath $(BUILD_DIR)/out/$(PROJECT).hex)
flash:: $(PROJECT_FLASH_IMAGE_NAME)
@echo Flashing: $<
nrfjprog --program $< -f nrf52 --sectorerase --reset
更改后为:使用--erasepage进行擦除,再使用--program进行写操作
ifeq (bootloader,$(PROJECT)))
START_ADDR := 0x00000000
END_ADDR := 0x00001000
else ifeq (updater,$(PROJECT)))
START_ADDR := 0x00001000
END_ADDR := 0x00010000
else ifeq (app,$(PROJECT)))
START_ADDR := 0x00020000
END_ADDR := 0x00060000
else
START_ADDR := 0x00000000
END_ADDR := 0x00000000
endif
# Provide the ability to support time/date stamped images, or alternative paths.
BUILD_DIR ©= build
PROJECT_FLASH_IMAGE_NAME ©= $(abspath $(BUILD_DIR)/out/$(PROJECT).hex)
flash:: $(PROJECT_FLASH_IMAGE_NAME)
@echo Flashing: $<
nrfjprog --erasepage $(START_ADDR)-$(END_ADDR)
nrfjprog --program $< -f nrf52 --reset
更改后,程序一次烧录,能够跑完bootloader、upadter后跳到app中