Flash Bootloader

1 欢迎使用 Flash Bootloader 用户手册

1.1 Flash Bootloader 的初学者从这里开始?

您需要有关此文档的一些信息吗?(请查看第3.1章)

什么是Flashing?(请查看第3.3章)

什么是 Flash 引导加载程序?(请查看第2章)

1.2 对于高级用户

从这里开始阅读。(请查看第4章)

Flash Bootloader 集成的 5 个步骤。(请查看第5章)

1.3 专题

为什么我需要 2 个中断向量表?(请查看第4.6章)

如何定义我的应用程序有效?(请查看第4.4章)

验证OK,但应用程序无效......(请查看第7.3章)

如何处理我的看门狗?(请查看第7.1章)

1.4 此文件参考...

FlashTool 文档

OEM 特定文档

硬件特定文档

图 1-1 Flash Bootloader 的手册和参考资料

Flash Bootloader 可以分为一个通用部分,即等同于所有 Flash Bootloader 以及依赖于 OEM 要求和硬件特性的部分。本用户手册中描述了所有常见主题。在指示时使用参考资料来确定您的 Flash Bootloader 的细节。有关 Flash Bootloader 的 OEM 细节,请参阅: TechnicalReference_FBL_<OEM>.pdf。参考本文档的 ID 类似于:[#oem_<xxx>]。您可以在相应的标题中找到此 ID。有关 Flash 引导加载程序的硬件细节,请参阅: TechnicalReference_FBL_<hardware>.pdf。参考本文档的 ID 类似于:[#hw_<yyy>]。您可以在相应的标题中找到此 ID。

2 关于本文档

本文档让您了解Flash Bootloader。您将收到一般信息、启动和运行 Flash Bootloader 的分步教程、有关诊断服务的详细信息、实施看门狗的说明以及有关 Flash 工具的说明。这是通用 Flash Bootloader 文档,独立于 oem 特定设置或硬件。有关 OEM 解决方案或硬件依赖项的更多信息,请参阅这些特定文档。

2.1 本文档是如何设置的

章节内容

第 1 章 欢迎页面允许在整个文档中轻松导航。

第 2 章 包含有关本文档的一些正式信息,以及图例和符号的解释。

第 3 章 简要介绍了闪存以及构成 Flash Bootloader 的不同部分。

第 4 章 提供有关闪存过程的详细信息,说明验证概念以及两个中断向量表的实现。

第 5 章 介绍了集成 Flash Bootloader 和使用 Vector Flash Tool 下载应用程序的五个基本步骤。

第 6 章 介绍如何使用 OEM-Specific flash 工具下载应用程序。

第 7 章 列出了在集成引导加载程序时遇到的一些常见问题及其正确的解决方案。

2.2 符号的说明和说明

这些符号位于文档的右侧。它们指示文本中的特殊区域。这是它们含义的列表。

 注:文本右侧的这些区域包含有助于您搜索特定主题的简短信息项。

3 Flashing – 概览

3.1 什么是Flashing?

在刷写过程中,必须以十六进制格式(使用 Flash 工具)提供的应用程序(或其中的一部分)被传输到 ECU 的内存中。这种传输是通过 CAN、LIN、FlexRay 等总线协议完成的。

注:Flash Bootloader 通过 CAN 将应用程序作为 hex 文件下载到 ECU。

图 3-1 什么是Flashing

要将您的应用程序转移到目标平台,您只需要 Flash Bootloader、PC 或笔记本电脑、CAN 卡和 Flash 工具。使用仿真器、BDM 工具或类似工具在已经内置的 ECU 中执行Flashing会很昂贵。此外,BDM 或仿真器的 ECU 硬件接口并不总是可访问的。该接口基于作为物理层一部分的 CAN 总线、传输协议,以及用于诊断服务规范的 KWP2000。对于新节点和工具之间的闪存数据交换,您需要两条 CAN 消息,一条用于请求,一条用于响应。

注:PC 或笔记本电脑、CAN 卡和闪存工具——这就是您Flashing所需的一切。

3.2 Flashing时会发生什么?

闪存驱动程序(闪存算法)通过总线协议下载。之后,应用程序被下载并写入(闪存)到闪存中(使用闪存驱动程序)。

3.3 什么是 Flash Bootloader?

Flash Bootloader 是嵌入式软件和 PC 工具的组合,旨在通过总线协议(例如 CAN)对 ECU 软件进行刷新。因此 Flash Bootloader 分为 3 个部分,Bootloader、Flash Driver 和 Flash Tool。

图 3-2 Bootloader、Flash Driver 和 Flash Tool 构成 Flash Bootloader

3.4 Bootloader

Bootloader 是一个独立的程序。它与您的应用程序分开编译、链接和下载到 ECU。 Bootloader 和您的应用程序永远不会同时运行。 Bootloader 使用闪存,位于 ECU 的受保护区域。如果您的 ECU 不支持这样的硬件保护,Bootloader 将保护自己不被覆盖。

图 3-3 引导加载程序和您的应用程序永远不会同时运行

引导加载程序通过闪存编程器或刻录机传输到目标平台,这取决于硬件(它不是通过 CAN 下载的)。

注:当 Bootloader 通过 CAN 下载数据时,它包含一个 CAN 驱动程序和一个传输协议。

3.5 闪存驱动程序

闪存驱动程序(实际闪存算法)是用于执行闪存功能的硬件相关代码。在大多数情况下,从闪存编程闪存是不可能的。因此,闪存驱动程序被下载并执行到 RAM 中以允许对应用程序进行编程。将闪存算法下载到 RAM 的优势在于无需重新编程主引导加载程序即可更新闪存算法。下载完成后,算法会从 RAM 中清除,以避免在应用程序中意外调用闪存函数。

注:闪存驱动程序在 RAM 中运行的原因:

        物理原因

        防止错误调用删除闪存

        保存 ROM 内存

        易于更新。

在特殊情况下,闪存算法保存在闪存中,并在需要时复制到 RAM。当然,当使用此配置时,更改闪存算法的可能性不再可用。此外,闪存可能会因意外调用这些函数而被无意擦除。纠正这种情况的补救措施是加密相应的程序代码,例如异或等。

3.6 Flash 工具

Flash 工具是基于 Windows™ 的 PC 工具,用于控制应用程序的下载。 Flash Tool 读取已编译和链接的应用程序数据(Motorola-S 或 Intel Hex 格式),触发和控制 flash 过程,通过总线协议(例如 CAN)传输数据,并通过校验和验证该过程。要进行下载,您还需要一个 CAN 卡(CANcardXL、CAN AC2-PCI)将您的硬件连接到 PC。下图显示了引导加载程序、闪存驱动程序、应用程序以及它们如何进入控制器的内存。由于 Bootloader 是使能 Flash Driver 和应用程序下载的组件,它不能自行传输。这项工作必须由合适的程序员或刻录机(开发环境)完成。

图 3-4 软件组件下载顺序及方式

图中的数字显示了下载顺序,首先是 Bootloader,然后是 Flash Driver,以便能够刷新应用程序。

3.7 Flash Bootloader 做什么 „

初始化 CAN 控制器

通过 CAN 发送诊断信息 

通过 CAN 接收诊断信息 

擦除和编程闪存

3.8 Flash Bootloader 不做什么

它不是“即用型”程序:

调整回调函数、启动/初始化是必要的 

适应运行时环境和特定的硬件要求是必要的

4 Flashing - 更详细的视图

4.1 Bootloader 总是首先启动

正如您现在所知道的,一方面,Bootloader 驻留在受保护的区域中,并且始终驻留在 ECU 上。另一方面,不能保证 ECU 中也存在有效、可执行的应用程序。这就是为什么 Bootloader 总是在复位后首先执行的原因。然后决定是启动应用程序还是留在引导加载程序中。

注:Flash Bootloader 在复位后或直接从您的应用程序中调用。

图 4-1 引导加载程序和您的应用程序之间的转换,反之亦然

可以使引导加载程序以不同的方式启动,从您的应用程序开始,然后在复位后启动。

4.2 复位后Flashing 

Flash Bootloader 总是在复位后首先执行。此时,引导加载程序必须确定是否已刷新有效应用程序。该测试是通过使用 ApplFblIsValidApp 函数完成的。

您将在第 4.5 章中找到一些示例策略,说明如何将应用程序设置为有效或无效。

函数 ApplFblIsValidApp(见图 4-1)的返回值用于决定进程是否应该分支到应用程序中,或者 ECU 是否应该保留在 Flash Bootloader 中。此函数中的代码以及您决定应用程序是否有效的方式取决于您。

注:重置后,ApplFblIsVali dApp 函数决定是否分支到应用程序。

如果应用区域为空白或代码错误,则引导加载程序等待诊断 CAN 消息以启动闪存过程,即闪存驱动程序被加载到 ECU 的 RAM 内存并启动。现在正在下载应用程序,这是实际的闪存过程。

该应用程序通过三个函数 ApplFblIsValidApp、ApplFblValidateApp 和 ApplFblInvalidateApp 连接到 Flash Bootloader。这些函数用于操作验证区域。

对于某些 OEM,函数 ApplFblValidateApp 和 ApplFblInvalidateApp 的名称可能略有不同。请参阅您的 OEM 特定文档以获取更多详细信息 [#oem_valfunc]。

在下文中,这三个函数有时仅缩写为 IsValid、Validate 和 Invalidate。这些缩写出现在以下大多数图中。

4.3 您的应用程序启动Flashing过程

另一种启动刷机过程的方法是通过您的应用程序及其诊断程序。

在 Flash Bootloader 操作应用程序区域中的数据之前,调用函数 ApplFblInvalidateApp 将验证区域设置为无效。然后 Flash Bootloader 下载新应用程序(相应的 hex 文件)并执行复位或直接启动应用程序(取决于 OEM [#oem_start])。在启动应用程序之前,函数 ApplFblValidateApp 再次验证应用程序。

在开始Flashing之前,应用程序必须设置为无效。如果刷写过程失败或被中断,这可以防止启动部分刷写的应用程序。

4.3.1 可能会发生什么?

想象一下您的有效性检查结果是一个有效的应用程序,但它实际上是错误的。每次复位都会导致应用程序无法正常工作,并且看门狗将再次引发复位。现在该软件处于无限循环中。

在这种情况下,无法再次刷新应用程序。请参阅第 7.3 章(验证正常 - 应用程序错误)中的可选解决方案。

4.4 验证概念的处理

Flash 机制的概念旨在允许最大的灵活性以及非常容易的实现。您需要注意的主要事情是仅在Flashing有效版本时调用应用程序。您识别有效版本的方式取决于您,并在所谓的验证区域中实现。

4.4.1 验证区

在此区域中,您可以存储有效应用程序的指标。这可以是一个简单的标志,指示有效,甚至可以是用于检查应用程序有效性的代码。在后一种情况下,ApplFblIsValidApp 应在调用此函数之前对其进行检查。

4.4.2 访问验证区

如前所述,Bootloader 提供了 3 个函数来访问验证区。这些功能位于引导加载程序中,编码必须由您完成。功能是:

4.4.3 ApplFblIsValidApp

该功能检查应用程序的有效性。返回值决定了进一步的操作(见图 4-1)。

由于每次复位都会调用此函数,因此建议仅检查先前设置的标志。这加快了重新启动时间。

4.4.4 ApplFblValidateApp

此功能通过直接访问验证区域来将应用程序标记为有效。在闪存过程之后,调用函数 ApplFblValidateApp 来检查闪存应用程序的有效性并设置指标(例如标志、某个内存位置等)。 IsValid 函数在复位时使用这些指标。

注:使用以下建议来稍微熟悉由这个概念引起的配置的可能性。

4.4.5 ApplFblInvalidateApp

该函数在擦除闪存之前调用。在此您重置您的指示器并将应用程序标记为无效,以避免在Flashing时发生可能的重置或错误而不会使部分擦除或编程的应用程序无效的情况。

验证功能的实现是特定于应用程序的,但是,一旦实现了解决方案,它就无法更改,除非重新编程引导加载程序。

4.5 处理验证区域的建议

以下三个示例是如何处理 Flash Bootloader 提供的验证概念的示例。在开始根据此处提到的概念制定自己的策略之前,请参阅 OEM 特定文档 [#oem_valid],以防您的 OEM 希望您以预定义的方式执行此操作。

4.5.1 建议 A

在这个概念中,验证区域只是一个标志。这是实现验证概念的最简单方法:

图 4-2 仅在验证区域中使用标志

IsValid 函数中的代码必须知道标志在验证区域中的位置。重置后,此标志的内容显示应用程序的有效性。如果您通过 CAN 开始Flashing,则“无效”功能会在擦除之前清除标志。Flashing后,“验证”功能设置标志。然后在复位后,“IsValid”函数识别要设置的标志并返回一个正值。申请有效,可以执行。

如果您可以保证标志(或字节)是编程时要擦除的第一个字节和要写入的最后一个字节,则可以将 Invalidate 和 Validate 函数留空。

确保有效指示符不同于空白的、不存在的闪存内容。

4.5.2 建议 B

基于此概念,您可以将应用程序分成单独的部分。内存映射见下图。应用程序的部分被命名为模块 n。每个模块都需要一个自己的验证区域。

图 4-3 将您的应用程序分成几个模块

要了解模块的位置、大小和验证区域的位置,您应该添加一个模块表。此表包含后者信息,并允许访问模块的单个验证区域。访问是通过已知函数 IsValid、Validate 和 Invalidate 完成的。在使用模块表之前,请确保此信息在内存中。使用例如一个检查字节来确保这一点。

该校验字节的位置取决于擦除和写入闪存的顺序。它应该作为该模块表区域中的第一个字节被擦除,并且仅当整个模块表区域有效时才写入。

4.5.2.1 模块表

FBL_MTAB 文件包含闪存擦除扇区表(更多关于中断向量表的信息,请参见下文)。每当调用扇区可选擦除服务时,Bootloader 都会扫描此表以获取必须擦除的扇区的地址和长度信息。

如果引导加载程序配置已针对仅下载一个模块进行了优化,则不需要闪存擦除扇区表。

FBL_MTAB 的位置提供了很大的灵活性。无需修改引导加载程序即可更改模块的内存大小。要扩展模块的数量,您可以向表中添加更多条目。

如果更改闪存擦除表不可行或没有必要,也可以编译该表并将其链接到引导加载程序的受保护区域。这样做的好处是该表不能被擦除。

4.5.3 建议 C

最后一个例子使用了一个验证函数,而不是上面两个例子中显示的标志。

此验证功能驻留在应用程序中,并与应用程序一起编译和链接。因此,在调用此函数之前,您应该注意代码已正确刷新。对于这种需求,您可以使用提案 B 中所示的校验字节。

图 4-4 使用验证函数验证您的应用程序

4.6 中断向量表

使用 Flash Bootloader 的应用程序以特殊方式处理中断。当应用程序使用 Flash Bootloader 时,必须保证复位向量始终指向 Flash Bootloader。复位后,首先启动 Flash Bootloader。

注:应用程序和 Flash Bootloader 都有自己的中断向量表可供使用。

通常ECU向量表是闪存保护区域的一部分,但是应用中断服务函数地址的复位向量必须是可变的。

这个问题的解决方法在于使用2个中断向量表,如下图所示。

图 4-5 两个中断向量表的原理

Flash Bootloader 使用硬件提供的内存地址处的中断向量表(中断向量表 [FBL])。您的应用程序必须使用自己的向量表(中断向量表 [应用程序])。

注:每个通过 Reset 产生的中断都直接进入 Flash Bootloader

现在,如果发生不是复位的中断,则在硬件侧控制分支到地址位于 Flash Bootloader 中断向量表中相应位置的存储器位置(见图 4-5)。除复位外的任何中断都指向应用程序的中断向量表。在您的应用程序中,向量表控制现在分支到相应的中断服务功能。

结果,检测中断和调用中断服务函数之间的轻微开销被添加到每个中断服务函数中。延迟是跳转指令的持续时间。

一个例外是复位中断。它始终指向 Flash Bootloader。

没有从复位到应用程序的直接路径。在 Flash Bootloader 中工作的 CAN 驱动程序本身不需要中断,因为它在轮询模式下运行。它循环检查是否已收到 CAN 消息。通常情况下,不会通过中断指示接收。因此,Flash Bootloader 的向量表中不需要额外的中断服务函数。

您将在第 6.2.4 节中找到有关调整中断向量表所必须处理的修改的更多细节。

请参阅特定于硬件的文档 [#hw_intvect] 以获取更多详细信息。

4.7 标签参考文件

一些地址信息需要在您的应用程序和引导加载程序之间共享。应用程序和引导加载程序都引用了一些文件,例如应用程序向量表和模块表。这些文件通常位于应用程序区域,因为它们可能会发生变化(模块表、中断向量表)。

这些文件的数据内容可能随时被删除,因为它们位于非保护区。在特殊情况下,Bootloader 最终会使用这些文件。因此,应用程序需要编译这些文件并将其链接到相同的内存位置。包含这些文件的模块应作为第一个模块下载,以便在需要时向引导加载程序提供数据。这确保了正确的引导加载程序执行。

请参阅 OEM 特定文档 [#oem_ref]。

5 Flashing中的5个步骤

第1 步:设计内存布局

        确定必须将哪个组件放置在哪个内存位置。估计尺寸。

第 2 步:编写测试应用程序

        这可以是任何应用程序,也可以是您以后用于 ECU 的应用程序。非常重要的是,该应用程序运行正确并且您可以识别它的运行。此应用程序是 Flash Bootloader 功能正确的证据。

第 3 步:集成引导加载程序

        在此步骤中,您必须集成引导加载程序,通过编程器或刻录机下载并使用 Flash 工具对其进行测试。这是要完成的主要步骤!阅读此步骤的介绍或直接进入 8 Bootloader 集成步骤。

第 4 步:为测试仪调整您的测试应用程序

        要准备通过测试仪下载的应用程序 hex 文件,必须将其转换为 OEM 特定格式。在此步骤中执行此操作并参考您的 OEM 提供的说明。

第 5 步:使用测试仪下载您的测试应用程序

        现在像以前一样下载测试应用程序,但现在使用 OEM 特定的测试仪。

图 1:5 个步骤,您正在通过 Flash 工具和 OEM 特定的测试仪进行Flashing

5.1 第1步 设计内存布局

由于闪存是与内存相关的活动,因此您首先需要对内存消耗进行基本估计。根据您使用的控制器和内存模型,从内存布局的基本设计开始。

定义应用程序的位置,定义应用程序向量表和引导加载程序的位置。找出你的控制器在哪里有它的“原始”中断向量表。

有关详细信息 [#hw_mem],请参阅特定于硬件的文档。

图 5-1 带有 Flash Bootloader 的应用程序的基本内存布局

5.2 第2步 编写测试应用程序

Flash Bootloader 旨在通过 CAN、LIN 等总线协议下载您的应用程序。要测试 Flash Bootloader 的正确功能,您首先需要一个测试应用程序来验证 Flash Bootloader 的工作。

在这一步中,编写一个测试应用程序。

图 5-2 ECU 内存中使用两个中断向量表的测试应用程序

建议编写至少有一个中断服务函数的测试应用程序,也许是一个定时器来做一些循环动作。确保应用程序显示其正确的行为,例如通过 LED 闪烁甚至 CAN 消息的传输。这将在稍后显示正确工作的 Flash Bootloader 的指示器。

通过您的开发环境下载并测试此应用程序。

建议从一开始就使用两个中断向量表。只需将所有中断从“原始”向量表映射到应用程序的中断向量表。

有关详细信息,请参阅特定于硬件的文档 [#hw_tstappl]。

5.3 第3步 集成引导加载程序

这是您要做的主要步骤。您必须解压缩交付的文件,进行一些特定于应用程序的调整,编译引导加载程序并下载它。

为了测试引导加载程序,您需要刷新您在上一步中创建的测试应用程序。

为此,您应该在测试之前正确配置 Flash 工具。使用 Flash Bootloader 包的 Flash Tool 下载您的测试应用程序。一旦你设法让你的引导加载程序与 Flash 工具一起工作,你就可以继续使用 OEM 特定的测试工具。现在嵌入式端正在工作,您可以专注于调整 OEM 特定的测试仪。

图 5-3 通过 Flash Tool 和 OEM-specific Tester 刷机

该应用程序被编译为一个十六进制文件,以便与 Flash 工具一起使用。 Flash Tool 通过总线系统(此处为 CAN)控制下载并与 Bootloader 通信。为了能够使用 OEM 特定的测试仪进行闪存,必须对应用程序 hex 文件进行一些调整。有关详细信息,请参阅 OEM 提供的有关此工作流程的文档。

在继续下一步之前,请遵循引导加载程序的 8 个集成步骤(参见第 6 章)。

注:在 8 个步骤中集成 Bootloader 更多……(参见第 6 章)

5.4 第4步 为测试仪调整您的测试应用程序

下载测试应用程序后的下一步是调整您的 <application.hex> 文件,以便通过 OEM 特定的测试仪下载(参见步骤 3 中的说明)。

要测试这些适配,无需更改引导加载程序软件。

通常需要几个步骤才能将十六进制文件转换为测试仪可以读取和使用的文件。使用 OEM 提供的文档获取有关此工作流程的更多信息。

5.5 第4步 使用测试仪下载您的测试应用程序

现在您可以使用您的 OEM 特定测试仪测试引导加载程序。您可以测试诸如通过复位触发或从应用程序启动的 Flash 编程等。

它仍然有效吗?

恭喜你,你做到了!

6 Bootloader 集成步骤(第 3 步)的详细信息

Bootloader 第 1 步:将文件解压缩到 PC 上的文件夹中

Bootloader 第 2 步:调整文件以适合您的应用程序

Bootloader 第 3 步:现在编译 Bootloader

Bootloader 第 4 步:将 Bootloader 传输到目标硬件

Bootloader 第 5 步:使用 Flash Tool 测试 Bootloader

Bootloader 第 6 步:测试复位后的Flashing

Bootloader 第 7 步:使您的应用程序准备好过渡到 Bootloader

Bootloader 第 8 步:从您的应用程序启动 Bootloader

图 6-1 Bootloader 集成步骤的详细信息(步骤 3)

6.1 Bootloader 第1步 – 将文件解压到您电脑上的文件夹中

只需启动 install shield 即可提取 Flash Bootloader 文件。默认情况下,文件安装到文件夹 C:\Programme\Vector\...。您也可以使用 Start\Programme\Vector... 来查找您的安装。

这些文件使用以下目录结构安装。

名称                                描述

StandardECU                 交付的根目录,根名称可能不同。
         _Common              包含应用程序和引导加载程序之间共享的公共文件。

                                        [例如。 v_def.h 等]

        _Demo                    包含一个示例实现。

                DemoAppl       准备通过 Flash Bootloader 和 CANflash 下载到 micro 的应用程序。                 DemoFbl         演示的引导加载程序部分。该目录包含一个全功能引导加载程序的示例(例如,包括输入/​​验证、从应用程序到引导加载程序的转换以及引导加载程序部分的全面映射)。         

        _Doc                        包含引导加载程序的文档和测试报告。

                                        [例如。 UserManual_FlashBootloader.pdf、TechnicalReference_FBL_*.pdf、TestReport*.pdf 等]

        _FlashScript            CANdito 随引导加载程序提供的闪存脚本。仅当存在可用于 SLP 的 flashscript 时,此目录才存在。

        _GenTool                用于闪存引导加载程序配置文件的生成工具。对于 CANgen,许可证文件位于此处。

                                        [例如。 CanGen.exe、license.liz、GENyFramework_*.exe 等]

                Components    GENy 组件-DLL 的目录。如果使用 GENy,可以在此处找到许可证。否则,此目录不存在。

                                        [例如。 license.liz、Version.Info、preconfig*.pco 等]

        _MakeSupport        演示引导加载程序和应用程序使用的制作环境。此文件夹包含全局生成文件。

                                        [例如。 Global.Makefile.target.make.*, etc.]

        _Misc                       所有不适合其他目录的东西都可以放在这里(例如小工具,不需要安装程序)                 

                HexView          生成、编辑和处理 hex 文件的最佳工具。也可以构建大量的闪存容器。

        _Setup                     交付中包含的 PC 可安装软件的设置文件(例如 CANflash)

                                        [例如CANflashFord25.EXE 等]

        DrvEep                    与引导加载程序一起使用的 EEPROM 驱动程序

                                        [例如EepDrv.c、EepIO.c、EepCfg.h 等]

        DrvFlash                 Flash-EEPROM-驱动程序与引导加载程序(又名辅助引导加载程序)一起使用。此目录包含驱动程序的源文件和用于使用的 SLP 的即用型函数文件容器。

                                        [例如。 flashdrv.c、flashdrv.h、FlashDrv_V850_f.hex 等]

        Fbl                           包含所有引导加载程序文件,除了闪存驱动程序和安全模块

                                        [e.g. fbl_main.c、fbl_hw.c、fbl_diag.c 等]

                _Template       包含作为闪存引导加载程序的一部分但需要针对集成目的进行调整的文件。这些文件包含一组回调函数,它们分组在不同的文件中,用于不同的目的。这些功能主要适应引导加载程序对特定项目的特定需求。适应引导加载程序的硬件要求。

                                        [例如。 _fbl_ap.c、_fbl_apdi.c、_fbl_apwd.c、_fbl_apfb.c 等]

                SecMod           引导加载程序的安全模块。

                                        [例如。 secmod.c、_secmod.h 等]

表中列出的文件安装到文件夹 Fbl。带 _(下划线)的文件安装到文件夹 Fbl\_Template 中,v_def.h 位于 _Common 路径中,flashdrv.h 位于 DrvFlash 文件夹中。

文件名                                 描述

项目文件的 Makfile             Makefile 或 Bootloader 构建过程的项目文件。

fbl_cfg.h                              全局引导加载程序配置。该文件由配置工具生成。

_fbl_apxx.c / _fbl_apxx.h    硬件和系统特定的回调函数。

_ftp_cfg.h                            传输层配置文件。很快,这个文件也被配置工具生成了。

_fbl_inc.h                            引导加载程序的包含文件。如有必要,包括其他头文件。

_applvect.c / applvect.h      应用程序向量表

fbl_diag.c / fbl_diag.h          包含诊断处理 (KWP2000) 和基本引导加载程序功能的通用诊断模块。

fbl_can.h CAN                     接口定义。

fbl_def.h                              基本引导加载程序定义。

fbl_hw.c / fbl_hw.h CAN      和定时器的硬件特定模块。

fbl_main.c                            用于引导加载程序初始化和空闲循环的主模块。

fbl_tp.c / fbl_tp.h                  FBL 的传输层。

fbl_vect.c                             引导加载程序向量表。

fbl_wd. /fbl_wd.h                 看门狗支持。

flashdrv.h Flash                   驱动程序的接口头文件。

v_def.h                                来自 Vector Informatik 的类型定义

小心:绝对有必要将引导加载程序的启动代码调整到您的特定硬件平台!提醒一下,随后会执行两个启动代码,首先是 Bootloader 的启动代码,然后是应用程序的启动代码。 !!!注意复位后只能写入一次的寄存器!

您可以根据您的应用程序调整这些文件(fbl_vect 不能由用户调整)。关于如何处理的详细描述可以在第 6.2 节中找到。在您的交付中,您必须调整的所有文件都在名称前用下划线 (_<file>) 标记并存储在 _Template 文件夹中。创建一个自己的文件夹来存储不带下划线的改编文件。

OEM 特定 - 更多文件,请参阅您的 OEM 特定参考 [#oem_files]。

6.2 Bootloader 第2步 调整标记的文件以适合您的应用程序

现在您将详细浏览上图中手所指向的文件,并专门针对您的应用程序调整它们。

6.2.1 Make... Makefile 和 make.exe

为了能够编译 Flash Bootloader,您只需通过设置编译器路径来适应文件 makeconf 以适应您的需求,请参见示例,

例如COMPILER_PATH = c:\uti\hc12\cx32

然后就可以执行make.exe进行第一次编译链接了。现在您可以在此基础上开始调整文件以满足您的需求。

6.2.2 fbl_cfg.h - Flash 引导加载程序的配置文件

如果您将生成工具与引导加载程序一起使用,则生成工具会创建该文件。要修改引导加载程序,您只需再次触发生成过程。如果您没有将生成工具与引导加载程序一起使用,那么您可以通过修改时钟频率、CAN 波特率等定义来手动配置引导加载程序……

请参阅下面要更改的可能开关列表以及简要说明。要获得更多信息,请参阅文件 fbl_cfg.h 中的注释。

CAN_TP_RXID 传输协议的接收

ID CAN_TP_TXID 传输协议的发送

ID FBL_ENABLE/DISABLE_DEBUG_STATUS 调试的附加提示(如果可能)

FBL_ENABLE/DISABLE_SYSTEM_CHECK 检查数据缓冲区是否将被覆盖

FBL_ENABLE/DISABLE_FLASHBLOCK_CHECK 检查并对齐 FBL_AP 中的预定义闪存块下载

FBL_ENABLE/DISABLE_APPL_TASK 启用循环任务以进行一些时间调整(调用周期 TpCallCycle typ. 1ms)。

FBL_MAX_NUMBER_OF_MODULES 在此处设置应下载和编程的模块数。

FBL_ENABLE/DISABLE_SECTOR_ERASE_FCT 启用回调函数 ApplFblSectorErase()

FBL_ENABLE/DISABLE_FILECHECKSUM 启用内部文件校验和计算。此校验和在下载序列期间生成

FBL_ENABLE/DISABLE_ENCRYPTION_MODE 如果启用此开关,则会调用更多函数来解密编码数据。 (ApplFblEncryptInit,ApplFblEncryptData)。

FBL_WATCHDOG_ON/OFF 打开或关闭看门狗

FBL_WATCHDOG_TIME 看门狗触发周期的设置

FBL_PROCESSOR_40MHZ 某些时钟设置可能不适用于所有 CPU。请参考 fbl_hw.c,FblTimerInit

FBL_ENABLE/DISABLE_STAY_IN_BOOT 设置 FBL_DISABLE_STAY_IN_BOOT,无法强制引导加载程序不启动应用程序。

FBL_DIAG_BUFFER_LENGTH 这是用于 USDT 接收/传输的诊断数据缓冲区的大小(COMMON_BUFFER 模式)。

FBL_START FBL 的起始地址。

FLASH_SIZE 指定用于 Flashcode(又名闪存驱动程序)的字节数。注意:分配尽可能多的内存,以便将来能够下载更大的闪存驱动程序。

CAN_BTR01 普通模式的总线时序配置

6.2.3 FBL_apxx.C

接下来要做的就是使 Flash Bootloader 适应您的应用程序和硬件。必须调整以下功能:

注:根据您的需要设置和初始化这些功能。执行此操作时,请按照每个说明进行操作,并使用图 6-2 获得完整概述。

 您将在图 6-2 中再次找到这些函数。

图 6-2 Flashing期间的函数调用顺序

看门狗只能在两个可选功能之一中初始化。在大多数情况下,这是函数 ApplFblInit。关于看门狗处理的背景和可能性的更多细节可以在第 7.1 节中找到。

下面对函数的描述与它们从重置开始的调用顺序相同。

6.2.3.1 ApplFblInit

ApplFblInit 函数在每次复位后被调用。您可以进行基本的初始化,例如内存映射、PLL 设置等。通常这里处理看门狗定时器的初始化。 (有关详细信息,请参见 3.3)。

6.2.3.2 ApplFblCanParamInit

回调函数用于多 ECU 支持。见 7.2。

6.2.3.3 ApplFblIsValidApp

回调函数检查应用程序的有效性。见 4.4.2。

6.2.3.4 ApplFblStartup

如果没有找到有效的应用程序或应用程序启动了引导加载程序(重新编程请求),则在 ApplFblInit 之后调用此函数。使用此函数执行应用程序和引导加载程序所需的初始化。如果您想初始化明确用于引导加载程序的硬件或软件,这很有用。

6.2.3.5 ApplFblWDInit

函数 ApplFblWDInit 仅在复位后控制仍保留在 Flash Bootloader 中时调用。

注:确保只在一个位置初始化看门狗定时器

如果您还没有在 ApplFblInit 函数中初始化您的 Watchdog(参见 6.2.3.1),您也可以在此处初始化您的 Watchdog(有关看门狗的更多详细信息,请参见 3.1)。

示例:

void ApplFblWDInit(void)

{

你的看门狗初始化代码可以放在这里,或者什么都不放,如果你不使用它或者你想在其他地方初始化它。

}

6.2.3.6 ApplTrcvrNormalMode

这个函数的名字是不言自明的。要发送 CAN 消息,首先需要设置收发器。这可以在这里完成。

示例:

void ApplTrcvrNormalMode(void)

{

        DDRCAN = 0xff; /* 设置端口方向 */

        PORTCAN = 0x30; /* 设置端口 */

}

6.2.3.7 ApplFblSecuritySeed / Key

请参阅您的 OEM 特定文档 [#oem_sec] 以获取必要信息。

6.2.3.8 ApplFblSetVfp

是否需要配置此功能取决于您的硬件设置(某些闪存需要外部编程电压来擦除和编程)。如果您必须打开电压进行闪存编程,您可以在此功能中执行此操作。

通常您会设置一个 I/O 端口来启用外部闪存电源。

示例:

void ApplFblSetVfp(void)

{

例如:

        PORTA &= ~0x01;

}

6.2.3.9 ApplFblInvalidateApp

使应用程序无效的回调函数。见 4.4.2。

6.2.3.10 ApplFblFlashBlockNotFound

如果已接收到 TransferData 但在定义的 FlashBlock 中未找到地址区域,则调用此函数。它还允许您支持主存储器外的下载(例如:附加闪存或 EEPROM)。

6.2.3.11 ApplFblValidateApp

用于验证应用程序的回调函数。见 4.4.2。

6.2.3.12 ApplFblResetVfp

函数 ApplFblResetVfp Vfp 是函数 ApplFblSetVfp 的对应物。

此功能允许您关闭编程电压。

示例:

void ApplFblResetVfp(void)

{

例如:

        PORTA |= 0x01;

}

6.2.3.13 ApplFblWDLong

如有必要,调整应用程序的看门狗时序。

在从 Flash Bootloader 分支到您的应用程序之前,会在闪存之后立即调用此函数。对于具有可变定时器间隔的看门狗,可以在此处切换到其他间隔。

如果要使用硬件复位进行转换,请在此函数中实现无限循环。看门狗定时器将到期并创建所需的复位。

示例:

void ApplFblWDLong(void)

{

这是无限循环或转换的地方。如果您不需要此功能,只需将其留空即可。

}

6.2.3.15 ApplFblWDTrigger

如果启用看门狗定时器,则必须在函数 ApplFblWDTrigger 中刷新它。以下是如何完成此操作的示例。

示例:

void ApplFblWDTrigger(void) {

/* 你必须在这里操作你的看门狗。代码可能如下所示: */

        PORTB |= cWatchdogPin;

        PORTB &= ~cWatchdogPin;

}

6.2.4 Fbl_vect.c / Applvect.c(.h) - 中断向量表

为中断向量表提供了几个文件。 Fbl_vect.c (.h) 是引导加载程序的向量表,Applvect.c (.h) 是应用程序的向量表。

在某些硬件平台上,向量表也可以用汇编语言实现。在这种情况下,文件名将具有相应的扩展名。

对于 Bootloader 的集成,您必须编译并链接提供的文件 fbl_vect 和 applvect.c / applvect.h 到您的 Bootloader 文件。要调整应用程序向量表的位置,只需将 APPLVECT 段链接到所需的内存位置。应用程序向量表的位置必须是固定的,并且对于引导加载程序和应用程序都是相同的。

图 6-3 Bootloader 与虚拟应用程序向量表一起编程后的情况

提供的应用程序向量表只是一个虚拟表,用于为引导加载程序提供应用程序向量表的内存地址。 applvect.c 中的所有向量都指向 Bootloader 的启动代码。

如果您现在第一次刷新您的应用程序,此虚拟应用程序中断向量表将被您的应用程序向量表覆盖。确保内存位置完全相同。

建议使用提供的示例应用程序中的 applvect.c 文件作为应用程序向量表的基础,并在文件的适当位置插入中断服务函数的名称。

请参阅特定于硬件的文档 [#hw_intvect]。

6.3 Bootloader 第3步 现在编译Flash Bootloader

现在所有的文件和功能都已经调整好了。再次调用文件 make.exe 来编译它们。结果是一个文件 XYZ.hex,即 hex 格式的 Flash Bootloader。

6.4 Bootloader 第4步 将 Bootloader 传输到目标硬件

为了测试您的结果,您现在必须将 Bootloader hex 文件加载到您的目标平台上。

6.5 Bootloader 第5步 使用 Flash 工具测试 Bootloader

打开 Flash 工具(安装和使用方法见 FlashTool 文档)。转到 Options\Paths 并设置路径。

在开始下载之前,请确保您的 ECU 具有 CAN 连接。

按启动按钮启动 Flasher。 Flash 工具现在将循环发送 CAN Flash 消息。

6.6 Bootloader 第6步 – 测试复位后的Flashing

如果您现在进行复位,由 Flash 工具循环发送的 CAN 消息触发的 ECU 应该启动Flashing过程。您可以在 Flash Tool 的窗口中看到 flash 过程。它工作正常吗?如果是这样,主要的工作已经在你身后了。

如果不是:检查波特率、CAN 连接和硬件初始化。

6.7 Bootloader 第7步 – 使您的应用程序为过渡到引导加载程序做好准备

另一种启动闪存引导加载程序的可能方法是从应用程序。从应用程序启动引导加载程序的一种常见方式是通过接收某个诊断服务或通过专用 CAN 消息。

正如您在图 6-2 中看到的,从应用程序到引导加载程序的转换是通过函数 FblStart 完成的。此函数的参数是一个硬件相关结构,其中包含例如波特率、位时序、CAN-ID 等。

一些 OEM 通过复位实现从应用程序到引导加载程序的转换。

请参阅您的 OEM 特定文档 [#oem_trans] 以获取有关从应用程序切换到引导加载程序的正确事件序列的必要信息。

6.8 Bootloader 第8步 – 从您的应用程序启动 Bootloader

编译您的应用程序,支持跳转到引导加载程序,如上一步所述。然后使用 flash 工具将其加载到目标硬件上。现在刷机与刷机工具配合使用。最后两个步骤处理准备通过 OEM 测试器下载的应用程序 hex 文件。

7 背景信息

7.1 看门狗

Bootloader 在下载应用程序时需要触发片上或外部看门狗。

刷新看门狗是特定于硬件/应用程序的,因此必须由用户实施。有两个看门狗函数:

         FblLookForWatchdog:生成触发看门狗的时基的内部函数(用户不得更改)

         ApplFblWDTrigger:用于刷新看门狗的硬件/应用特定回调函数

图 7-1 看门狗触发功能的存储器布局

在对 Flash 进行编程时,这两个功能都被复制到 RAM 中,因为在大多数 MCU 上,在对 Flash 的部分重新编程时无法从 Flash 执行应用程序。将函数复制到 RAM 可以通过引导加载程序 (FblCopyWatchdog) 的复制函数或启动函数来完成。在第一种情况下,看门狗触发函数必须是可重新定位的(不是真的)!

注:看门狗触发功能必须是可重定位的!

您已经熟悉图 7-2。现在主要关注那些可以处理或操纵看门狗定时器的功能。

图 7-2 操作看门狗的函数

7.1.1 初始化看门狗

您可以在两个不同的位置之一初始化看门狗:在函数 ApplFblInit 或函数 ApplFblWDInit 中。如果要在引导加载程序等待 50 毫秒(默认)接收 CAN 消息的 Stay-In-Boot 时间内启用看门狗,则必须在函数 ApplFblInit 中进行初始化。在这种情况下,函数 ApplFblWDInit 必须保持为空。

注:对于某些看门狗,双重初始化可能会导致复位。

另一方面,当然,如果您在函数 ApplFblWDInit 中进行初始化,那么您也不能在函数 ApplFblInit 中进行初始化。

用户应该初始化看门狗,因为这取决于硬件。要找到初始化看门狗的寄存器设置,请参阅控制器手册。

注:使用 WDTimer [以毫秒为单位] 轻松设置您的看门狗操作时间。

但是,您可以使用 WDTimer 进行触发。如果您将 WDTimer 设置为 0,那么 Watchdog 将立即超时。 WDTimer 的单位是 ms。看门狗通过 ApplFblWDTrigger 功能进行操作,您已经根据需要调整了该功能(参见 6.2.3.5 和 6.2.3.15)。

示例:

/* 初始化 WD,特定于硬件 */

WDTimer = 250/*ms*/; /* 这样看门狗会在 250 毫秒后触发。

更改 WDTimer 的值只会影响该特定周期的看门狗刷新时间。一旦看门狗得到服务,看门狗刷新率将重新初始化为 fbl_cfg.h 中设置的值。 (见 2.4.2)。

如果你的看门狗是一个窗口看门狗,或者至少支持不同的监控窗口并且你也想使用它们,那么你可以使用 ApplFblWDLong 和 ApplFblWDShort 两个函数来切换监控时间。有关看门狗的更多信息,请参阅特定于硬件的文档 [#oem_wd]。

7.2 多 ECU 支持

Flash Bootloader 支持多个 ECU(当类似的 ECU 在车辆中多次使用时,它们的 CAN 标识符是可配置的)。

可以通过在文件 fbl_cfg.h 中设置 #define ‘FBL_ENABLE_MULTIPLE_NODES’ 或通过生成工具激活此功能,具体取决于您的 OEM。

请参阅您的 OEM 特定文档 [#oem_multi] 以获取必要的信息。

如果支持多个 ECU,FBL 将调用函数 ApplFblCanParamInit(),用户必须决定使用哪一组 CAN 标识符。一些 OEM 设置附加信息,例如比如ECU的识别。

7.3 验证正常 - 应用程序错误

如前面章节 4.3.1 所述,有效性检查可能会导致肯定响应并签署应用程序有效,即使应用程序本身是错误的。在这种情况下,每次复位都会导致应用程序无法正常工作(例如:应用程序的 CAN 通信不再工作)。

验证过程无法识别应用程序中的问题(例如闪存中的损坏字节等)。

在这种情况下,您如何刷新无错误的应用程序?

为此,必须能够在从复位到应用程序的转换期间对 CAN 消息做出反应。使用 fbl_cfg.h 文件中的开关 FBL_ENABLE_STAY_IN_BOOT(参见 6.2.1),您将获得以下修改后的函数调用序列。

图 7-3 修改后的函数调用顺序

在检查应用程序有效后,将启动计时器。 FBL 等待默认时间(请参阅 OEM 特定文档 [#oem_time] )以接收 CAN 消息(ForceBootMode 消息)作为保持在引导模式的触发器。现在可以触发一个新的闪存过程。

如果计时器到期而没有收到消息,则应用程序将被执行。

使用这种机制,现在可以刷新一个被错误设置为有效的应用程序。

缺点是启动时间会更长(看门狗)。

7.4 FlashSegmentSize

Flash 段大小是 Flash 工具中的一个可配置参数。

注:FlashSegment Size 给出了 CANflasher 可以一次写入的最小数据大小(以字节为单位)。因此,至少必须同时写入这么多数据。 FlashSegment Size 的大小取决于您的硬件。

在修改 FlashSegmentSize 时,输入 Flash Bootloader 可以编程的最小 Flash 段(硬件相关信息 [#hw_size])。

换句话说,一个块必须从闪存段的开头开始,以便闪存引导加载程序写入它。此规范取决于您的硬件。 Flash 工具需要这些信息来优化写入过程。如果区域边界不落在闪存块边界上,则该工具必须精确优化。

在 Flash 文件窗口的 flash 工具中输入 Segment Size 的值。 (参见 FlashTool 文档)

7.4.1 为什么工具必须知道这个块长度?

在下面的例子中,让我们使用一个至少可以写入 64 字节的 Flash Bootloader;这对应于十六进制表示的 40。

图 7-4 Flashing期间的分段

在第一个示例中,要写入的数据区域(红色)分布在 3 个连续的段上,并且不会精确地从段的开头开始。 Flash Bootloader 然后用虚拟值(灰色)填补这个空白,这样一个由 3x64 字节组成的段可以一次写入内存。最后的空白将用闪存中已经存在的值填充。

在第二个示例中,两个数据段一个接一个地放置,但它们之间存在间隙。为了防止 Flash Bootloader 不得不两次写入从 0x80 到 0xC0 的段,它还用 dummy 值填充了这里的间隙和直到下一个段边界的区域,现在可以使用 4X64 字节长度的段立即写入。最后的空白将用闪存中已经存在的值填充。

在第三个示例中,这里也必须写入两个数据段,但它们之间的间隙大于一个段。在这种情况下,为了不必写入完全未使用的段,Flash Bootloader 现在以不同的方式划分任务。出于这个原因,0x40 和 0x80 之间的段在这里仍然是空的。

7.5 常见问题

此处提供了常见问题列表以方便故障排除。

7.5.1 Bootloader 崩溃

问:Bootloader 只是在复位后崩溃

答:检查 Bootloader 是否意外启动了应用程序——通过在 ApplFblIsValidApp 处设置断点来检查有效性信息。还要验证引导加载程序和应用程序是否将应用程序向量表定位到相同的地址。

问:我可以开始下载,但是当 Flash 被擦除时软件崩溃。

答:Bootloader 可能会崩溃有几个原因:

        1. Flash 驱动程序没有正确地从 ROM 复制到 RAM。检查闪存驱动程序的字节数组 (flashCode) 是否足够大以容纳它。

        2. 检查你的看门狗程序。检查看门狗函数 (WDTriggerBuffer) 的字节数组是否大到足以容纳看门狗函数。

        3. 检查看门狗触发功能是否可重定位。

        4. 检查“fbl_apfb.c”文件中的 FlashBlock 结构。确保 Bootloader 占用的内存区域被排除在 FlashBlock 结构之外。

问:Flash 被擦除,但 Bootloader 在应用程序下载之前崩溃。

答:检查“fbl_apfb.c”文件中的FlashBlock结构。确保 Bootloader 占用的内存区域被排除在 FlashBlock 结构之外。

问:我可以启动 Bootloader 软件,但一段时间后,Bootloader 崩溃。

答:   1. 检查你的看门狗程序。检查看门狗函数 (WDTriggerBuffer) 的字节数组是否大到足以容纳看门狗函数。 

        2. 检查看门狗触发功能是否可重定位。

        禁用看门狗以进行测试。

问:在对特定逻辑块进行编程时,Bootloader 崩溃。

答:检查“fbl_apfb.c”文件中的 FlashBlock 结构。确保 Bootloader 占用的内存区域被排除在 FlashBlock 结构之外。还要确保从 FlashBlock 结构中排除非闪存(RAM、寄存器、EEPROM)区域。

问:Bootloader 循环重启。

答:1. 检查你的看门狗程序。检查硬件看门狗是否得到正确服务。禁用看门狗以进行测试。

        2. 可能是应用启动了,没有触发看门狗。检查有效性信息。

问:我可以开始下载,但有时传输会因超时而中止。

答:   1. 检查看门狗超时和看门狗触发

        2. 检查 FBL_DIAG_TIME_P3MAX 的设​​置和您的测试仪/Flash 编程工具的诊断响应超时。 Bootloader 必须在总线上传输循环的“Response Pending”消息。您可以使用 CANoe/CANalyzer 工具进行检查。

7.5.2 应用程序未启动

问:我可以下载应用程序,但复位后引导加载程序仍处于活动状态

答:可能有不同的原因:

        检查有效性信息。在 ApplFblIsValidApp 中设置断点并进行验证。您是否下载了应用程序的所有必要部分?

问:当我第一次下载应用程序并重新启动 ECU 时,应用程序正在运行。如果我重新编程应用程序,则引导加载程序在复位后处于活动状态。

答:启动 Bootloader 后,检查 Bootloader 的重新编程标志是否正确复位。

7.5.3 Bootloader 未启动

问:我可以下载应用程序并且应用程序正在运行,但我无法重新编程应用程序

答:检查 Bootloader 的重新编程标志是否设置。

7.5.4 Flash 工具的错误代码

问:如何理解 Flash 工具的错误代码?

答:从fbl_diag.h中的表格中查找刷机过程中发生的错误代码,以帮助缩小查找原因的范围。

  • 30
    点赞
  • 217
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值