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
与 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。