基于串口通信的DSP应用程序在线升级方法 (2)

(1)上电复位查询功能。上电复位后通过接收上位机发送的命令判断是否升级。若上位机发送的是升级命令,则跳转到底层程序中升级部分执行;否则,跳转到原有的应用程序处执行。
    (2)搬移烧写程序的功能。由于F28035片上Flash不支持在其中一个扇区运行程序去擦除或烧写其他扇区,故完成接收数据和烧写Flash工作的这部分程序(即底层程序中的升级部分程序)需搬移至片内RAM或片外RAM上运行。实现程序搬移的函数为:
    void MemCopy (Uint16 *SourceAddr,  Uint16 *Source End
        Addr, Uint16 *DestAddr)
       {
      while (SourceAddr < SourceEndAddr)
          {
                *DestAddr++ = *SourceAddr++;
            }
             return ;
    }
其中,SourceAddr为Flash中升级程序的起始地址,SourceEndAddr为Flash中升级程序的结束地址;DestAddr为搬移至内存的首地址。
    (3)接收上位机发送的应用程序代码并保存到DSP
指定的内存中(一般为RAM区)。这是通过串口RS232来实现的。并确定用于数据保存的这部分内存未被占用。例如,若需要将应用程序代码暂存到F28035的L0 SARAM区域(地址空间0x3F8000-0x3F8800)。定义数组Uint16 BlockBuffer[2048]用于存储应用程序代码,在底层程序中采用存储器定位语句,将上面的缓冲数组定位到相应的存储空间:
  #pragma DATA_SECTION(BlockBuffer,“BlockTransferbuffer”);
    在底层程序CMD文件中,采用定位语句,将BlockTransferbuffer定位到DSP的L0 SRAM空间:
    BlockTransferBuffer:> L0 SARAM  PAGE=2  
                          //地址空间:0x3F8000~0x3F8800
    通过以上底层程序的设置,可将应用程序缓存到指定的RAM区域中。
    (4)代码接收结束后,将内存中的代码烧写至指定Flash扇区,该步骤通过调用Flash2803x_API库函数完成。底层程序中所用到的Flash2803x_API库函数如下[6]:
    ①擦除扇区的函数为Uint16 Flash28035_Erase(Uint16 SectorMask,&Fstatus),其中,SectorMask为即将被擦除的扇区;&Fstatus为执行擦除操作后返回的状态值,用来判断擦除操作是否成功。②将程序烧写到Flash扇区的函数为Uintl6 Flash28035_Program(&FlashAddr, &BuffAddr,Length,&Fstatus),其中,&FlashAddr为即将被烧写的Flash扇区的起始地址;&BuffAddr为即将准备烧写的程序当前存放在内存空间的首地址;Length为程序长度;&Fstatus为执行烧写操作后返回的状态值,用来判断烧写操作是否成功。③校验烧写到Flash中的程序为Uint16 Flash28035_Verify(&FlashAddr,&BuffAddr,Length,&Fstatus),其中,&FlashAddr指定从Flash内开始比较的首地址;&BuffAddr为被比较文件的存储首地址;Length是需要比较的16 bit字的个数,程序长度;&Fstatus是执行校验操作后返回的状态值,用来判断校验操作是否成功。
2.3 底层程序和应用程序的定位
    DSP F28035上电复位后,CPU将从内部Boot Rom获得复位向量。复位向量指向Boot Rom并执行其内部的Bootloader程序,执行完毕后确定从内部Flash启动。程序指针跳转到Flash的0x3F7FF6处。由于这个地址是固定的,因此底层程序必须烧写在以这个地址为起始地址的空间内。DSP进入底层软件程序中运行,首先通过接收上位机的命令来判断是否进行在线升级,如果进行在线升级,则跳转到相应升级程序中执行;否则,跳转到原有的应用程序处执行。由底层程序跳转到原有的应用程序处执行时,采用绝对地址跳转。部分程序如下所示:
     #define Jumpgxcx (void (*)(void))0x3E8FFE 
                            //定义应用程序的跳转地址
     SCI_SendStatus(“upgrade program? (y/n):”)  
                                 //向上位机询问是否升级
     temp = SCIA_GetByteData_app();   
                        //接收上位机发送来的是否升级命令
           if (temp==’y’)                  
           {
                 main2();   //如果升级,则跳转到升级程序中执行
           }
           Else     
           {
                  (*Jumpgxcx)();   
    //如果不升级,则采用绝对地址跳转到应用程序中执行
       }
}
    底层程序的cmd配置与应用程序的cmd配置要保持一致,不能产生地址冲突。同时,要注意底层程序和应用程序的跳转地址配置。
    底层程序cmd文件的部分配置如下:
    BEGIN : origin = 0x3F7FF6, length = 0x000002 
    RESET : origin = 0x3FFFC0, length = 0x000002 /*
    codestart : > BEGIN           PAGE = 0
    应用程序cmd文件的部分配置如下:
    BEGIN : origin = 0x3E8FFE, length = 0x000002 
    codestart : > BEGIN         PAGE = 0
3 烧写步骤
    首先把底层程序通过JTAG接口烧写到F28035中,然后再进行应用程序的烧写。应用程序的烧写步骤为:先把串口调试工具的参数配置为波特率9 600 bit/s、8 bit数据位、1 bit停止位、没有奇偶校验位;选择发送文本文件方式,发送应用程序的.bin文件到DSP。由于F28035的RAM区比较小,可以采取把应用程序代码分为多次发送的方式。烧写过程如图2所示。

基于串口通信的DSP应用程序在线升级方法

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzjdzz.html