原创 C8051F340 BOOTLOADER 固件升级的的实现过程

2011-5-25 21:55 4005 5 14 分类: MCU/ 嵌入式

实现过程:

一:内部flash 的空间划分

0XFFFF

 

保留区

 

应用程序区

 

 

BOOTLOADER可操作区域

 

 

0XF000

 

0X1000

0X1000

 

0X0000

 

二:中断向量软件映射

MCU中断向量分布在复位(0x0000)以后,按规则排布,若改变编译器设置,如51,可改变程序在FLASH中的位置,可改变中断向量起始点,如改到这样0X1000,即:就是将0X0000地址内容映射到0X1000,把0X1000作为一个虚拟的复位地址,编译后,中断向量安装在0X1000后。但是,硬件跳转是不能改变的。就是说中断发生后,仍然进入以0X0000为复位地址的向量表。但是,这个向量表中,不再是直接跳转到中断服务程序,而是需要手动跳转到虚拟中断向量表,再由虚拟中断向量表跳转到中断服务程序。但是其原始向量表可能为空,所以需要加入程序判进行手动跳转到新向量表。
       所以编译的时候,将APP程序中断向量表虚拟,BOOT程序使用原始的向量表。所以任何时候中断发生后,将执行BOOT中断服务程序。在BOOT中断服务程序中判断当前程序是执行BOOT区还是APP区,如果是执行APP区,就跳转到APP中断服务程序即可(入口向量已经规则地排布在0X1000以后)。

51的中断向量排布规则是:  LJMP   3+8*INTERRUPT_VECTOR_NUMBER

图解:

原始地址(向量表)

作用

描述

0000H

RESET

POWER UP ENTRY

0003H

INTERRUPT 0入口

 

000BH

INTERRUPT 1入口

 

0013H

INTERRUPT 2入口

 

虚拟后地址(向量表)

作用

描述

1000H

虚拟复位地址

 

1003H

INTERRUPT 0虚拟入口

进入中断

100BH

INTERRUPT 1虚拟入口

进入中断

注意:中断向量虚拟后,并不是说发生中断程序就转入虚拟后的向量表。而是:中断向量表的实质是一条跳转指令,跳转到相关ISR,虚拟后,这个跳转指令被放在了新的地址,而不是原始默认地址。所以,需要在原始地址处再放一辅助向量表(中断发生后,硬件挑到此处),用于跳转到新的向量表。这个辅助向量表有BOOT区完成。

1:STARTUP.A51文件设置:

;vector_base           EQU     01000h

;vector

                            CSEG    AT      03h

                            LJMP    vect + 03h            ;// 0 外部中断0 (/INT0)

;user_address     EQU     01000h

user_process:

                            LJMP    vect;user_address

                            CSEG    AT      0bh

                            LJMP    vect + 0bh            ;// 1 定时器0溢出

                            CSEG    AT      13h

                            LJMP    vect + 013h          ;// 2 外部中断1 (/INT1)

                            CSEG    AT      1bh

                            LJMP    vect + 01bh          ;// 3 定时器1溢出

                            CSEG    AT      23h

                            LJMP    vect + 023h          ;// 4 UART0

                            CSEG    AT      2bh

                            LJMP    vect + 02bh          ;// 5 定时器2溢出

                            CSEG    AT      33h

                            LJMP    vect + 033h          ;// 6 SPI0

                            CSEG    AT      3bh

                            LJMP    vect + 03bh          ;// 7 SMB0

                            CSEG    AT      43h

                            LJMP    vect + 043h          ;// 8 USB0

                            CSEG    AT      4bh

                            LJMP    vect + 04bh          ;// 9 ADC0窗口比较

                            CSEG    AT      53h

                            LJMP    vect + 053h          ;// 10 ADC0转换结束

                            CSEG    AT      5bh

                            LJMP    vect + 05bh          ;// 11 可编程计数器阵列

                            CSEG    AT      63h

                            LJMP    vect + 063h          ;// 12 比较器0 

                            CSEG    AT      6bh

                            LJMP    vect + 06bh          ;// 13 比较器1

                            CSEG    AT      73h

                            LJMP    vect + 073h          ;// 14 定时器3溢出

                            CSEG    AT      7bh

                            LJMP    vect + 07bh          ;// 15 VBUS电平

                            CSEG    AT      83h

                            LJMP    vect + 083h          ;// 16 UART1

                CSEG    AT      000h

?C_STARTUP:     LJMP    STARTUP1

 

2:应用程序区工程设置:

 

 

 

 

 

 

3:bootloader程序和 APP 应用程序的初始化时钟必须是一致的, 否则容易造成死机的现象

三:BOOTLOADER 程序

1:主程序的编写

main(void)

{

       uint8 uartRX;

        uint16 timeout;

        void (*boot)( void);

        Sys_Clk_Init();  // 初始化设备                 

        PORT_Init();                       

        UART0_Init();

        FLSCL = 0x86;

        if (1) {

             Uart_Print("\n");

             Uart_Print("**************BootLoader v1.0***************\n");

             Uart_Print(">Please press 's' to start programming.\n");

         while (1)

         {

           for(timeout=0;timeout<4000;timeout++)

             {

                    if(RI0)

                     {

                        uartRX=SBUF0;

                      RI0=0;

                            break;

                     }

                     delay_ms(10);

              }

          if (uartRX=='s')

          {RTload();    

              uartRX = 0; 

            }

              else if(vect == 0x02)

                     {

                            goto USE_CODE;

                     }

          }

  }

USE_CODE:

       user_process();

       while(1)

       {

       }

2:片内FLASH的 操作

unsigned char FLASH_ByteRead (FLADDR addr)

{

   bit EA_SAVE = EA;               

   char code * data pread;           

   unsigned char byte;

   EA = 0;                           

   pread = (char code *) addr;

   byte = *pread;                     

   EA = EA_SAVE;                      

   return byte;

}

 

void FLASH_ByteWrite (FLADDR addr, char byte)

{

   bit EA_SAVE = EA;               

   char xdata * data pwrite;       

   EA = 0;                           

   pwrite = (char xdata *) addr;

   PFE0CN = PFE0CN & 0xFE;            

   PSCTL  = 0x01;                  

   FLKEY  = 0xA5;                  

   FLKEY  = 0xF1;                 

   *pwrite = byte;                  

   PSCTL = 0;                   

   EA = EA_SAVE;                      

}

void FLASH_PageErase (FLADDR addr)

{

   bit EA_SAVE = EA;                

   char xdata * data pwrite;         

   EA = 0;                         

   pwrite = (char xdata *) addr;

   FLKEY  = 0xA5;                    

   FLKEY  = 0xF1;                    

   PSCTL  = 0x03;                 

   *pwrite = 0;                      

   PSCTL = 0;                  

   EA = EA_SAVE;                 

}

 

可以正常使用串口更新程序, 有需要的, 可以给我留言,一起起步!

 

PARTNER CONTENT

文章评论9条评论)

登录后参与讨论

用户377235 2016-6-21 09:47

你好,可以发一份升级程序和电路图给我吗?万分感激。707051284@qq.com

用户3733014 2016-4-5 13:45

你好!怎么称呼你,我是陈晓奇,这位朋友我目前也正在研究如何通过串口IAP升级源程序的,搞了好久始终没有弄出来,我这边想请求你,能否帮助一下我处理这方面的事情,我的邮箱是76449518@qq.com

用户377235 2015-8-4 16:05

请问有固件升级源程序吗,发麻烦发给我一份,谢谢!我的联系方式:yuanyuhua@163.com

用户1810322 2015-1-27 14:53

你好!我正在学习IAP升级,希望高手发一份完整的资料和相关的代码学习一下,谢谢!邮箱:410621347@qq.com

用户377235 2013-6-8 09:05

我正在做c8051f340的串口升级,没有用到中断向量的映射,看了你的方法,感觉挺好的,能给我发个完整的程序借鉴下吗,谢谢!邮箱:282679163@qq.com

用户377235 2013-3-7 13:43

非常感谢!!!!

用户1630181 2012-12-18 10:14

能否支持I2c和usb的呢? xzf20082004@163.com ,求一份

用户377235 2012-11-27 17:41

我完全搞不懂 c基础不是特别好 现在好迷茫 现在要完成c8051f060的flash升级好吃力 邮箱807812858@qq.com 希望前辈能多多指点 告知现在应怎么学习

用户378258 2011-9-26 14:37

lz有完整程序吗,我正在做cc2430的串口升级,希望能够借鉴一下,可以发我一份吗?谢谢,邮箱:abel89@126.com
相关推荐阅读
用户349783 2011-05-25 22:24
激光条码扫描器详细工作原理
激光条码扫描器详细工作原理 激光条码扫描器由于其独有的大景深区域、高扫描速度、宽扫描范围等突出优点得到了广泛的使用。另外,激光全角度激光条码扫描器由于能够高速扫描识读任意方向通过的条码符号,被大量使用...
用户349783 2011-05-25 21:53
条码扫描器(Bar Code Reader)
条码扫描器又称为条码阅读器、条码扫描枪、条形码扫描器、条形码扫描枪及条形码阅读器都是一回事,只是习惯叫法不同。它是用于读取条码所包含信息的阅读设备,利用光学原理,把条形码的内容解码后通过数据线或者无线...
用户349783 2011-05-19 22:12
字节对齐的相关说明 __align
一.什么是字节对齐,为什么要对齐?  现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,...
用户349783 2011-05-18 22:38
华为发展史
第一条(追求)华为的追求是在电子信息领域实现顾客的梦想,并依靠点点滴滴、锲  而不舍的艰苦追求,使我们成为世界级领先企业。核心价值观的第一条是解决华为公司追求什么。现在社会上最流行的一句话是追求企业的...
用户349783 2011-04-23 16:32
电子工程师职业生涯规划
[1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行业深入了解...
EE直播间
更多
我要评论
9
5
关闭 站长推荐上一条 /3 下一条