dsPIC33F单片机的程序升级探讨
程序升级按“块”更新,每“块”包含1 024个存储单元(以字为单位),即每帧数据需包含2 048个字节的程序代码。在更新程序时并不是简单地用接收到的新程序代码覆盖旧程序,对于一些特殊帧需特殊处理,通过对比应用程序编译后的程序存储器结构与实际应用中的程序存储器结构可以很好地理解这点。图2(a)所示为实际应用中的程序存储器内部结构;(b)为应用程序编译后的程序存储器结构。通过对比这两张图可以看出,“GOTO指令”、“备用中断向量表”、“引导程序”这些区间的程序不能直接覆盖,若“GOTO指令”被覆盖,则程序升级后程序直接跳转到应用程序,不会执行引导程序;若“备用中断向量表”被覆盖,则引导程序中的中断服务程序无法执行;若“引导程序”区间的内容被覆盖,则引导程序被清空,显然会带来灾难性的后果。因此对于第1帧数据需特别处理,该帧数据对应程序存储器第1块(地址为0~0x3FF)的内容,包含“GOTO指令”、“复位地址”、“中断向量表”和“备用中断向量表”的内容,为了保证"GOTO指令”和“备用中断向量表”的内容不被修改,需要先读出原“GOTO指令”和“备用中断向量表”的内容,替代接收数据缓冲区中对应位置的内容,然后写入程序存储区的第1块;对于第2帧到第50帧(0xe800/0x400),这些是引导程序的内容,显然不能做任何修改,因此这几帧数据接收后直接丢弃;从第51帧到最后一帧,这是应用程序的内容,也是真正要升级的内容,所以可直接覆盖旧内容。程序升级后,将程序更新标志恢复为“正常运行”状态,然后复位CPU,则经引导程序又进入了新的应用程序,从而实现了应用程序的升级。
基于以上说明可得引导程序的详细流程如图3所示。
2.2 关键细节的实现
(1)启用“备用中断向量表”。设置INTCON2寄存器中ALTIVT控制位的值,其值设置为“1”则启用“备用中断向量表”;设置为“0”则启用“中断向量表”。
(2)程序首址的设置。在以上流程的说明中谈到引导程序的首址为0x400,而应用程序的首址为0xc800,则设置程序的首址可通过修改链接描述文件(.gld文件)实现。以dsPIC33FJ256GP710单片机为例,将引导程序首址改为0x400,其实现步骤为:打开p33FJ256GP710.gld文件,将其中的“program(xr):ORIGIN=0x200,LENGTH=0x2AA00”改为“pro-gram(xr) :ORIGIN=0x400,LENGTH=0x2A900”;将“_ _CODE_ BASE=0x200”改为“_ _CODE_BASE=0x400”。应用程序首址的修改也采用相同方法。
(3)读/写程序存储器。在参考文献中有很完整的原理说明,也有完整的源代码,可直接使用。
(4)软件复位CPU。在应用程序运行过程中发现需升级程序或在引导程序中升级程序完毕时,均需对CPU进行软件复位,这可通过dsPIC33F单片机提供的“reset”指令实现,可在程序相应位置执行“reset”指令即可。
3 实际应用中若干问题的探讨
3.1 程序升级正确性问题
上文仅重点说明了程序升级的方法,未对程序升级的正确性展开讨论,但在实际应用中,由于传输干扰的存在,接收的新程序数据可能出错,这时如果没有相应的应对措施,显然会影响到产品的正常运行。为了保证程序升级的正确性,常用的应对措施有以下几种:
(1)对每帧数据进行严格的校验(如CRC校验),校验通过后再更新相应的程序存储区;更新程序存储区后,重新读出程序存储区数据,并与接收到的数据进行比较。只有当数据比较无误后才开始接收下一帧数据。
(2)若不考虑硬件成本,也可外置一个数据存储器,将所有新程序数据完全接收并校验通过后才统一更新程序存储器,最后把整个程序存储器的数据与接收到的数据逐一比对,若比对无误则升级结束。
(3)若应用程序占用空间不大,也可将程序存储器中应用程序区再分为两部分。程序升级时轮流覆盖这两部分,这种操作方式使程序存储器同时保存旧版本和新版本两个应用程序,当新版本程序因某种原因运行不正常时,可由引导程序将应用程序切换到旧版本。
第(1)种方法最容易实现,但是应用程序只有在整个升级过程完全结束后才可以正常运行,若升级过程因某种原因通信中断,则应用程序一直无法运行,这是该方法最大的缺陷。
第(2)种方法也很容易实现,而且由于它是在新程序数据全部接收后才开始升级,因此克服了第(1)种方法的缺陷,但是该方法需增加硬件成本,且要占用单片机更多的硬件资源(用于与外部存储器之间的交互)。
第(3)种方法也可以克服第(1)种方法的缺陷,而且不需增加硬件成本,但是该方法的实现显然比前两种方法复杂得多。以上3种方法各有优缺点,在实际应用中可根据实际情况选择。
3.2 断点续传问题
在实际应用中,可
- dsPIC33F系列DSC的 SD存储卡接口设计(01-05)
- 基于dsPIC33F系列单片机的应用程序升级方法(04-03)
- DSPIC33FJ256MC710的疑难问题及解决方法(04-25)
- dsPIC33F串口通讯中断接收发送数据UART(11-09)
- 浅谈dsPIC33F系列DSC的SD存储卡接口设计(01-04)
- 基于DSPIC33F的马达控制方案(12-22)