最近工作中用到了52840作为MCU开发项目。 DFU功能肯定是必不可少的配置。 之前在52832, 51822 中用的很熟练啦。 觉得应该也是一样的流程吧。 结果着实遇到了麻烦, 反复找了几天的原因才得以解决, 记录一下,为自己也为遇到同样问题的人少走点弯路。 关于DFU 的一般过程,搜一下可以找到很多, 这里就不赘述。 我遇到的问题就是无法进入DFU。
问题一: 如何从bootloader中打印Log数据
当遇到无法进入DFU时, 想到的第一个方法就是先从bootloader中打印出调试信息。 我用的SDK是SDK17.1. 52840的bootloader 默认的flash起始地址是0XF8000, 大小为0X6000。 当从SDK_Config.h 里使能Log之后编译出现很多错误, 原因就是bootloader的空间太小啦,不足以放下Log使能后的bootloader。调整bootloader的其实地址为0xF4000, 大小为0XA000。编译通过, 现在可以打印bootloader的调试信息啦。
问题二:签名错误 Signature failed (err_code: 0x8542)
通过打印Log的调试信息。 发现bootloader计算出来的签名 和 上传的升级包的签名是不一样的。 仔细对比发现, 签名64个字节,前32个字节和后32个字节如果调换一个顺序就和升级包的签名就一致啦。 进一步调试, 发现在bootloader中有函数nrf_crypto_backend_micro_ecc_verify()用于验证签名。函数中 的宏定义ECC_BACKEND_SWAP_BYTES 中的内容是灰化的。 这部分灰化的代码正是交换签名字节的顺序。 使能的方法就是在预编译里加入 uECC_VLI_NATIVE_LITTLE_ENDIAN=1