16

我正在开发一个基于 Cortex-M3 的定制设备,我需要实现应用内编程 (IAP) 机制,以便可以在没有 JTAG 的情况下更新设备固件(我们将使用 TFTP 或 HTTP)。虽然 ST Microelectronics 提供的与 IAP 相关的代码示例对我来说已经足够清楚了,但我并不真正了解重新刷新是如何工作的。

据我了解,指令是由 CPU 通过 ICode 总线(当然还有预取块)从闪存中获取的。所以,这是我非常愚蠢的问题:为什么正在运行的程序在重新刷新自身时不会损坏(即更改运行它的闪存)?

4

5 回答 5

10

一个常见的解决方案是在闪存中保留一个小的保留区域,用于存储实际的闪存程序。下载新固件后,只需跳转到该区域的代码即可。

当然,刷固件时这个小区域是不会被覆盖的,只能通过其他方式(比如JTAG)来完成。因此,请确保此闪烁程序一开始就可以正常工作。:)

于 2011-11-03T12:18:44.870 回答
6

我不熟悉 STM 的实现,但在 NXP 芯片中,IAP 例程存储在单独的保留 ROM 区域中,用户代码无法擦除该区域。

如果您通过直接使用硬件寄存器自己实现闪存编写代码,您需要确保它不接触它正在运行的扇区,或者从 RAM 运行。

于 2011-11-03T12:35:43.333 回答
1

现在很多微控制器都支持 IAP,可以在同一闪存中执行程序的同时对其闪存进行编程。

对于 IAP,闪存中的程序存储器可分为 2 部分,一个可执行部分和其他备份部分。

通常我们通过固件版本为 0.01 的 JTAG 在某个位置(例如,第 1 部分)对闪存进行编程。对于IAP,即在代码执行时对另一部分(part-2)的flash进行编程,固件版本0.01应提供相应的API,这有助于对flash part-2进行编程,编程成功后固件版本将是更新为 0.02。处理器重新启动后,程序执行通过在初始化时检查固件版本跳转到最新固件。

固件正在执行的部分称为可执行部分,其他部分称为备份。为什么叫备份是指,假设在烧写过程中固件损坏,固件版本不会更新,重启后,程序控制会在检查版本号后自动跳转到备份固件。

于 2013-04-22T12:25:53.943 回答
0

另一个好方法是使用定制的引导加载程序。但是 STM IAP 不存储在 Flash 中,所以它不能被它自己覆盖。通常人们所做的是将flash分成两部分,一个是为定制的Bootloader保留的,另一个是用于应用程序的。引导加载程序确保它不会写入自己分配的区域。引导加载程序可以通过 JTAG 进行编程,以后的应用程序可以利用引导加载程序自行编程。

于 2018-01-23T08:38:47.533 回答
0

据我了解,指令是由 CPU 通过 ICode 总线(当然还有预取块)从闪存中获取的。所以,这是我非常愚蠢的问题:为什么正在运行的程序在重新刷新自身时不会损坏(即更改运行它的闪存)?

这是因为,在一般情况下,当您从闪存读取(即执行代码)时,不允许对闪存进行写入/编程。

看看这个关于实施 IAP 的一些想法。

于 2019-04-15T03:08:07.040 回答