1. 引言
众所周知,我们一般使用调试器下载程序或调试设备。
FRDMK64在板上具有OpenSDA调试接口,因此不需要额外的调试器。但是如果我们要设计一个没有调试器但可以下载程序的电路板,则可以使用引导加载程序(Bootloader)。引导加载程序是一个小程序,目的是通过UART,I2C,SPI等接口更新MCU的应用程序。
本文将描述一个基于FRDMK64F的简单SD卡引导程序,使用SD卡更新MCU的应用程序。用户可以将二进制文件放入卡中。卡插入目标板后,板子将自动更新应用程序。本设计提供了对应的引导加载程序和应用程序代码,以便您可以在自己的板上进行测试。
2. Bootloader的实现
SD卡的示意图如下所示。该板使用SDHC模块与SD卡通信。
图1. SD卡示意图
我们使用FRDM-K64F的2.6.0版本的SDK。您可以在我们的网站上下载该SDK。 链接是“mcuxpresso.nxp.com”。
引导加载程序使用SDHC和fafts文件系统,因此我们应该添加文件来支持它。
图2.支持文件
在主代码中,程序将等待直到插入卡。然后它将在SD卡中找到名为“ a000.bin”的文件以更新应用程序。如果文件不存在,则开发板将直接执行该应用程序。如果没有应用程序,程序将结束。 以下代码显示了程序如何等待插入sd卡,此外它还将检查该地址是否包含应用程序的地址。
图3.代码-等待插入卡
以下代码显示了程序如何打开二进制文件,如果sd卡没有该文件,则程序将跳转到该应用程序开始执行。
图4.打开二进制文件
如果程序正常打开文件,则更新将开始,它将从0xa000擦除200k的空间,您可以根据自己的实际代码工程大小进行调整。
现在我将详细说明更新的方法。我们的数据被写入称为“ rBUff”的缓冲区,缓冲区大小为4K,在向其中写入数据之前,需要先将其擦除。
请注意,在擦除和编程闪存之前应该先禁用所有中断,当操作完成后再重新使能中断。
文件大小将决定将数据写入闪存的方式。
1.如果大小小于4k,我们只需读取文件数据进行缓冲,然后判断文件大小是否与8个字节对齐。如果不是,我们增加“readSize”的大小以读取称为“rBuffer”的数据缓冲区中的更多数据,这些多读出来的数据内容为0。
2.如果大小> 4K,我们使用“ remainSize”来记录剩余的数据量。每次读取4k直到其大小小于4k,然后重复步骤1。一次完成操作后,我们应清除缓冲区并增加扇区编号以准备下一次发送。
图5:写Flash操作代码
清除空间的方法如图所示。它将初始化闪存并从给定地址擦除给定大小。 “ SectorNum”用于显示要擦除的扇区。
图6.擦除操作代码
下图显示了如何将数据写入闪存。
图7.程序操作代码
在转到应用程序之前,我们应该修改在引导加载程序中所做的配置。
运行这些代码时,应禁用全局中断,并且不要忘记重新使能全局中断。
图8. 反初始化代码
然后我们可以转到应用程序。
图9.转到应用程序
3. 内存重定位
FRDMK64具有1M闪存,从0x00000000到0x00100000。如图10所示,我们使用0xa000作为应用程序的起始地址。
图10:内存映射
现在,我将向您展示如何在不同的IDE中为用户应用程序修改链接文件。
在IAR中:
图11:IAR的ICF
在MDK中:
图12.MDK的SCF
在MCUXpresso中:
图13. MCUXpresso的闪存配置
4. 运行演示
1)首先下载引导程序;
2)准备一个用户应用程序。 我们以“led blinky”为例;
3)修改链接文件;
4)用您的IDE生成二进制文件,请将其命名为“a000.bin”;
5)将其放入SD卡中,如图5所示。
图14:SD卡的内容
6)插入卡,并打开电源。请稍等片刻,该应用程序将自动执行。
5. 参考资料