|
微控制器上的引导加载程序是非常有用的。它使得我在需要时能够现场进行更新固件。有很多方法可以使用和制作引导加载程序。但是这样的引导程序在FLASH中需要一些空间,而且需要先在空白器件上编程,因此需要一个JTAG编程器。这就是为什么供应商已经开始在他们的器件中包含一个ROM引导加载程序:微控制器出厂时在FLASH中预装了一个引导加载程序。所以,我不需要自己编写引导加载程序,而是使用在ROM中的引导加载程序。
和所有的方法一样,这种方法也有利弊。
简介
在一些最近推出的NXP Kinetis微控制器都包括了一个ROM引导加载程序。本实验中我选择了恩智浦FRDM-KL03Z开发板,因为它价格比较低廉(低于20美元),并且包含一个可用于较小应用程序的小型微控制器。而且KL03Z出现在Ultimate Hacking Keyboard上,后者引起了我的兴趣。在本文中,我将分享在使用KL03Z(ARM Cortex-M0 +、32 KB FLASH、2 KB SRAM和24 QFN封装)中的ROM引导加载程序过程中的经验:
本文中使用的源代码可以在GitHub上找到。
引导加载程序?
NXP Kinetis引导加载程序(KBOOT软件)版本v2可以在www.nxp.com/kboot下载。恩智浦提供三种不同的样式:
• Flashloader:该引导加载程序是“一次性引导加载程序”,会永久保留在FLASH中,不管是出厂设置还是用户编程。引导加载程序区域可以被应用程序覆盖,因此应用程序可以使用完整的FLASH存储器。但只能更新应用程序一次,除非应用程序本身包含引导加载程序。 Flashloader无需JTAG编程器就可以对器件编程。 KBOOT软件包中带有几个示例应用程序。
• Flash-Resident Bootloader:此引导程序是位于FLASH存储器中的“传统”的引导加载程序。官方提供了源代码,我可以完全对其进行配置,但是最初需要一个JTAG编程器来编程器件。KBOOT软件包包含了不同开发板的几个示例。
• ROM Bootloader:此引导加载程序存在于所有Kinetis器件上,并且带有引导ROM,包括KL03Z。它基本上是Flash-Resident Bootloader的特殊版本,编程到器件的ROM中。但是,除了参考手册中的信息之外,还没有提供源文件或任何其他信息。
有很多与Bootloader进行通信的不同方法(I²C、SPI、UART、USB HID、USB MSD、CAN)。引导加载程序使用特殊的通信协议,KBOOT软件包括GUI和命令行实用程序来与设备进行通信。
ROM Bootloader
ROM引导加载程序位于从0x1c00200地址开始的ROM中,并在引导加载程序运行时使用RAM的一部分:
注意:有可用的ROM引导加载程序的源代码和内存映射图是非常有用的。这样的话,就可以从应用程序重新使用一些引导加载程序函数来节省FLASH空间。
引导加载程序可以通过使用以下代码由应用程序调用: - static void RunRomBootloader(void) {
- uint32_t runBootloaderAddress;
- void (*runBootloader)(void *arg);
-
- /* Read the function address from the ROM API tree. */
- runBootloaderAddress = **(uint32_t **)(0x1c00001c);
- runBootloader = (void (*)(void * arg))runBootloaderAddress;
-
- /* Start the bootloader. */
- runBootloader(NULL);
- }
复制代码
使用上述代码,应用程序可以随时进入引导加载程序。
引导启动
在POR(上电复位)或正常复位期间,可以进行配置微控制器是进入ROM引导加载程序,或者是直接从正常FLASH引导启动。
这是由以下几件事情控制的:
• FORCEROM:两个位,用于配置始终进入ROM引导加载程序。如果这些位不为零,它始终进入ROM引导加载程序。
• BOOTPIN_OPT:FOPT寄存器的一部分。如果该位为零,它将启用检查可选的引导加载程序使能引脚(KL03Z为NMI):如果该引脚拉低,则它进入ROM引导加载程序
• BOOTCFG0引脚:这是由BOOTPIN_OPT设置启用的引脚(KL03Z为NMI引脚)。
• BOOTSRC_SEL:FOPT寄存器的一部分。如果设置为10或11,则进入ROM引导加载程序:
以下是引导过程的流程图:
进入引导加载程序 如果满足以下条件,则进入ROM引导加载程序: • FORCEROM设置为非零值 • 或者:Bootloader引脚配置为BOOTPIN_OPT,该引脚被置位(NMI) • 或者:BOOTSRC_SEL设置为10或11
NMI引脚位于KL03Z32VFK4的引脚19上:
在FRDM-KL03Z开发板上,NMI引脚连接到SW3按钮:
按钮位于FRDM-KL03Z开发板的以下位置:
引导程序引脚复用
如上所述,NMI引脚可用于进入引导加载程序。 引导加载程序可以通信的引脚在参考手册中有记录。 KL03Z可以通过UART、SPI和I²C进行通信:
UART(PTB1、PTB2)连接到K20的OpenSDA USB CDC,I2C(PTB3,PTB4)连接到J2插头:
|