基于FRDMK64F的SD卡引导程序

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

基于FRDMK64F的SD卡引导程序

基于FRDMK64F的SD卡引导程序

1. 引言

众所周知,我们一般使用调试器下载程序或调试设备。

FRDMK64在板上具有OpenSDA调试接口,因此不需要额外的调试器。但是如果我们要设计一个没有调试器但可以下载程序的电路板,则可以使用引导加载程序(Bootloader)。引导加载程序是一个小程序,目的是通过UART,I2C,SPI等接口更新MCU的应用程序。

本文将描述一个基于FRDMK64F的简单SD卡引导程序,使用SD卡更新MCU的应用程序。用户可以将二进制文件放入卡中。卡插入目标板后,板子将自动更新应用程序。本设计提供了对应的引导加载程序和应用程序代码,以便您可以在自己的板上进行测试。

2. Bootloader的实现

SD卡的示意图如下所示。该板使用SDHC模块与SD卡通信。

calvinji_0-1628521529350.png

1. SD卡示意图

我们使用FRDM-K64F的2.6.0版本的SDK。您可以在我们的网站上下载该SDK。 链接是“mcuxpresso.nxp.com”。

引导加载程序使用SDHC和fafts文件系统,因此我们应该添加文件来支持它。

calvinji_1-1628521529367.png

图2.支持文件

在主代码中,程序将等待直到插入卡。然后它将在SD卡中找到名为“ a000.bin”的文件以更新应用程序。如果文件不存在,则开发板将直接执行该应用程序。如果没有应用程序,程序将结束。 以下代码显示了程序如何等待插入sd卡,此外它还将检查该地址是否包含应用程序的地址。

calvinji_2-1628521529375.png

图3.代码-等待插入卡

以下代码显示了程序如何打开二进制文件,如果sd卡没有该文件,则程序将跳转到该应用程序开始执行

calvinji_3-1628521529387.png

4.打开二进制文件

如果程序正常打开文件,则更新将开始,它将从0xa000擦除200k的空间,您可以根据自己的实际代码工程大小进行调整。

现在我将详细说明更新的方法。我们的数据被写入称为“ rBUff”的缓冲区,缓冲区大小为4K,在向其中写入数据之前,需要先将其擦除。

请注意,在擦除和编程闪存之前应该先禁用所有中断,当操作完成后再重新使能中断。

文件大小将决定将数据写入闪存的方式。

1.如果大小小于4k,我们只需读取文件数据进行缓冲,然后判断文件大小是否与8个字节对齐。如果不是,我们增加“readSize”的大小以读取称为“rBuffer”的数据缓冲区中的更多数据,这些多读出来的数据内容为0

2.如果大小> 4K,我们使用“ remainSize”来记录剩余的数据量。每次读取4k直到其大小小于4k,然后重复步骤1。一次完成操作后,我们应清除缓冲区并增加扇区编号以准备下一次发送。

 

calvinji_4-1628521529448.png

图5:写Flash操作代码

清除空间的方法如图所示。它将初始化闪存并从给定地址擦除给定大小。 “ SectorNum”用于显示要擦除的扇区。

calvinji_5-1628521529508.png

图6.擦除操作代码

下图显示了如何将数据写入闪存。

calvinji_6-1628521529554.png

7.程序操作代码

在转到应用程序之前,我们应该修改在引导加载程序中所做的配置。

  • 关闭Systick时钟并清掉其计数;
  • VTOR中断向量寄存器恢复为之前的默认值;
  • 我们的引导程序以PEE模式运行。因此,我们应该将其更改为FEI模式;
  • 禁用所有引脚。

运行这些代码时,应禁用全局中断,并且不要忘记重新使能全局中断。

calvinji_7-1628521529598.png

图8. 反初始化代码

然后我们可以转到应用程序。

calvinji_8-1628521529641.png

图9.转到应用程序

3. 内存重定位

FRDMK64具有1M闪存,从0x00000000到0x00100000。如图10所示,我们使用0xa000作为应用程序的起始地址。

calvinji_9-1628521529658.png

图10:内存映射

现在,我将向您展示如何在不同的IDE中为用户应用程序修改链接文件。

在IAR中:

calvinji_10-1628521529936.png

图11:IAR的ICF

在MDK中:

calvinji_11-1628521529997.png

图12.MDK的SCF

在MCUXpresso中:

calvinji_12-1628521530057.png

图13. MCUXpresso的闪存配置

4. 运行演示

1)首先下载引导程序;

2)准备一个用户应用程序。 我们以“led blinky为例;

3)修改链接文件;

4)用您的IDE生成二进制文件,请将其命名为“a000.bin”;

5)将其放入SD卡中,如图5所示。

calvinji_13-1628521530067.png

图14:SD卡的内容

6)插入卡,并打开电源。请稍等片刻,该应用程序将自动执行。

calvinji_14-1628521530206.png

5. 参考资料

1) Kinetis MCU的bootloader解决方案

2) KEA128_can_bootloader

Labels (1)
Attachments
No ratings
Version history
Last update:
‎08-09-2021 08:22 AM
Updated by: