自己用C语言写dsPIC单片机的serial bootloader

  HyperBootloader_dsPIC

  HyperBootloader_dsPIC是我用C语言实现的serial bootloader, 适用于dsPIC30, dsPIC33,同样适用于PIC24。单片机端bootloader是用XC16编译的,电脑端的通信软件是用超级终端--HyperTerminal。

  dsPIC30 和 dsPIC33 程序存储器

  dsPIC30,dsPIC33, PIC24的程序存储器架构都一样,只是大小,和vector位置有所不同。下图所示的是dsPIC30和dsPIC33程序存储器的示意图,以及HyperBootloader的放置位置。HyperBootloader_dsPIC是放置在IVT/AIVT中断vector所占Page之外,所以IVT/AIVT不需要做任何变动。

  

  如上图所示,对于dsPIC30, HyperBootloader_dsPIC的ROM Range是0x400~0xBFF, 对于dsPIC33, HyperBootloader_dsPIC的ROM Range是0x100~0x5FF。

  ROM Range 设置

  下面以dsPIC33FJ256GP710A为例,详细说一下如何设置ROM Range。在编译HyperBootloader_dsPIC时,需要添加p33FJ256GP710A.gld文件到项目目录中来,并对其修改以下地方。

  program (xr) : ORIGIN = 0x400, LENGTH = 0x0800 /*2A9FE*/
  __CODE_BASE = 0x400;
  __CODE_LENGTH = 0x0800; /*2AA00;*/

  这样就完成了对HyerBootloader_dsPIC的ROM Range的设置。另外由上图可知,应用程序需要烧录到dsPIC33FJ256GP710A ROM的0xC00之后。所以在编译应用程序时,同样需要添加p33FJ256GP710A.gld文件到项目目录中来,并对其修改以下地方来完成ROM设置。

  program (xr) : ORIGIN = 0xC00, LENGTH = 0x02A000 /*2A9FE*/
  __CODE_BASE = 0xC00;
  __CODE_LENGTH = 0x02A000; /*2AA00;*/

  主要代码段

  HyperBootloader_dsPIC采用的是程序字烧录,具体实现代码段如下。

        for(;;)
        {
            while (U1RXREG != ‘:‘);
            while (!U1STAbits.TRMT);
            U1TXREG=‘:‘;

            cksum = bcount = bytecount = GetXbyte();
            //address
            SourceAddr.v[1] = GetXbyte();
            SourceAddr.v[0] = GetXbyte();
            SourceAddr.Val >>= 1;
            rectype = GetXbyte();
            switch(rectype)
            {
            case LINEAR_ADDRESS:
                SourceAddr.v[3] = GetXbyte();
                SourceAddr.v[2] = GetXbyte();
                Checksum();
                break;
            case DATA:
                while (bytecount--)
                {
                    Buffer[incrbyte++] = GetXbyte();
                }
                Checksum();
                if (SourceAddr.Val >= CM_START)
                {
                    //NVMCON = CM_WORD_WRITE;
                    ClearBuffData();
                    break;
                }
                else
                {
                    NVMCON = PM_WORD_WRITE;
                }
                for (ix = 0; ix < bcount; )
                {
                    pData.byte.LB = Buffer[ix+0];
                    pData.byte.HB = Buffer[ix+1];
                    pData.byte.UB = Buffer[ix+2];
                    pData.byte.MB = Buffer[ix+3];

                    TBLPAG = SourceAddr.word.HW;
                    if (SourceAddr.Val == 0)
                    {
                        pData.word.LW = BOOT_START;   // reset vector
                        pData.word.HW = 0x0004;     // goto BOOT_START
                    }
                    __builtin_tblwtl(SourceAddr.word.LW, pData.word.LW);
                    __builtin_tblwth(SourceAddr.word.LW, pData.word.HW);
                    asm("DISI #16");   //Disable interrupts for few instru
                    __builtin_write_NVM();
                    Nop();
                    while (NVMCONbits.WR);

                    rData.word.HW = __builtin_tblrdh(SourceAddr.word.LW);
                    rData.word.LW = __builtin_tblrdl(SourceAddr.word.LW);

                    if ((rData.Val != pData.Val))                   //&&(SourceAddr.Val < CM_START))
                    {
                        putsUART1((unsigned int *)"Error\r\n");
                        RCONbits.SWDTEN=1;   // use WTD to reset device
                        while (1);
                    }
                    ix += 4;
                    SourceAddr.Val += 2;
                }
                ClearBuffData();
                NVMCONbits.WREN = 0;
                break;
            case END:
                Checksum();
                U1MODE = 0x0;
                U1STA = 0x0110;
                (*((void(*)(void))PROG_START))();
                break;
            }
        }    

  如何使用

  1. 使用XC16编译HyperBootloader_dsPIC 或HyperBootloader_dsPIC(编译前,需先修改gld文件,详见"ROM Range设置")。

  2. 使用pickit3烧录HyperBootloader_dsPIC的Hex文件到目标板中。

  3. 拔除pickit3烧录器,连接目标板与PC的串口,打开超级终端,设置如下:115200-8-None-1-NoneLine Delay-20ms

  4. 重启目标板,超级终端会出现Booting... 字样。

  5. 6秒内,在超级终端窗口中按下键盘上任何按键,会出现">"(6秒内没按键,会自动跳转到用户的应用程序中去)。

  6. 打开Send Text File对话框,选择期望烧录的应用程序hex文件(编译前,需先修改gld文件,详见”ROM Range设置"),点击确认, HyperBootloader会将接收到的数据传回到电脑超级终端上,并将数据烧录到目标板程序存储器的正确位置。

  7. 再次重启目标板,超级终端显示完Booting ......,就自动跳到应用程序中,目标板开始正常运行应用程序。

  之后每次更新应用程序,只需重复步骤 4 ~ 7 就可以了。

  主要特性

  HyperBootloader_dsPIC有以下主要特性

  1. C语言写的,XC16 编译。

  2. 非常容易移植, 支持dsPIC30, dsPIC33, PIC24。

  3. 支持FLASH烧写

  4. 不支持EEPROM烧写。

  5. 支持CONFIG BITS/IDLOC 烧写。

  如果你有什么疑问,或有兴趣了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader 或 cnblogs)。

  想了解PIC18 bootloader 请阅读我的随笔《自己用C语言写PIC18单片机的serial bootloader》

  想了解PIC16 bootloader 请阅读我的随笔《自己用C语言写PIC16单片机的serial bootloader》

  

时间: 2024-12-24 06:30:54

自己用C语言写dsPIC单片机的serial bootloader的相关文章

自己用C语言写PIC32单片机的serial bootloader

从15年12月份以来我的空余时间都在折腾15年底买的PIC32MZ EC Starter kit.并陆续写了十多篇随笔记录我折腾的历程.最近新完成的是用C语言实现了PIC32的UART bootloader, 采用串口通信,适用于Microchip的PIC32MZ EC,稍作对应的修改也可适用于PIC32MX, PIC32MZ EF等.Uart bootloader是用XC32编译的,电脑端的通信软件是用超级终端--HyperTerminal (也可以使用SecureCRT). 和之前我写的Hy

单片机modebus RTU通信实现,采用C语言,可适用于单片机,VC,安卓等(转)

源:单片机modebus RTU通信实现,采用C语言,可适用于单片机,VC,安卓等 //modebus_rtu.c /************************************************************************************************************* * 文件名: MODEBUS_RTU.c * 功能: MODEBUS_RTU通信协议层 * 作者: [email protected] * 创建时间: 2014-

PIC12F629帮我用C语言写个程序,控制三个LED亮灭

http://power.baidu.com/question/240873584599025684.html?entry=browse_difficult PIC12F629帮我用C语言写个程序,控制三个LED亮灭! 2014-12-31 16:05DINZEYU  分类:C/C++ | 浏览 87 次 C语言VC++ 按键按一次LED1低亮,按两次高亮,按三次2HZ闪,按三次关,按键长按3秒松开LED2亮,长按3秒松开LED2灭,按键长按5秒松开LED3亮,长按5秒松开LED3灭,每个功能独

自己用C语言写RL78 serial bootloader

了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 之前用C实现过多款PIC单片机的bootloader, 包括8-bit的PIC16,PIC18:16-bit的PIC24, dsPIC30, dsPIC33; 和32-bit的PIC32MX,PIC32MZ,我为这些类型PIC都写过C bootloader.今天要介绍的serial bootloader 是为我的RL78

JAVA调用C语言写的SO文件

JAVA调用C语言写的SO文件 因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也就是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例 1 // 用JNI实现 2 // 实例: 3 4 // 创建HelloWorld.java 5 class HelloWorld 6 { 7 private native void print(); 8 public static void main(String[] args) 9 { 10 new HelloWorld().p

今天看到一个网站不知道是用什么语言写的

今天看到一个网站不知道是用什么语言写的网站(www.kufangwuyou.com)不知道这是怎么回事一直费解,想换成div+cdd的!

用C语言写解释器(一)——我们的目标

声明 为提高教学质量,我所在的学院正在筹划编写C语言教材.<用C语言写解释器>系列文章经整理后将收入书中"综合实验"一章.因此该系列的文章主要阅读对象定为刚学完C语言的学生(不要求有数据结构等其它知识),所以行文比較罗嗦,请勿见怪.本人水平有限,如有描写叙述不恰当或错误之处请指教!特此声明. 起因 近期,我们学院老师联系我,希望我能提供一段用 C 语言编写的 BASIC 解释器,用于 C 语言课程设计教学.我前段时间也正好着迷于"语言"本身,本就有打算写

如何判断一个网址是由哪种语言写的

一般的情况看页面的后缀名 Server Side Includes 技术,拓展名为.shtml或.html或.htm PHP技术,拓展名为.php JSP技术,拓展名为.jsp或.jsf(JSF技术是JSP技术的拓展) ASP.NET技术,拓展名为.aspx (x 代表extension) ASP技术,拓展名为.asp ColdFusion技术,拓展名为.cfc 好点的网站,一般用资源转向功能(就向JSP中web.xml定义的名字,把HOME转向到home.jsp,就隐藏了拓展名).或者用Apa

C 语言写的爱情诗歌

/* ******************************************* ***** File Name: Love.c ***** Description: Love Story about you and me ***** Author: JPing.Cai ***** Date: 2014-5-10 ***** Last Version: 1.0 * *******************************************/ #include <stdio