简介:
本文介绍如何使用NXP官方提供的bootloader,以及踩坑的过程。
名词解释:
MCU boot:NXP官方提供了一个bootloader,具备一些基础的功能
app:application,应用程序,一个程序由bootloader+application组成。
平台:硬件焊接,开发板。
使用过程
首先去官方下载bootloader, 地址如下:
https://www.nxp.com/design/software/development-software/mcuxpresso-software-and-tools/mcuboot-mcu-bootloader-for-nxp-microcontrollers:MCUBOOT
进去以后点击download,然后点击SDK。
然后接下来需要生成一个带MCU boot的SDK,如果你英语比较好,应该可以直接搞定,注意勾上如下图所示的这一个选项。如果你的英语不太好,可以参照我的上一篇博客:
NXP freescale 开发环境搭建
中的第三节 MDK Keil + MCUXpresso Config Tools 环境搭建 - ③ 下载MCUXpresso SDK
生成好之后点击下载,值得一提的是,SDK代码和文档是分开的,记住下文档,里面有很多东西比较有用。
下载完成之后,在这个目录下有很多文档,记得看看:
*\SDK_2.7.0_MK66FX1M0xxx18_doc\docs\mcu-boot*
接下来分为两个部分开始讲解:
1.烧写bootloader:
2.官方的demoapp:
3.烧写自己的app:
烧写bootloader:
打开这个工程
\SDK_2.7.0_MK66FX1M0xxx18\boards\frdmk66f\bootloader_examples\freedom_bootloader
什么?你问我为什么是这个工程,那我只能说对不起我也不知道,我只是一只按照这篇文档操作的小猫咪:
\SDK_2.7.0_MK66FX1M0xxx18_doc\docs\mcu-boot\MCU Bootloader Demo Application User’s Guide
然后你需要改一个参数,在 bootloader_config.h 94行。
这个参数的意思是指定app程序的代码位于flash上的哪一个地址,你不要看官方说的0xa000,官方这里搞错了,bootloader的大小已经超过了0xa000(40960byte 40KB),应该改成0xc000。 NXP的工程师已经在这里讨论了这个错误,但是不知道他会不会修复:https://community.nxp.com/thread/492991
然后点击编译、debug或者下载,bootloader程序会自动下载进flash的 0x00000000 - 0x0000c000区域。
修改串口(非必须),本平台需要
一般来说,bootloader都要提供交互的功能,例如通过串口或者USB,控制一些启动命令,NXP官方的MCU bootloader提供了串口和USB做虚拟串口两种交互方式,并且实现了一套自己的交互协议。
由于我使用的开发平台,只引出了uart3和uart4,而MCUboot 默认使用的是uart0,所以需要修改一下:
删除这个定义,
然后会报一个未定义,这个简单,复制粘贴一下。
修改一下串口4的引脚:
把串口0连接上,然后确认一下bootloader运行情况
SDK_2.7.0_MK66FX1M0xxx18\middleware\mcu-boot\bin\Tools\KinetisFlashTool\win\KinetisFlashTool
点击connect,可以看到红框处提示已经连接上了。
还可以用这个工具进行人机交互
SDK_2.7.0_MK66FX1M0xxx18\middleware\mcu-boot\bin\Tools\blhost\win\blhost.exe
注意 : 需要使用CMD打开这个工具,可以看到下图打印了bootloader的版本号。
烧写官方的demoapp
打开这个工程
\SDK_2.7.0_MK66FX1M0xxx18\boards\frdmk66f\bootloader_examples\demo_apps\led_demo_freedom_a000
注意这里的a00,上文:https://community.nxp.com/thread/492991已经说过了,官方出错了,应该是c00,所以下面要修改一点参数,将a000,修改成c000.
打开工程后,先按照下图打开链接文件,我们要修改里面的a000:
修改一下blink的灯引脚
烧写自己的app
在烧写自己的app之前先来看看MCU-boot的启动逻辑
这段代码中可以看到,会先检查是不是直接引导模式,如果不是,则计算延时引导时间,在延时N秒后进行引导。
而 直接引导模式、延时引导时间的计算都来自于这个变量
这个变量就需要特别注意了,是来自于app的flash上,你敢信!
也就是说,bootloader会去app的flash区域的0x3c0地址读取值,然后根据这个值,进行特殊的引导操作。
所以,我们必须在app的特定flash位置,增加一组值。这组值实际上位于startup.s文件中,所以我们参考上述的 led_demo_freedom_a000 中的startup.s文件,直接复制copy过来即可,然后需要在keil中增加编译参数。
最后更改分散加载文件,将程序的起始地址修改为0x0000c000。建议直接复制上述的分散加载文件
备注
在测试的时候,中断向量表的size默认时0x00000400,如果随意修改中断向量表的大小,会造成jlink下载失败。必须要把jlink的verify取消掉,因为jlink会根据device校验中断向量表的大小。