ZHCU803B August   2020  – September 2022 TMS320F280033 , TMS320F280034 , TMS320F280034-Q1 , TMS320F280036-Q1 , TMS320F280036C-Q1 , TMS320F280037 , TMS320F280037-Q1 , TMS320F280037C , TMS320F280037C-Q1 , TMS320F280038-Q1 , TMS320F280038C-Q1 , TMS320F280039 , TMS320F280039-Q1 , TMS320F280039C , TMS320F280039C-Q1 , TMS320F280040-Q1 , TMS320F280040C-Q1 , TMS320F280041 , TMS320F280041-Q1 , TMS320F280041C , TMS320F280041C-Q1 , TMS320F280045 , TMS320F280048-Q1 , TMS320F280048C-Q1 , TMS320F280049 , TMS320F280049-Q1 , TMS320F280049C , TMS320F280049C-Q1

 

  1.   C2000 MCU 在无器件复位时的实时固件更新
  2.   商标
  3. 1引言
  4. 2关键创新
  5. 3LFU 的构建块
  6. 4建议解决方案的详细信息
    1. 4.1 闪存组组织
    2. 4.2 影响性能的 LFU 概念和因素
    3. 4.3 LFU 的硬件支持
      1. 4.3.1 独立闪存组
      2. 4.3.2 中断向量表交换
      3. 4.3.3 RAM 块交换
      4. 4.3.4 硬件寄存器标志
    4. 4.4 LFU 编译器支持
    5. 4.5 应用程序 LFU 流程
  7. 5结果和结论
  8. 6修订历史记录

应用程序 LFU 流程

与 LFU 相关的详细步骤概述如下:

1.引导至组选择逻辑并执行应用:器件复位时,执行从默认引导至闪存入口点 0x80000 处开始,这是组选择逻辑函数所在的位置。此函数检查闪存组中的有效应用,选择最新的版本,并跳转到相应固件版本的入口点 (codestart)。入口点是连接到应用的 C 运行时初始化例程和 main() 的网关。

2.启动 LFU:用户通过主机从主机端发起的 LFU 命令在目标 MCU 上调用 LFU。

3.在应用中接收 LFU 命令:(图 4-4 中的步骤 1)应用在其 SCI 接收中断 ISR (CommandLogISR) 中接收 LFU 命令。

4.解析 LFU 命令并跳转到 LFU 引导加载程序:(图 4-4 中的步骤 2)特定后台任务函数(运行 LFU)解析 LFU 命令,禁用 SCI 中断,并跳转到位于固定地址的同一闪存组中 LFU 引导加载程序内的 LFU 函数。

5.将新固件和程序下载到闪存:(图 4-4 中的步骤 3)LFU 引导加载程序中的 LFU 函数从主机接收应用映像,并将其编程到非活动闪存组中。此时,旧固件中的后台任务函数已停止执行,但旧固件中的控制 ISR 仍在继续执行,以保持应用功能不受影响。

6.跳转到新固件的 LFU 入口点:(图 4-4 中的步骤 4)成功下载新固件并对其进行编程后,自定义引导加载程序会跳转到新应用映像的 LFU 入口点 (C_int_LFU),该入口点位于每个闪存组的固定地址,与常规闪存引导入口点 (codestart) 不同。

6.执行编译器 LFU 初始化例程并跳转到新固件的 main():LFU 入口点处的函数执行以下操作:

a. 调用编译器的 LFU 初始化例程 (__TI_auto_init_warm)。这将初始化已指示为需要初始化的任何变量。(图 4-4 中的步骤 5)。

b. 在硬件 LFU 寄存器中设置一个标志,以指示 LFU 正在进行中。

c. 调用 main()。(图 4-4 中的步骤 6)。

7.在切换之前,在 main() 中执行 LFU 特定初始化:(图 4-4 中的步骤 7)在 main() 中,通过检查上述标志,初始化进程取决于 LFU 是否正在进行中。

如果设置了该标志,LFU 初始化函数 (Init_lfu) 会通过任何用户指定的代码从闪存复制到 RAM 存储器。接下来,它使用与新固件对应的中断向量位置更新非活动中断向量表。类似地,一组非活动函数指针也对应于新固件中的函数指针位置进行更新。

8.等待更优 LFU 切换点:(图 4-4 中的步骤 8)使用一个带有软件标志的简单状态机来确定控制 ISR 的结束和空闲时间的开始。这是更优切换时间 (IdentifyIdleTime),因为它允许更大限度地利用控制循环中断之间的空闲时间。

9.执行 LFU 切换:(图 4-4 中的步骤 9)请注意,即使新固件的 main() 中已经有执行,旧的控制循环 ISR 仍在执行,以使应用功能不受影响。确定更优 LFU 切换点后,会发生 LFU 切换步骤 (ActivateApp)。首先,禁用全局中断。执行硬件中断向量表交换和 RAM 块交换。然后堆栈指针被重新初始化,全局中断被重新启用。现在,新固件的 ISR 和后台任务函数开始执行,代表 LFU 切换完成。由于全局中断在短时间内被禁用,在这段时间内发生的中断将继续保持锁存状态,并在全局中断被重新启用时中断 CPU。

图 4-4 应用程序 LFU 流程