日志档案

发表于 2008-6-12 14:29:40

1

标签: PIC  IAP  BOOTLOADER  HEX  

如何把两个*.hex合并成一个*.hex?在写IAP/Bootloader很有用哦

        前几天,一网友在某论坛上问我关于PIC Bootloader的问题,他问如何创建两个工程分别编写引导程序和用户程序,分别将两个工程编译成两个.hex文件,然后手工合为一个.hex文件,然后再把这个合并后的.hex文件(即包含引导程序和用户程序)烧写到芯片上去?

 

        恰好在这之前我写过PIC Bootloader,遇到并解决了这个问题.那么现在就来向大家介绍一下关于如何把两个.hex文件合并成一个.hex的方法,一般在你写IAP/Bootloader的时候能够用到,此方法自己认为很有创造性,希望大家喜欢,呵呵.

 

        阅读此文章之前你需要了解如下几个方面的知识:
        1.如何在PICC18编译器中实现程序定位?
答:方法是在MPLAB IDE中,从菜单中选择Project->Build Options...->Project,在PICC-18 Linker页标下的Specify offset for ROM(ROM代码偏移量)中输入偏移量XXX(注意这里输入的已经是16进制了,不用在转换)。 
        重新编译,然后在View->Program Memory就可以看到你的程序已经定位在XXX起始的地址上了.
        2.理解这个语句所代表的意思:  (*((void(*)(void))User_Start))();
        3.了解hex文件的格式.

 

        好,现在就开始谈谈实现方法吧:
        1.配置,编译,链接第一个程序,生成第一个.hex文件
        下边这个程序是0ffset_0x000.c,其代码位于0x000-0x4ff起始的地址块上,请参照Note上的提示进行设置,把生成的hex文件命名为:000.hex
/************************************************************************************************
**本程序只供学习使用,未经作者许可,不得用于其它任何用途
**版权所有,盗版必究。
**Copyright(C) CheungMan
**All rights reserved
**欢迎访问我的blog:http://www.ednchina.com/blog/cheungman
**E-mail          : zhw-198@163.com
************************************************************************************************
**FileName      : 0ffset_0x000.c
**Target        : PIC18F458
**XTAL          : 4MHZ
**Autor         : ZhangWen
**Start Date    : 2008.04.24
**Modify Date   :
**Edition       : V1.0
**HardWare      :
**SofeWare      : MPLAB IDE v8.02 + PICC 18 v8.35
**Function      : 请在MPLAB IDE中,从菜单中选择Project->Build Options...->Project,
**    在PICC-18 Linker页标下的Specify offset for ROM(ROM代码偏移量)中输入偏移量0
**Note          : 注意,此程序偏移0x000地址,其实默认就是0.
***********************************************************************************************/

#include

__CONFIG(1, HSPLL);   //配置HS,4倍频
__CONFIG(2, WDTDIS);   //禁止看门狗

#define User_Start    0x500     //用户程序开始位置

//延时
void Delay(void)
{
 unsigned long i;
 for(i=0; i<150000; i++);
}

void main(void)
{
 unsigned char FlashTime; //定义闪烁次数
     TRISB = 0x00;   //定义RB0-RB7为输出   
     PORTB = 0x00;   //初始化为低电平
     while(1)
    {
         for(FlashTime=0; FlashTime<10; FlashTime++)//闪烁10次
  {
   PORTB = 0xff;
          Delay();
          PORTB = 0x00;
          Delay();
  }
         (*((void(*)(void))User_Start))(); //进入用户程序,即0x500地址起始的程序代码,也就是0ffset_0x500.c
    } 
}

         2.配置,编译,链接第二个程序,生成第二个.hex文件
        下边这个程序是0ffset_0x500.c,其代码位于0x500-0xXXX起始的地址块上,请参照Note上的提示进行设置,把生成的hex文件命名为:500.hex
/************************************************************************************************
**本程序只供学习使用,未经作者许可,不得用于其它任何用途
**版权所有,盗版必究。
**Copyright(C) CheungMan
**All rights reserved
**欢迎访问我的blog:http://www.ednchina.com/blog/cheungman
**E-mail          : zhw-198@163.com
************************************************************************************************
**FileName      : 0ffset_0x500.c
**Target        : PIC18F458
**XTAL          : 4MHZ
**Autor         : ZhangWen
**Start Date    : 2008.04.24
**Modify Date   :
**Edition       : V1.0
**HardWare      :
**SofeWare      : MPLAB IDE v8.02 + PICC 18 v8.35
**Function      : 请在MPLAB IDE中,从菜单中选择Project->Build Options...->Project,
**    在PICC-18 Linker页标下的Specify offset for ROM(ROM代码偏移量)中输入偏移量0x500
**Note          : 注意,此程序偏移0x500地址
***********************************************************************************************/

#include

__CONFIG(1, HSPLL);     //配置HS,4倍频
__CONFIG(2, WDTDIS);    //禁止看门狗

//延时
void Delay(void)
{
 unsigned long i;
 for(i=0; i<150000; i++);
}

void main(void)
{
    TRISB = 0x00; //定义RB0-RB7为输出 
    PORTB = 0x00; //初始化为低电平
    while(1)
    {
 PORTB = 0xaa;
        Delay();
        PORTB = 0x55;
        Delay();
    } 
}

        3.使用UltraEdit分别打开000.hex和500.hex,然后对比一下两者,把500.hex中的部分代码复制并插入到000.hex的代码中,请看图1和图2所示,然后再另存为test.hex.至于为什么要这样操作或者怎样操作,请了解hex的格式先吧.

点击看大图

                                                     图1.选取500.hex上的数据

点击看大图

                                                   图2.拷贝到000.hex上去

        4.接着你可以把这个新生成的test.hex通过ICD2直接下载到芯片上去,你就可以看到0ffset_0x000.c程序中描述的,看到所有RB0-RB7闪烁10次后,接着就会进入0ffset_0x500.c程序中描述的,RB0-RB7间隔闪烁.如果在0ffset_0x500.c程序上再跳转到0x000地址上去的话,又运行0ffset_0x000.c程序了,是不是很有意思啊?不过我没增加这样的语句,你们自己加加看.

        5.在这里,我就用PROTEUS调试给大家看看吧,请看图3和图4.

                                 图3.运行0ffset_0x000.c时的情况

                          图4.运行0ffset_0x500.c时的情况

        PS:在这里要注意的是0ffset_0x500.c,由于此程序已偏移到0x500地址上去,如果你编写含中断的程序的话,需要重定义中断向量.至于如何重定义,下次再写篇如何定义的博文吧.这里我就没有重定义中断向量了,为的是用最简单,最通俗的程序,让大家理解,明白.
    
        再PS:请严格按照程序中NOTE的指示进行设置.

源码:rar

系统分类: 单片机   |   用户分类: PIC单片机   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(747)    回复(2)  

投一票您将和博主都有获奖机会!

  • joylight

    2008-6-22 22:52:18

    您好,我是joylight,之前向您请教过bootloader的问题 强烈期待您重定义中断向量的博文,我现在中断向量的重定位搞不定啊。

  • joylight

    2008-6-22 22:53:58

    您好,我是joylight,之前向您请教过bootloader的问题 强烈期待您重定义中断向量的博文,我现在中断向量的重定位搞不定啊。