ZHCADG6A December 2023 – April 2024 TMS320F2800157 , TMS320F280039 , TMS320F280039-Q1 , TMS320F280039C , TMS320F280039C-Q1 , TMS320F28P659DK-Q1
C2000™, Code Composer Studio™, and LaunchPad™are TMs ofTI corporate name.
Microsoft Visual Studio®is a reg TM ofMicrosoft Corporation in the United States and/or other countries.
Other TMs
CAN 闪存内核有助于对具有 CAN 外设的任何 C2000 MCU 进行固件更新。使用引导 ROM 中的 CAN 引导加载程序将其复制到器件的 RAM 中。然后,内核将使用 CAN 外设从主机传输固件并将其编程到闪存存储器中。闪存内核包含两部分软件:一个 PC 主机 CAN 编程器和一个用于 C2000 MCU 的 Code Composer Studio™ (CCS) 工程。F28003x 器件用作这些工程的基础,可进行修改以用于其他器件。如果要在任何器件上使用该工程,则可能需要修改与器件工作频率相关的参数。
总之,对闪存进行编程需要两个步骤:
在对器件进行编程之前,有必要了解 C2000 器件的非易失性存储器的工作原理。闪存是一种非易失性存储器,允许用户将其中的内容轻松擦除并重新编程。擦除操作将扇区中的所有位设置为“1”,而编程操作则有选择地将位清除为“0”。某些器件上的闪存一次只能擦除一个扇区,而其他器件提供闪存组擦除选项。
所有 C2000 器件上的闪存操作均使用 CPU 执行。算法被加载到 RAM 中并由 CPU 控制以执行任何闪存操作。例如,若要使用 Code Composer Studio™ 擦除或编程 C2000 器件的闪存,需要将闪存算法加载到 RAM 中并让处理器执行它们。没有使用特殊的 JTAG 命令。所有闪存操作均通过闪存应用程序编程接口 (API)来执行。所有闪存操作都是使用 CPU 完成的,因此器件编程有很多可能性。无论内核和应用程序如何引入器件中,闪存都是使用 CPU 进行编程的。
器件启动之初,器件引导,并根据引导模式决定是执行已编程到闪存存储器中的代码还是使用某个 ROM 加载程序加载代码。本应用手册重点介绍未连接仿真器 (CCS) 时的引导执行路径。
引导模式 | GPIO24(默认引导模式选择引脚 1) | GPIO32(默认引导模式选择引脚 0) |
---|---|---|
并行 I/O | 0 | 0 |
SCI/等待引导 | 0 | 1 |
CAN | 1 | 0 |
闪存 | 1 | 1 |
在引导 ROM 准备好使用的器件后,它决定应该从哪里开始执行(闪存或引导 ROM)。如果是独立启动,它通过检查两个 GPIO(如表 3-1 中所示,默认选择是 GPIO 24 和 32)的状态来实现此目的。在某些情况下,可以检查编程到一次性可编程 (OTP) 存储器中的两个值。本应用手册所述的实现使用了 CAN 和 MCAN 加载程序,因此在上电时 GPIO 32 必须强制为低电平,GPIO 24 必须强制为高电平。如果器件引导时出现这种情况,ROM 中的 CAN 加载程序将开始执行并等待从主机接收数据。
对于 CAN 引导模式 (DCAN),GPIO 分配的引导表由表 3-2 定义。表 3-3 展示了 MCAN 引导选项。请注意,DCAN 和 MCAN 的引导选项使用相同的 GPIO 分配来选择引导定义值。常见的 GPIO 对是 GPIO4 和 GPIO5,以及 GPIO13 和 GPIO12。如需更多信息,请查看特定于器件的 TRM 中的引导选项。
选项 | BOOTDEF 值 | CANTXA GPIO | CANRXA GPIO |
---|---|---|---|
0(默认值) | 0x02 | GPIO4 | GPIO5 |
1 | 0x22 | GPIO32 | GPIO33 |
2 | 0x42 | GPIO2 | GPIO3 |
3 | 0x62 | GPIO13 | GPIO12 |
选项 | BOOTDEFx 值 | CANTXA GPIO | CANRXA GPIO |
---|---|---|---|
0 | 0x08 | GPIO4 | GPIO5 |
1 | 0x28 | GPIO1 | GPIO0 |
2 | 0x48 | GPIO13 | GPIO12 |
ROM 加载程序要求以特定结构向其提供数据。该结构对所有 ROM 加载程序都是通用的,[6] 中的引导加载程序数据流结构 一节对此进行了详细介绍。您可以使用 TI C2000 编译器随附的 hex2000 实用程序,轻松生成这种格式的应用程序。通过添加具有以下选项的编译后处理步骤,甚至可以在 Code Composer Studio 编译过程中生成此文件格式:
"${CG_TOOL_HEX}" "${BuildArtifactFileName}" -boot -sci8 -a -o "${BuildArtifactFileBaseName}.txt"
或者,您可以使用 TI hex2000 实用程序将 COFF 和 EABI .out 文件转换为正确的十六进制格式引导文件。为此,您需要在“Project Properties”下启用 C2000 Hex Utility。具体命令如下:
hex2000.exe -boot -sci8 -a -o <file.txt> <file.out>
如前所述,ROM 加载程序只能将代码加载到 RAM 中,因此会将其加载到闪存内核中,这将在 DCAN 闪存内核和 MCAN 闪存内核小节介绍。
闪存内核期望固件映像采用相同的格式,因此上面的命令也可用于生成固件映像十六进制文件。
MCAN ROM 引导加载程序有三个引导选项,每个选项都映射到不同的 GPIO 引脚,用于 MCANRX 和 MCANTX 功能。为了将器件配置为 MCAN 引导模式,需要对器件的 OTP 进行编程以包括 MCAN 引导。有关如何对一次性可编程 (OTP) 进行编程的更多详细信息,请参阅 TMS320F28003x 实时微控制器技术参考手册 (TRM) 的引导 ROM 一章。
DCAN 闪存内核基于 DCAN ROM 加载程序源。为了使该代码能够擦除和编程闪存,必须合并闪存 API,这是通过链接闪存 API 来完成的。在接收到任何应用程序数据之前,F28P65x 和 F280015x(不包括 F28003x,此器件在稍后完成)DCAN 闪存内核会擦除器件的闪存以便为编程做好准备。F28P65x 和 F280015x DCAN 闪存内核工程允许用户指定在进行应用程序编程之前应擦除哪些闪存组和闪存扇区。自定义闪存组和扇区擦除中对此进行了更详细的论述。在闪存存储器中的相应位置进行擦除后,应用程序加载开始。缓冲区用于保存接收到的连续应用程序代码块。当缓冲区已满或检测到新的非连续数据块时,将对缓冲区中的代码进行编程。此过程一直持续到收到整个应用程序为止。
DCAN 模块在闪存内核中初始化后,该模块等待主机发送固件映像。闪存内核一次从主机接收 8 个字节,并将内容放入中间 RAM 缓冲区中。然后,将该缓冲区以 128 位或 512 位增量写入闪存。F28P65x 和 F280015x DCAN 闪存内核工程支持 512 位编程,而 F28003x 使用 128 位编程。如果需要,还有一个可用于 F28P65x 器件的 128 位编程工程。F280015x 闪存 API 支持 128 位编程,但闪存内核是用 512 位编程实现的。
在第一次写入扇区之前,F28003x(不包括 F28P65x 和 F280015x,因为闪存在此过程中的较早时间已被擦除)闪存内核会检查该扇区是否已被擦除,如果没有被擦除,F28003x 闪存内核会让闪存 API 执行擦除操作。此后,一个缓冲区将被写入闪存的内容填满,并从闪存 API 发送编程命令。一旦发生写入,闪存内核就会通过闪存 API 验证相应段是否已写入闪存的正确地址。一旦内核将所有内容复制到闪存,工程就会跳转到映像的入口地址。
存储在闪存中的固件映像的所有段都应根据一次性编程的位数对齐。如果一次编程 128 位(F28003x 和 F28P65x),这些段应与 128 位边界对齐。在固件镜像的链接器命令文件中,所有初始化段都需要映射到闪存扇区,并且在每次映射之后,需要添加 ALIGN(8) 指令以确保 128 位对齐。如果一次编程 512 位(F280015x 和 F28P65x),这些段应与 512 位边界对齐。在固件镜像的链接器命令文件中,所有初始化段都需要映射到闪存扇区,并且在每次映射之后,需要添加 ALIGN(32) 指令以确保 512 位对齐。
用于传输应用程序数据的协议与 DCAN ROM 加载程序协议略有不同。使用原始 DCAN ROM 加载程序协议,数据以每帧两个字节、100Kbps 的速度从主机传输到目标器件。由于数据每帧传输两个字节到 DCAN ROM 加载程序,这会增加下载内核或映像的总时间。将每帧数据长度代码 (DLC) 修改为 8 字节并将位速率增加至 1Mbps,就可以让 PC 侧应用程序一次通过主机发送多个字节,从而大大减少通信延迟。应用程序负载一节详细介绍了将比特率提高到 1Mbps 所需的更改。
F280015x 和 F28P65x(包括 128 位和 512 位编程工程)DCAN 闪存内核允许用户指定在将应用程序加载到闪存之前应擦除哪些闪存组和闪存扇区。本节将讨论如何为 F28P65x 器件实现擦除,但 F280015x 的实现方式非常相似。
在 flash_kernel_ex5_can_flash_kernel.c 文件中,有四个 32 位无符号整数数组用于控制内核擦除的闪存组和扇区。
uint32_t Application_Flash_Banks[5] = {0,1,2,3,4};
uint32_t WE_Protection_A_Masks[5] = {0,0,0,0,0};
uint32_t WE_Protection_B_Masks[5] = {0,0,0,0,0};
uint32_t WE_Protection_OTP_Masks[5] = {0,0,0,0,0};
在 Application_Flash_Banks 内,应输入闪存组编号。在 WE_Protection_A_Masks 内,应输入与 Application_Flash_Banks 中每个闪存组的扇区 0-31 相对应的写入/擦除保护掩码。如上所示,每个闪存组的闪存扇区 0-31 将被擦除。在 WE_Protection_B_Masks 内,应输入与 Application_Flash_Banks 中每个闪存组的扇区 32-127 相对应的写入/擦除保护掩码。如上所示,每个闪存组的闪存扇区 32-127 将被擦除。更多有关这些掩码的信息,请参阅特定于器件的闪存 API 指南。同样,WE_Protection_OTP_Masks 中应填充每个闪存组的 OTP 所需的掩码。请注意,配置该数组不会导致 OTP 被擦除,而是使器件能够在应用程序加载期间对闪存组的 OTP 进行编程。
此外,将应用程序编程到闪存时使用 WE_Protection_A_Masks 和 WE_Protection_B_Masks。根据正在编程的数据的目标地址确定正确的掩码。
根据需要配置这些数组后,重新编译闪存内核并生成新的内核映像。
本节介绍使用 DCAN 引导模式将应用程序编程到闪存的整个流程。
要确保器件已准备好进行 DCAN 通信,需要复位器件同时确保引导模式引脚处于正确状态以选择 DCAN 引导模式。随后的步骤如下:
主机编程器将延迟 5 秒,然后以 1Mbps 和每帧 8 字节的有效负载发送应用程序映像。
应用程序编程到闪存中后,闪存内核会转到其在应用程序加载过程开始时的入口点来尝试运行应用程序。这需要一次器件复位。
闪存内核工程是根据 MCAN ROM 引导加载程序建模的。它直接进入已修改为写入闪存的 MCAN_Boot 函数。闪存内核的 MCAN 模块初始化与引导加载程序相同 - MCAN 模块的时钟源、标称和数据比特率、GPIO 引脚等由内核在初始化时根据引导模式进行设置。在接收到任何应用程序数据之前,F28P55x 和 F28P65x(不包括 F28P65x,此器件在稍后完成)MCAN 闪存内核会擦除器件的闪存以便为编程做好准备。此外,F28P55x MCAN 闪存内核工程允许用户指定在进行应用程序编程之前应擦除哪些闪存组和闪存扇区。自定义闪存组和扇区擦除中对此进行了更详细的论述。在闪存存储器中的相应位置进行擦除后,应用程序加载开始。
闪存内核一次从主机接收 64 个字节,并将内容放入中间 RAM 缓冲区中。然后,将该缓冲区以 128 位或 512 位增量写入闪存。F28003x 和 F28P65x 闪存内核一次写入 128 位,而 F28P55x 闪存内核一次写入 512 位。在第一次写入扇区之前,F28003x 会检查该扇区是否已被擦除,如果没有被擦除,闪存内核会让闪存 API 执行擦除操作(如上所述,F28P55x 和 F28P65x 闪存内核会事先擦除闪存)。此后,一个缓冲区将被写入闪存的内容填满,并从闪存 API 发送编程命令。一旦发生写入,闪存内核就会通过闪存 API 验证相应段是否已写入闪存的正确地址。一旦内核将所有内容复制到闪存,工程就会跳转到映像的入口地址。
存储在闪存中的固件映像的所有段都应根据一次性编程的位数对齐。如果一次编程 128 位(F28003x 和 F28P65x),这些段应与 128 位边界对齐。在固件镜像的链接器命令文件中,所有初始化段都需要映射到闪存扇区,并且在每次映射之后,需要添加 ALIGN(8) 指令以确保 128 位对齐。如果一次编程 512 位 (F28P55x),这些段应与 512 位边界对齐。在固件镜像的链接器命令文件中,所有初始化段都需要映射到闪存扇区,并且在每次映射之后,需要添加 ALIGN(32) 指令以确保 512 位对齐。
用于传输应用程序数据的协议遵循 MCAN ROM 加载程序协议。使用原始 MCAN ROM 加载程序协议,使用的标称比特率为 1Mbps,并且每帧从主机向目标器件传输 64 个字节,以实现标称位时序。该协议使用的数据比特率是 2Mbps,以实现数据位时序。
F28P55x MCAN 闪存内核允许用户指定在将应用程序加载到闪存之前应擦除哪些闪存组和闪存扇区。在 flash_kernel_ex4_can_flash_kernel.c 文件中,有四个 32 位无符号整数数组用于控制内核擦除的闪存组和扇区。
uint32_t Flash_Banks_To_Erase[5] = {0,1,2,3,4};
uint32_t CMD_WE_Protection_A_Masks[5] = {0,0,0,0,0};
uint32_t CMD_WE_Protection_B_Masks[5] = {0,0,0,0,0};
uint32_t CMD_WE_Protection_UO_Masks[5] = {0,0,0,0,0};
在 Flash_Banks_To_Erase 内,应输入闪存组编号。在 CMD_WE_Protection_A_Masks 内,应输入与 Flash_Banks_To_Erase 中每个闪存组的扇区 0-31 相对应的写入/擦除保护掩码。如上所示,每个闪存组的闪存扇区 0-31 将被擦除。在 CMD_WE_Protection_B_Masks 内,应输入与 Flash_Banks_To_Erase 中每个闪存组的扇区 32-127 相对应的写入/擦除保护掩码。如上所示,每个闪存组的闪存扇区 32-127 将被擦除。更多有关这些掩码的信息,请参阅特定于器件的闪存 API 指南。同样,CMD_WE_Protection_UO_Masks 中应填充每个闪存组的 OTP 所需的掩码。请注意,配置该数组不会导致 OTP 被擦除,而是使器件能够在应用程序加载期间对闪存组的 OTP 进行编程。
此外,将应用程序编程到闪存时使用 CMD_WE_Protection_A_Masks 和 CMD_WE_Protection_B_Masks。根据正在编程的数据的目标地址确定正确的掩码。
根据需要配置这些数组后,重新编译闪存内核并生成新的内核映像。
本节介绍使用 MCAN 引导模式将应用程序编程到闪存的整个流程。
要确保器件已准备好进行 MCAN 通信,需要复位器件同时确保引导模式引脚处于正确状态以选择 MCAN 引导模式。随后的步骤如下:
应用程序编程到闪存中后,闪存内核会转到其在应用程序加载过程开始时的入口点来尝试运行应用程序。这需要一次器件复位。
上述内核可在示例目录中特定器件的示例文件夹下的 C2000Ware 中找到。例如,F28003x 的 DCAN 闪存内核位于 C2000Ware_x_x_xx_xx > driverlib > f28003x > examples > flash。相关主机应用可在 C2000Ware (C2000Ware_x_xx_xx_xx > utilities > flash_programmers > dcan_flash_programmer) 中找到。源代码和可执行文件可在 dcan_flash_programmer 文件夹中找到。本节详细介绍了 dcan_flash_programmer:如何编译、运行并将其与 DCAN 闪存内核一同使用。同样,还将介绍 MCAN 闪存内核如何与 can_flash_programmer 一同使用。