freetech

HCS08系列MCU动态程序更新功能的使用

0
阅读(2297)

前面介绍是HCS08单片机的IAP功能,已经能实现数据存储等基本应用。这里再深入介绍一下用该功能实现程序动态更新的方法。

要实现程序动态更新,需满足2个条件:

1、程序划分为不更新和更新2部分。要有一段永远不被更新的程序,一般称之为Bootloader。

2、中断处理程序入口要与原来对得上。

要实现上述功能,需要对Flash进行划分和中断的2级跳转。先来介绍中断2级跳转:

一般的程序只需在FCC6~FFFF放中断向量,发生中断时直接跳到中断向量地址执行。但因中断向量位于不更新区域,这样无法保证新程序与老程序对应的中断向量一致。所以重新开辟一个中断中转区FBA0~FBF6,这里边是以3字节为单位的跳转表。是中断服务程序的第1级入口,一发生中断,先跳到这里,再根据这里的跳转指令跳到真正的中断服务程序处。这个跳转表放在程序的更新部分,新的程序对应新的真正中断服务程序地址。这样就可以让不更新部分固定下来了。

image

再说Flash区域划分:

按下面所示,划为引导区、跳转表区和可变程序区,其中引导区是不可更新区,要与跳转表区和可变程序区放在不同扇区,而跳转表区和可变程序区虽是可更新区,但2个区域不要求在不同扇区。

划分完区域,还需要修改一个程序入口点“VECTOR 0 _Boot”。image

程序中通过“#pragma CONST_SEG BOOT_CONST”、“#pragma CODE_SEG BOOT_CODE”预处理的程序将被编译到不可更新区

image

通过下面代码定义中断向量表

void (* near const _vect[])() @0xFFC6 = { // Interrupt vector table
         ISR_FFC6,
……        
//      _Boot                       // It is defined in project.prm
};

将跳转到“#pragma CODE_SEG VECTOR_ROM”预处理的区域。下面是中断2级跳转的示意:

image

经过上述处理,再配合一种通讯方式将程序传过来就可以实现程序动态更新了。