ARM(Cortex M3)的应用程序内编程如何工作?

时间:2011-11-03 12:13:41

标签: arm embedded cortex-m3 stm32

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

据我所知,CPU通过ICode总线(当然还有预取块)从Flash获取指令。所以,这是我非常愚蠢的问题:为什么运行程序在重新闪烁时会被破坏(即更改运行它的闪存)?

5 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:6)

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

如果您直接使用HW寄存器自己实现flash写入代码,则需要确保它不会触及正在运行的扇区,或者从RAM运行。

答案 2 :(得分:1)

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

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

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

执行固件的部分称为可执行部分,其他部分是备份。为什么它被称为备份意味着,假设在编程时是否存在任何固件损坏,固件版本将不会更新&重新启动后,程序控制将在检查版本号后自动跳回到备份固件。

答案 3 :(得分:0)

另一个好方法是使用定制的bootloader。但是,STM IAP不存储在Flash中,因此它不能被自身覆盖。人们通常做的是将闪存分为两部分,一部分用于Custom made Bootloader,另一部分用于应用。 Bootloader确保它不会写入自己指定的区域。 Bootloader可以通过JTAG进行编程,以后应用程序可以利用bootloader对自身进行编程。

答案 4 :(得分:0)

  

据我了解,CPU通过ICode总线(当然还有预取块)从CPU提取指令。因此,这是我一个很愚蠢的问题:为什么正在运行的程序在重新刷新自身时(即更改正在运行的程序的闪存)而不会被损坏?

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

有关实现IAP的一些想法,请查看this